ZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvcG9tLnhtbCBiL3Rlc3RzL2UyZS1jbGllbnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQ3YjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9wb20ueG1sCkBAIC0wLDAgKzEsMjI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZTJlLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1lMmUtY2xpZW50PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBFMkUgQ2xpZW50IHRlc3RzPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrQ291bnQ+MTwvZm9ya0NvdW50PgorICAgICAgICAgICAgICAgICAgICA8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4KKyAgICAgICAgICAgICAgICAgICAgPGVuYWJsZUFzc2VydGlvbnM+ZmFsc2U8L2VuYWJsZUFzc2VydGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12YzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtZnJlZW1hcmtlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtbXVzdGFjaGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb24xPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW1veHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLXByb2Nlc3Npbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLXNzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYXBhY2hlLWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ3JpenpseS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWpldHR5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktamRrLWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2F1dGgxLXNpZ25hdHVyZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2F1dGgxLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2F1dGgxLXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2F1dGgyLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtndWF2YS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+eG1sdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbHVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+eGRrPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gZG8gbm90IHVzZSBzZWN1cml0eSBtYW5hZ2VyIGZvciB4ZGsgLS0+CisgICAgICAgICAgICAgICAgPHN1cmVmaXJlLnNlY3VyaXR5LmFyZ2xpbmUgLz4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2UgaXQncyBub3Qgd29ya2luZyB3aXRoIDxmb3JrTW9kZT5hbHdheXM8L2Zvcms+ICg8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4gcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2ppcmEuc29uYXJzb3VyY2UuY29tL2Jyb3dzZS9TT05BUkpBVkEtNzI4IChodHRwczovL2dpdGh1Yi5jb20vU29uYXJTb3VyY2Uvc29uYXItamF2YS9wdWxsLzMyNCkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzIGNvbWJpbmUuc2VsZj0ib3ZlcnJpZGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisKKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9BYm9ydFJlc3BvbnNlQ2xpZW50VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQWJvcnRSZXNwb25zZUNsaWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzEyYTNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQWJvcnRSZXNwb25zZUNsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBhYm9ydGluZyB0aGUgcmVxdWVzdCBvbiB0aGUgY2xpZW50IHNpZGUuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQWJvcnRSZXNwb25zZUNsaWVudFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0QWJvcnQoKSB7CisKKyAgICAgICAgZmluYWwgRGF0ZSBkYXRlID0gZ2V0RGF0ZSgpOworCisgICAgICAgIENsaWVudFJlcXVlc3RGaWx0ZXIgb3V0RmlsdGVyID0gbmV3IENsaWVudFJlcXVlc3RGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgTmV3Q29va2llIGNvb2tpZTEgPSBuZXcgTmV3Q29va2llKCJjb29raWUxIiwgImNvb2tpZTEiKTsKKyAgICAgICAgICAgICAgICBOZXdDb29raWUgY29va2llMiA9IG5ldyBOZXdDb29raWUoImNvb2tpZTIiLCAiY29va2llMiIpOworICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzcG9uc2Uub2soKS5jb29raWUoY29va2llMSkuY29va2llKGNvb2tpZTIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJoZWFkMSIsICJoZWFkMSIpLmhlYWRlcihIdHRwSGVhZGVycy5EQVRFLCBkYXRlKS5oZWFkZXIoSHR0cEhlYWRlcnMuRVRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiMTIzNDY1XCIiKS5oZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9MQU5HVUFHRSwgImxhbmd1YWdlIikuaGVhZGVyKEh0dHBIZWFkZXJzLkxBU1RfTU9ESUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUpLmhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgOTkpLnR5cGUoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvY2F0aW9uKFVSSS5jcmVhdGUoInd3dy5vcmFjbGUuY29tIikpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICAvLyBhYm9ydCB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgIGNvbnRleHQuYWJvcnRXaXRoKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgaW5GaWx0ZXIgPSBuZXcgQ2xpZW50UmVzcG9uc2VGaWx0ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE5ld0Nvb2tpZT4gbWFwID0gcmVzcG9uc2VDb250ZXh0LmdldENvb2tpZXMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNvb2tpZTEiLCBtYXAuZ2V0KCJjb29raWUxIikuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb29raWUyIiwgbWFwLmdldCgiY29va2llMiIpLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImhlYWQxIiwgaGVhZGVycy5nZXQoImhlYWQxIikuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZS5nZXRUaW1lKCksIHJlc3BvbnNlQ29udGV4dC5nZXREYXRlKCkuZ2V0VGltZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIob3V0RmlsdGVyKS5yZWdpc3RlcihpbkZpbHRlcik7CisgICAgICAgIEludm9jYXRpb24gaSA9IHRhcmdldC5yZXF1ZXN0KCkuYnVpbGRHZXQoKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IGkuaW52b2tlKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWFkMSIsIHIuZ2V0SGVhZGVyU3RyaW5nKCJoZWFkMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb29raWUxIiwgci5nZXRDb29raWVzKCkuZ2V0KCJjb29raWUxIikuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29va2llMiIsIHIuZ2V0Q29va2llcygpLmdldCgiY29va2llMiIpLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZS5nZXRUaW1lKCksIHIuZ2V0RGF0ZSgpLmdldFRpbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTIzNDY1Iiwgci5nZXRFbnRpdHlUYWcoKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsYW5ndWFnZSIsIHIuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGUuZ2V0VGltZSgpLCByLmdldExhc3RNb2RpZmllZCgpLmdldFRpbWUoKSk7CisgICAgICAgIC8vIEFzc2VydC5hc3NlcnRFcXVhbHMoInVyaSIsIHIuZ2V0TGluaygibGluayIpKTsgVE9ETzogbm90IHN1cHBvcnRlZCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3d3cub3JhY2xlLmNvbSIsIHIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5OSwgci5nZXRMZW5ndGgoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBEYXRlIGdldERhdGUoKSB7CisgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgMjAxMik7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTU9OVEgsIDcpOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCwgMSk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuSE9VUiwgMTApOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTlVURSwgNSk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuU0VDT05ELCAxKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7CisgICAgICAgIHJldHVybiBjYWwuZ2V0VGltZSgpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAidGhpcyB3aWxsIG5ldmVyIGJlIGNhbGxlZC4iOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9CYXNpY0NsaWVudFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0Jhc2ljQ2xpZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmFkYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9CYXNpY0NsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQXN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50QXN5bmNFeGVjdXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgc3RhdGljIGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHkudGV4dDsKKworLyoqCisgKiBUZXN0cyBzeW5jIGFuZCBhc3luYyBjbGllbnQgaW52b2NhdGlvbnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEJhc2ljQ2xpZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIC8vICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21FeGVjdXRvcnNBc3luYygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGplcnNleUNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgamVyc2V5Q29uZmlnLnJlZ2lzdGVyKEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIuY2xhc3MpLnJlZ2lzdGVyKFRocmVhZEludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGplcnNleUNvbmZpZyk7CisgICAgICAgIHJ1bkN1c3RvbUV4ZWN1dG9yVGVzdEFzeW5jKGNsaWVudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tRXhlY3V0b3JzSW5zdGFuY2VBc3luYygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGplcnNleUNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgamVyc2V5Q29uZmlnLnJlZ2lzdGVyKG5ldyBDdXN0b21FeGVjdXRvclByb3ZpZGVyKCkpLnJlZ2lzdGVyKFRocmVhZEludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGplcnNleUNvbmZpZyk7CisgICAgICAgIHJ1bkN1c3RvbUV4ZWN1dG9yVGVzdEFzeW5jKGNsaWVudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tRXhlY3V0b3JzU3luYygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGplcnNleUNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgamVyc2V5Q29uZmlnLnJlZ2lzdGVyKEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIuY2xhc3MpLnJlZ2lzdGVyKFRocmVhZEludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGplcnNleUNvbmZpZyk7CisgICAgICAgIHJ1bkN1c3RvbUV4ZWN1dG9yVGVzdFN5bmMoY2xpZW50KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21FeGVjdXRvcnNJbnN0YW5jZVN5bmMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIENsaWVudENvbmZpZyBqZXJzZXlDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGplcnNleUNvbmZpZy5yZWdpc3RlcihuZXcgQ3VzdG9tRXhlY3V0b3JQcm92aWRlcigpKS5yZWdpc3RlcihUaHJlYWRJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChqZXJzZXlDb25maWcpOworICAgICAgICBydW5DdXN0b21FeGVjdXRvclRlc3RTeW5jKGNsaWVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bkN1c3RvbUV4ZWN1dG9yVGVzdEFzeW5jKENsaWVudCBjbGllbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQXN5bmNJbnZva2VyIGFzeW5jID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmFzeW5jKCk7CisKKyAgICAgICAgRnV0dXJlPFJlc3BvbnNlPiBmMSA9IGFzeW5jLnBvc3QodGV4dCgicG9zdCIpKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBmMS5nZXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjdXN0b20tYXN5bmMtcmVxdWVzdC1wb3N0IiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuQ3VzdG9tRXhlY3V0b3JUZXN0U3luYyhDbGllbnQgY2xpZW50KSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QodGV4dCgicG9zdCIpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RTYW1lKCJjdXN0b20tYXN5bmMtcmVxdWVzdC1wb3N0IiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NsaWVudEludm9jYXRpb24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIik7CisKKyAgICAgICAgRnV0dXJlPFJlc3BvbnNlPiBmMSA9IHJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLnBvc3QodGV4dCgicG9zdDEiKSk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gZjEuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdDEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIEZ1dHVyZTxTdHJpbmc+IGYyID0gcmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkucG9zdCh0ZXh0KCJwb3N0MiIpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3QyIiwgZjIuZ2V0KCkpOworCisgICAgICAgIEZ1dHVyZTxMaXN0PEpheGJTdHJpbmc+PiBmMyA9IHJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxKYXhiU3RyaW5nPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiYSIsICJiIiwgImMiKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIGYzLmdldCgpLnN0cmVhbSgpLm1hcChpbnB1dCAtPiBpbnB1dC52YWx1ZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b1N0cmluZygpKTsKKworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGZ1dHVyZTEgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICBmaW5hbCBUZXN0Q2FsbGJhY2s8UmVzcG9uc2U+IGMxID0gbmV3IFRlc3RDYWxsYmFjazxSZXNwb25zZT4oZnV0dXJlMSkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvY2VzcyhSZXNwb25zZSByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICByZXNvdXJjZS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KHRleHQoInBvc3QiKSwgYzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3QiLCBmdXR1cmUxLmdldCgpKTsKKworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGZ1dHVyZTIgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICBmaW5hbCBUZXN0Q2FsbGJhY2s8U3RyaW5nPiBjMiA9IG5ldyBUZXN0Q2FsbGJhY2s8U3RyaW5nPihmdXR1cmUyKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzKFN0cmluZyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICByZXNvdXJjZS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KHRleHQoInBvc3QiKSwgYzIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3QiLCBmdXR1cmUyLmdldCgpKTsKKworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGZ1dHVyZTMgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICBmaW5hbCBUZXN0Q2FsbGJhY2s8TGlzdDxKYXhiU3RyaW5nPj4gYzMgPSBuZXcgVGVzdENhbGxiYWNrPExpc3Q8SmF4YlN0cmluZz4+KGZ1dHVyZTMpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3MoTGlzdDxKYXhiU3RyaW5nPiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnN0cmVhbSgpLm1hcChqYXhiU3RyaW5nIC0+IGpheGJTdHJpbmcudmFsdWUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KGMzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoImEiLCAiYiIsICJjIikudG9TdHJpbmcoKSwgZnV0dXJlMy5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDbGllbnRJbnZvY2F0aW9uRXJyb3JSZXNwb25zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGVycm9yUmVzb3VyY2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImVycm9yIik7CisKKyAgICAgICAgRnV0dXJlPFJlc3BvbnNlPiBmMSA9IGVycm9yUmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gZjEuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgRnV0dXJlPFN0cmluZz4gZjIgPSBlcnJvclJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZjIuZ2V0KCk7CisgICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZXguZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoV2ViQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjYXVzZS5nZXRDbGFzcygpKSk7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gKChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgY2F1c2UpLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBGdXR1cmU8TGlzdDxTdHJpbmc+PiBmMyA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZXJyb3JsaXN0IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXN5bmMoKS5nZXQobmV3IEdlbmVyaWNUeXBlPExpc3Q8U3RyaW5nPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmMy5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBleC5nZXRDYXVzZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNhdXNlLmdldENsYXNzKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSAoKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBjYXVzZSkuZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gZnV0dXJlMSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgIGZpbmFsIFRlc3RDYWxsYmFjazxSZXNwb25zZT4gYzEgPSBuZXcgVGVzdENhbGxiYWNrPFJlc3BvbnNlPihmdXR1cmUxKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzKFJlc3BvbnNlIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBlcnJvclJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLmdldChjMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCBmdXR1cmUxLmdldCgpKTsKKworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGZ1dHVyZTIgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICBmaW5hbCBUZXN0Q2FsbGJhY2s8U3RyaW5nPiBjMiA9IG5ldyBUZXN0Q2FsbGJhY2s8U3RyaW5nPihmdXR1cmUyKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzKFN0cmluZyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBlcnJvclJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLmdldChjMik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmdXR1cmUyLmdldCgpOworICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGV4LmdldENhdXNlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2F1c2UuZ2V0Q2xhc3MoKSkpOworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9ICgoV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIGNhdXNlKS5nZXRSZXNwb25zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImVycm9yIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8U3RyaW5nPiBmdXR1cmUzID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgZmluYWwgVGVzdENhbGxiYWNrPExpc3Q8SmF4YlN0cmluZz4+IGMzID0gbmV3IFRlc3RDYWxsYmFjazxMaXN0PEpheGJTdHJpbmc+PihmdXR1cmUzKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzKExpc3Q8SmF4YlN0cmluZz4gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5zdHJlYW0oKS5tYXAoamF4YlN0cmluZyAtPiBqYXhiU3RyaW5nLnZhbHVlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZXJyb3JsaXN0IikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KGMzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZ1dHVyZTMuZ2V0KCk7CisgICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZXguZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoV2ViQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjYXVzZS5nZXRDbGFzcygpKSk7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gKChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgY2F1c2UpLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jQ2xpZW50SW52b2NhdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKTsKKworICAgICAgICBSZXNwb25zZSByMSA9IHJlc291cmNlLnJlcXVlc3QoKS5wb3N0KHRleHQoInBvc3QxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3QxIiwgcjEucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBTdHJpbmcgcjIgPSByZXNvdXJjZS5yZXF1ZXN0KCkucG9zdCh0ZXh0KCJwb3N0MiIpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3QyIiwgcjIpOworCisgICAgICAgIExpc3Q8SmF4YlN0cmluZz4gcjMgPSByZXNvdXJjZS5yZXF1ZXN0KCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PEpheGJTdHJpbmc+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJhIiwgImIiLCAiYyIpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICByMy5zdHJlYW0oKS5tYXAoaW5wdXQgLT4gaW5wdXQudmFsdWUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY0NsaWVudEludm9jYXRpb25FcnJvclJlc3BvbnNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZXJyb3JSZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZXJyb3IiKTsKKworICAgICAgICBSZXNwb25zZSByMSA9IGVycm9yUmVzb3VyY2UucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByMS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCByMS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcnJvclJlc291cmNlLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSBleC5nZXRSZXNwb25zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImVycm9yIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZXJyb3JsaXN0IikucmVxdWVzdCgpLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxTdHJpbmc+PigpIHsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IGV4LmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIC8vIEpFUlNFWS0xNDEyCisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0QXN5bmNSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludm9jYXRpb24gaW52b2NhdGlvbiA9IGFib3J0aW5nVGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkUG9zdCh0ZXh0KCJlbnRpdHkiKSk7CisgICAgICAgIEZ1dHVyZTxTdHJpbmc+IGZ1dHVyZSA9IGludm9jYXRpb24uc3VibWl0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJvcnRlZCIsIGZ1dHVyZS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICAvLyBKRVJTRVktMTQxMgorICAgIHB1YmxpYyB2b2lkIHRlc3RBYm9ydFN5bmNSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludm9jYXRpb24gaW52b2NhdGlvbiA9IGFib3J0aW5nVGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkUG9zdCh0ZXh0KCJlbnRpdHkiKSk7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGludm9jYXRpb24uaW52b2tlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJvcnRlZCIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgV2ViVGFyZ2V0IGFib3J0aW5nVGFyZ2V0KCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKG5ldyBDbGllbnRSZXF1ZXN0RmlsdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY3R4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIFJlc3BvbnNlIHIgPSBSZXNwb25zZS5vaygiYWJvcnRlZCIpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgY3R4LmFib3J0V2l0aChyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBjbGllbnQudGFyZ2V0KCJodHRwOi8vYW55LndlYjo4ODgiKTsKKyAgICB9CisKKyAgICBAQ2xpZW50QXN5bmNFeGVjdXRvcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tRXhlY3V0b3JQcm92aWRlciBleHRlbmRzIFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciBwcm92aWRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXN0b21FeGVjdXRvclByb3ZpZGVyKCkgeworICAgICAgICAgICAgc3VwZXIoImN1c3RvbS1hc3luYy1yZXF1ZXN0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRocmVhZEludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7IC8vIGUuZy4gY3VzdG9tLWFzeW5jLXJlcXVlc3QtMAorICAgICAgICAgICAgZmluYWwgaW50IGxhc3RJbmRleE9mRGFzaCA9IG5hbWUubGFzdEluZGV4T2YoJy0nKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KAorICAgICAgICAgICAgICAgICAgICBuYW1lLnN1YnN0cmluZygwLCBsYXN0SW5kZXhPZkRhc2ggPCAwID8gbmFtZS5sZW5ndGgoKSA6IGxhc3RJbmRleE9mRGFzaCkgKyAiLSIgKyBjb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJlcnJvciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oUmVzcG9uc2Uuc3RhdHVzKDQwNCkudHlwZSgidGV4dC9wbGFpbiIpLmVudGl0eSgiZXJyb3IiKS5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImVycm9ybGlzdCIpCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKQorICAgICAgICBwdWJsaWMgTGlzdDxKYXhiU3RyaW5nPiBnZXRFcnJvckxpc3QoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oUmVzcG9uc2Uuc3RhdHVzKDQwNCkudHlwZSgidGV4dC9wbGFpbiIpLmVudGl0eSgiZXJyb3IiKS5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCisgICAgICAgIHB1YmxpYyBMaXN0PEpheGJTdHJpbmc+IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBKYXhiU3RyaW5nKCJhIiksIG5ldyBKYXhiU3RyaW5nKCJiIiksIG5ldyBKYXhiU3RyaW5nKCJjIikpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFRlc3RDYWxsYmFjazxUPiBpbXBsZW1lbnRzIEludm9jYXRpb25DYWxsYmFjazxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGNvbXBsZXRhYmxlRnV0dXJlOworCisgICAgICAgIFRlc3RDYWxsYmFjayhDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGNvbXBsZXRhYmxlRnV0dXJlKSB7CisgICAgICAgICAgICB0aGlzLmNvbXBsZXRhYmxlRnV0dXJlID0gY29tcGxldGFibGVGdXR1cmU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKFQgcmVzdWx0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlKHByb2Nlc3MocmVzdWx0KSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseSh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgcHJvY2VzcyhUIHJlc3VsdCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgICAgIGlmIChlcnJvci5nZXRDYXVzZSgpIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBjb21wbGV0YWJsZUZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZXJyb3IuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseSgoZXJyb3IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YlN0cmluZyB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgSmF4YlN0cmluZygpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKYXhiU3RyaW5nKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0J1ZmZlcmluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0J1ZmZlcmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjkxZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQnVmZmVyaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3Npbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgY2h1bmsgZW5jb2RpbmcgYW5kIHBvc3NpYmlsaXR5IG9mIGJ1ZmZlcmluZyB0aGUgZW50aXR5LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEJ1ZmZlcmluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcywgTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCdWZmZXJlZChASGVhZGVyUGFyYW0oImNvbnRlbnQtbGVuZ3RoIikgU3RyaW5nIGNvbnRlbnRMZW5naHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJ0cmFuc2Zlci1lbmNvZGluZyIpIFN0cmluZyB0cmFuc2ZlckVuY29kaW5nKSB7CisgICAgICAgICAgICBpZiAodHJhbnNmZXJFbmNvZGluZyAhPSBudWxsICYmIHRyYW5zZmVyRW5jb2RpbmcuZXF1YWxzKCJjaHVua2VkIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImNodW5rZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRMZW5naHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcGFjaGVDb25uZWN0b3IoKSB7CisgICAgICAgIHRlc3RXaXRoQnVmZmVyaW5nKGdldEFwYWNoZUNvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdFdpdGhDaHVua0VuY29kaW5nV2l0aG91dFByb3BlcnR5RGVmaW5pdGlvbihnZXRBcGFjaGVDb25uZWN0b3JDb25maWcoKSk7CisgICAgICAgIHRlc3RXaXRoQ2h1bmtFbmNvZGluZ1dpdGhQcm9wZXJ0eURlZmluaXRpb24oZ2V0QXBhY2hlQ29ubmVjdG9yQ29uZmlnKCkpOworICAgICAgICB0ZXN0V2l0aENodW5rRW5jb2RpbmdQZXJSZXF1ZXN0KGdldEFwYWNoZUNvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdERlZmF1bHRPcHRpb24oZ2V0QXBhY2hlQ29ubmVjdG9yQ29uZmlnKCksIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkNIVU5LRUQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyaXp6bHlDb25uZWN0b3IoKSB7CisgICAgICAgIHRlc3RXaXRoQnVmZmVyaW5nKGdldEdyaXp6bHlDb25uZWN0b3JDb25maWcoKSk7CisgICAgICAgIHRlc3RXaXRoQ2h1bmtFbmNvZGluZ1dpdGhvdXRQcm9wZXJ0eURlZmluaXRpb24oZ2V0R3JpenpseUNvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdFdpdGhDaHVua0VuY29kaW5nV2l0aFByb3BlcnR5RGVmaW5pdGlvbihnZXRHcml6emx5Q29ubmVjdG9yQ29uZmlnKCkpOworICAgICAgICB0ZXN0V2l0aENodW5rRW5jb2RpbmdQZXJSZXF1ZXN0KGdldEdyaXp6bHlDb25uZWN0b3JDb25maWcoKSk7CisgICAgICAgIHRlc3REZWZhdWx0T3B0aW9uKGdldEdyaXp6bHlDb25uZWN0b3JDb25maWcoKSwgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQ0hVTktFRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cFVybENvbm5lY3RvcigpIHsKKyAgICAgICAgdGVzdFdpdGhCdWZmZXJpbmcoZ2V0SHR0cFVybENvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdFdpdGhDaHVua0VuY29kaW5nV2l0aG91dFByb3BlcnR5RGVmaW5pdGlvbihnZXRIdHRwVXJsQ29ubmVjdG9yQ29uZmlnKCkpOworICAgICAgICB0ZXN0V2l0aENodW5rRW5jb2RpbmdXaXRoUHJvcGVydHlEZWZpbml0aW9uKGdldEh0dHBVcmxDb25uZWN0b3JDb25maWcoKSk7CisgICAgICAgIHRlc3RXaXRoQ2h1bmtFbmNvZGluZ1BlclJlcXVlc3QoZ2V0SHR0cFVybENvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdERlZmF1bHRPcHRpb24oZ2V0SHR0cFVybENvbm5lY3RvckNvbmZpZygpLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5CVUZGRVJFRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnRDb25maWcgZ2V0QXBhY2hlQ29ubmVjdG9yQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gbmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsaWVudENvbmZpZyBnZXRHcml6emx5Q29ubmVjdG9yQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gbmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnRDb25maWcgZ2V0SHR0cFVybENvbm5lY3RvckNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRDb25maWcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdERlZmF1bHRPcHRpb24oQ2xpZW50Q29uZmlnIGNjLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZyBtb2RlKSB7CisgICAgICAgIFN0cmluZyBlbnRpdHkgPSBnZXRWZXJ5TG9uZ1N0cmluZygpOworICAgICAgICBtYWtlUmVxdWVzdChjYywgZW50aXR5LCBtb2RlID09IFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkJVRkZFUkVEID8gU3RyaW5nLnZhbHVlT2YoZW50aXR5Lmxlbmd0aCgpKQorICAgICAgICAgICAgICAgIDogImNodW5rZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFdpdGhCdWZmZXJpbmcoQ2xpZW50Q29uZmlnIGNjKSB7CisgICAgICAgIGNjLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORywgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQlVGRkVSRUQpOworICAgICAgICBTdHJpbmcgZW50aXR5ID0gZ2V0VmVyeUxvbmdTdHJpbmcoKTsKKworICAgICAgICBtYWtlUmVxdWVzdChjYywgZW50aXR5LCBTdHJpbmcudmFsdWVPZihlbnRpdHkubGVuZ3RoKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWFrZVJlcXVlc3QoQ2xpZW50Q29uZmlnIGNjLCBTdHJpbmcgZW50aXR5LCBTdHJpbmcgZXhwZWN0ZWQpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKS5idWlsZCgpKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGVudGl0eSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0V2l0aENodW5rRW5jb2RpbmdXaXRoUHJvcGVydHlEZWZpbml0aW9uKENsaWVudENvbmZpZyBjYykgeworICAgICAgICBjYy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkcsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkNIVU5LRUQpOworICAgICAgICBjYy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRSwgMzAwMCk7CisgICAgICAgIFN0cmluZyBlbnRpdHkgPSBnZXRWZXJ5TG9uZ1N0cmluZygpOworCisgICAgICAgIG1ha2VSZXF1ZXN0KGNjLCBlbnRpdHksICJjaHVua2VkIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RXaXRoQ2h1bmtFbmNvZGluZ1dpdGhvdXRQcm9wZXJ0eURlZmluaXRpb24oQ2xpZW50Q29uZmlnIGNjKSB7CisgICAgICAgIGNjLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORywgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQ0hVTktFRCk7CisgICAgICAgIFN0cmluZyBlbnRpdHkgPSBnZXRWZXJ5TG9uZ1N0cmluZygpOworCisgICAgICAgIG1ha2VSZXF1ZXN0KGNjLCBlbnRpdHksICJjaHVua2VkIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNSRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HfSBjYW4gYmUgZGVmaW5lZAorICAgICAqIHBlciByZXF1ZXN0IHdpdGggZGlmZmVyZW50IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVzdFdpdGhDaHVua0VuY29kaW5nUGVyUmVxdWVzdChDbGllbnRDb25maWcgY2MpIHsKKyAgICAgICAgY2MucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5DSFVOS0VEKTsKKworICAgICAgICBjYy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRSwgMzAwMCk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIikuYnVpbGQoKSk7CisKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IGdldFZlcnlMb25nU3RyaW5nKCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImNodW5rZWQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORywgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQlVGRkVSRUQpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoZW50aXR5Lmxlbmd0aCgpKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnlMb25nU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxOyBpKyspIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiaGVsbGxsbGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb291dXV1dXV1dXV1dS4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DYW5jZWxGdXR1cmVDbGllbnRUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DYW5jZWxGdXR1cmVDbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwYWRlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NhbmNlbEZ1dHVyZUNsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbkNhbGxiYWNrOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0cyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBBc3luYyBjbGllbnQgd2hlbiB0aGUge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZX0gaXMgY2FuY2VsbGVkLgorICoKKyAqIDxwPgorICogVGVzdHMsIHRoYXQgaWYgdGhlIGFzeW5jIHJlcXVlc3QgZnV0dXJlIGlzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LAorICogdGhlIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbkNhbGxiYWNrI2NvbXBsZXRlZChPYmplY3QpfSBjYWxsYmFjayBpcyBub3QgaW52b2tlZCBhbmQgdGhhdAorICoge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbn0gaXMgY29ycmVjdGx5IHJldHVybmVkIChhY2NvcmRpbmcgdG8gc3BlYy4pIHRvCisgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjayNmYWlsZWQoVGhyb3dhYmxlKX0gY2FsbGJhY2sgbWV0aG9kLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENhbmNlbEZ1dHVyZUNsaWVudFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNQVhfV0FJVElOR19TRUNPTkRTID0gMkw7CisgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsRnV0dXJlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgRnV0dXJlPFJlc3BvbnNlPiBmdXR1cmUgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KAorICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIltjb21wbGV0ZWQoKV0gY2FsbGJhY2sgd2FzIGludm9rZWQsIGFsdGhvdWdoIHRoZSBGdXR1cmUgc2hvdWxkIGhhdmUgYmVlbiBjYW5jZWxsZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENhbmNlbGxhdGlvbkV4Y2VwdGlvbi5jbGFzcywgdGhyb3dhYmxlLmdldENsYXNzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnREb3duTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGlmICghZnV0dXJlLmNhbmNlbCh0cnVlKSkgeworICAgICAgICAgICAgZmFpbCgiVGhlIEZ1dHVyZSBjb3VsZCBub3QgYmUgY2FuY2VsZWQuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmV2ZW50IHRoZSB0ZXN0IGNvbnRhaW5lciB0byBzdG9wIHRoZSBtZXRob2QgZXhlY3V0aW9uIGJlZm9yZSB0aGUgY2FsbGJhY2tzIGNhbiBiZSByZWFjaGVkLgorICAgICAgICBpZiAoIWNvdW50RG93bkxhdGNoLmF3YWl0KE1BWF9XQUlUSU5HX1NFQ09ORFMgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiQ2FsbGJhY2sgd2FzIG5vdCB0cmlnZ2VyZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0LiIgKyBjb3VudERvd25MYXRjaC5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NodW5rZWRJbnB1dFN0cmVhbUNsb3NlZFByZW1hdHVyZWx5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2h1bmtlZElucHV0U3RyZWFtQ2xvc2VkUHJlbWF0dXJlbHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmNWMzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NodW5rZWRJbnB1dFN0cmVhbUNsb3NlZFByZW1hdHVyZWx5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LlJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUmVhZGVyV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuU2V0dGFibGVGdXR1cmU7CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI3MDUuIENsaWVudCBzaWRlIGVudGl0eSBJbnB1dFN0cmVhbSBleGNlcHRpb24KKyAqIGluIGNodW5rZWQgbW9kZSBzaG91bGQgbm90IGxlYWQgdG8gdGhlIHNhbWUgYmVoYXZpb3Igb24gdGhlIHNlcnZlciBzaWRlLAorICogYXMgaWYgbm8gZXhjZXB0aW9uIG9jY3VycmVkIGF0IGFsbC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENodW5rZWRJbnB1dFN0cmVhbUNsb3NlZFByZW1hdHVyZWx5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ2h1bmtlZElucHV0U3RyZWFtQ2xvc2VkUHJlbWF0dXJlbHlUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhjZXB0aW9uIE5PX0VYQ0VQVElPTiA9IG5ldyBFeGNlcHRpb24oIk5vIGV4Y2VwdGlvbi4iKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgTkVYVF9SRVFfSUQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRX0lEX1BBUkFNX05BTUUgPSAidGVzdC1yZXEtaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCWVRFU19UT19TRU5EID0gMTAyNCAqIDEwMjQgKyAxMzsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJUaHJvd2FibGVSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkIiwgIkphdmFEb2MifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIFNldHRhYmxlRnV0dXJlPEV4Y2VwdGlvbj4+IFJFUVVFU1RfTUFQID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgICAgICBAUXVlcnlQYXJhbShSRVFfSURfUEFSQU1fTkFNRSkKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVxSWQ7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICBpbnQgcmVhZFRvdGFsID0gMDsKKworICAgICAgICAgICAgRXhjZXB0aW9uIHRocm93biA9IE5PX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IHJlYWQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gaXMucmVhZChidWZmZXIpKSA+IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRUb3RhbCArPSByZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93biA9IGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWdldEZ1dHVyZUZvcihyZXFJZCkuc2V0KHRocm93bikpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCBzdHJlYW0gcHJvY2Vzc2luZyBleGNlcHRpb24gaW50byB0aGUgc2V0dGFibGUgZnV0dXJlIGluc3RhbmNlIGZvciByZXF1ZXN0IGlkICIgKyByZXFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93bik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHJlYWRUb3RhbCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiL3JlcXVlc3RXYXNNYWRlIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgQm9vbGVhbiBnZXRSZXF1ZXN0V2FzTWFkZSgpIHsKKyAgICAgICAgICAgIC8vIGFkZCBhIG5ldyBmdXR1cmUgZm9yIHRoZSByZXF1ZXN0IGlmIG5vdCB0aGVyZSB5ZXQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdpdGggUE9TVCBwcm9jZXNzaW5nCisgICAgICAgICAgICBmaW5hbCBTZXR0YWJsZUZ1dHVyZTxFeGNlcHRpb24+IGVzZiA9IGdldEZ1dHVyZUZvcihyZXFJZCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIHVwIHRvIHRocmVlIHNlY29uZCBmb3IgYSByZXF1ZXN0IHRvIGJlIG1hZGU7CisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsdWUsIGlmIHNldC4uLgorICAgICAgICAgICAgICAgIHJldHVybiBlc2YuZ2V0KDMsIFRpbWVVbml0LlNFQ09ORFMpICE9IG51bGw7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IFRpbWVvdXRFeGNlcHRpb24gfCBFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCJQb3N0IHJlcXVlc3QgcHJvY2Vzc2luZyBoYXMgdGltZWQgb3V0IGZvciByZXF1ZXN0IGlkICIgKyByZXFJZCwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiL3JlcXVlc3RDYXVzZWRFeGNlcHRpb24iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBCb29sZWFuIGdldFJlcXVlc3RDYXVzZWRFeGNlcHRpb24oKSB7CisgICAgICAgICAgICBmaW5hbCBTZXR0YWJsZUZ1dHVyZTxFeGNlcHRpb24+IGVzZiA9IGdldEZ1dHVyZUZvcihyZXFJZCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBlc2YuZ2V0KDMsIFRpbWVVbml0LlNFQ09ORFMpICE9IE5PX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHwgRXhlY3V0aW9uRXhjZXB0aW9uIHwgVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oIlBvc3QgcmVxdWVzdCBwcm9jZXNzaW5nIGhhcyB0aW1lZCBvdXQgZm9yIHJlcXVlc3QgaWQgIiArIHJlcUlkLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2V0dGFibGVGdXR1cmU8RXhjZXB0aW9uPiBnZXRGdXR1cmVGb3IoU3RyaW5nIGtleSkgeworICAgICAgICAgICAgZmluYWwgU2V0dGFibGVGdXR1cmU8RXhjZXB0aW9uPiBlc2YgPSBTZXR0YWJsZUZ1dHVyZS5jcmVhdGUoKTsKKyAgICAgICAgICAgIGZpbmFsIFNldHRhYmxlRnV0dXJlPEV4Y2VwdGlvbj4gb2xkRXNmID0gUkVRVUVTVF9NQVAucHV0SWZBYnNlbnQoa2V5LCBlc2YpOworICAgICAgICAgICAgcmV0dXJuIChvbGRFc2YgIT0gbnVsbCkgPyBvbGRFc2YgOiBlc2Y7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORywgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQ0hVTktFRCk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRSwgNyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzYW5pdHkgdGVzdCB0byBjaGVjayB0aGUgbm9ybWFsIHVzZSBjYXNlIGlzIHdvcmtpbmcgYXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnRlcnJ1cHRlZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RSZXFJZCA9IG5leHRSZXF1ZXN0SWQoInRlc3RVbmludGVycnVwdGVkIik7CisKKyAgICAgICAgUmVzcG9uc2UgdGVzdFJlc3BvbnNlID0gdGFyZ2V0KCJ0ZXN0IikucXVlcnlQYXJhbShSRVFfSURfUEFSQU1fTkFNRSwgdGVzdFJlcUlkKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCIwMTIzNDU2Nzg5QUJDREVGIiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuIiwgMjAwLCB0ZXN0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5LiIsICIxNiIsIHRlc3RSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRydWUoIlBPU1QgcmVxdWVzdCAiICsgdGVzdFJlcUlkICsgIiBoYXMgbm90IHJlYWNoZWQgdGhlIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHRhcmdldCgidGVzdCIpLnBhdGgoInJlcXVlc3RXYXNNYWRlIikucXVlcnlQYXJhbShSRVFfSURfUEFSQU1fTkFNRSwgdGVzdFJlcUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoQm9vbGVhbi5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZSgiUE9TVCByZXF1ZXN0ICIgKyB0ZXN0UmVxSWQgKyAiIGhhcyBjYXVzZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gb24gdGhlIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHRhcmdldCgidGVzdCIpLnBhdGgoInJlcXVlc3RDYXVzZWRFeGNlcHRpb24iKS5xdWVyeVBhcmFtKFJFUV9JRF9QQVJBTV9OQU1FLCB0ZXN0UmVxSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChCb29sZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHNpbXVsYXRlcyBob3cgSmVyc2V5IENsaWVudCBzaG91bGQgYmVoYXZlIGFmdGVyIEpFUlNFWS0yNzA1IGdldHMgZml4ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB0ZXN0IGZhaWxzIHRvIGV4ZWN1dGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0ZWRKZXJzZXlIdHRwVXJsQ29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0UmVxSWQgPSBuZXh0UmVxdWVzdElkKCJ0ZXN0SW50ZXJydXB0ZWRKZXJzZXlIdHRwVXJsQ29ubmVjdGlvbiIpOworCisgICAgICAgIFVSTCBwb3N0VXJsID0gVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aCgidGVzdCIpLnF1ZXJ5UGFyYW0oUkVRX0lEX1BBUkFNX05BTUUsIHRlc3RSZXFJZCkuYnVpbGQoKS50b1VSTCgpOworICAgICAgICBmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSBwb3N0VXJsLm9wZW5Db25uZWN0aW9uKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU0pOworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0Q2h1bmtlZFN0cmVhbWluZ01vZGUoMTAyNCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtID0gY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIFJlYWRlcldyaXRlci53cml0ZVRvKG5ldyBFeGNlcHRpb25UaHJvd2luZ0lucHV0U3RyZWFtKEJZVEVTX1RPX1NFTkQpLCBlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIFByb2Nlc3NpbmdFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIHNvIGZhciBzbyBnb29kCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBzaG91bGQgbWFrZSBpdCB0byB0aGUgc2VydmVyLCBidXQgdGhlcmUgdGhlIGV4Y2VwdGlvbmFsIGJlaGF2aW91ciBzaG91bGQgZ2V0IG5vdGljZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUE9TVCByZXF1ZXN0ICIgKyB0ZXN0UmVxSWQgKyAiIGhhcyBub3QgcmVhY2hlZCB0aGUgc2VydmVyLiIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0IikucGF0aCgicmVxdWVzdFdhc01hZGUiKS5xdWVyeVBhcmFtKFJFUV9JRF9QQVJBTV9OQU1FLCB0ZXN0UmVxSWQpLnJlcXVlc3QoKS5nZXQoQm9vbGVhbi5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKCJQT1NUIHJlcXVlc3QgIiArIHRlc3RSZXFJZCArICIgZGlkIG5vdCBjYXVzZSBhbiBleHBlY3RlZCBleGNlcHRpb24gb24gdGhlIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHRhcmdldCgidGVzdCIpLnBhdGgoInJlcXVlc3RDYXVzZWRFeGNlcHRpb24iKS5xdWVyeVBhcmFtKFJFUV9JRF9QQVJBTV9OQU1FLCB0ZXN0UmVxSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChCb29sZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHJlcHJvZHVjZXMgdGhlIEplcnNleSBDbGllbnQgYmVoYXZpb3IgcmVwb3J0ZWQgaW4gSkVSU0VZLTI3MDUuCisgICAgICovCisgICAgQElnbm9yZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVycnVwdGVkSmVyc2V5Q2xpZW50KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFJlcUlkID0gbmV4dFJlcXVlc3RJZCgidGVzdEludGVycnVwdGVkSmVyc2V5Q2xpZW50Iik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldCgidGVzdCIpLnF1ZXJ5UGFyYW0oUkVRX0lEX1BBUkFNX05BTUUsIHRlc3RSZXFJZCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEV4Y2VwdGlvblRocm93aW5nSW5wdXRTdHJlYW0oQllURVNfVE9fU0VORCksIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU0pKTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBQcm9jZXNzaW5nRXhjZXB0aW9uIGhhcyBub3QgYmVlbiB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIHNvIGZhciBzbyBnb29kCisgICAgICAgIH0KKyAgICAgICAgLy8gd2Ugc2hvdWxkIG1ha2UgaXQgdG8gdGhlIHNlcnZlciwgYnV0IHRoZXJlIHRoZSBleGNlcHRpb25hbCBiZWhhdmlvdXIgc2hvdWxkIGdldCBub3RpY2VkCisgICAgICAgIGFzc2VydFRydWUoIlBPU1QgcmVxdWVzdCAiICsgdGVzdFJlcUlkICsgIiBoYXMgbm90IHJlYWNoZWQgdGhlIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHRhcmdldCgidGVzdCIpLnBhdGgoInJlcXVlc3RXYXNNYWRlIikucXVlcnlQYXJhbShSRVFfSURfUEFSQU1fTkFNRSwgdGVzdFJlcUlkKS5yZXF1ZXN0KCkuZ2V0KEJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUE9TVCByZXF1ZXN0ICIgKyB0ZXN0UmVxSWQgKyAiIGRpZCBub3QgY2F1c2UgYW4gZXhwZWN0ZWQgZXhjZXB0aW9uIG9uIHRoZSBzZXJ2ZXIuIiwKKyAgICAgICAgICAgICAgICB0YXJnZXQoInRlc3QiKS5wYXRoKCJyZXF1ZXN0Q2F1c2VkRXhjZXB0aW9uIikucXVlcnlQYXJhbShSRVFfSURfUEFSQU1fTkFNRSwgdGVzdFJlcUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoQm9vbGVhbi5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuZXh0UmVxdWVzdElkKFN0cmluZyB0ZXN0TWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCh0ZXN0TWV0aG9kTmFtZSArICItJTAzZCIsIE5FWFRfUkVRX0lELmdldEFuZEluY3JlbWVudCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyAicmVhZGluZyIgYXMgbWFueSBieXRlcyBhcyBzcGVjaWZpZWQgYnkgdGhyZXNob2xkIGNvbnN0cnVjdG9yIHBhcmFtZXRlci4KKyAgICAgKiBUaHJvd3MgYW4gSU9FeGNlcHRpb24gaWYgcmVhZCBvcGVyYXRpb24gaXMgYXR0ZW1wdGVkIGFmdGVyIHRoZSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBFeGNlcHRpb25UaHJvd2luZ0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IHRocmVzaG9sZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IG1lIGEgbmV3IHN0cmVhbSB0aGF0IHRocm93cyBleGNlcHRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgdGhpcyBudW1iZXIgb2YgYnl0ZXMgd2lsbCBiZSByZWFkIGFsbCByaWdodAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEV4Y2VwdGlvblRocm93aW5nSW5wdXRTdHJlYW0oaW50IHRocmVzaG9sZCkgeworICAgICAgICAgICAgdGhpcy50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQrKyA8IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIHJldHVybiAnQSc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigic3RyZWFtIGNsb3NlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG9mZnNldCArPSBsZW47CisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgdGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwoYiwgb2ZmLCBvZmYgKyBsZW4sIChieXRlKSAnQScpOworICAgICAgICAgICAgICAgIHJldHVybiBsZW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGNsb3NlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50QnVmZmVyaW5nRGlzYWJsZWRUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRCdWZmZXJpbmdEaXNhYmxlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTIxODY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50QnVmZmVyaW5nRGlzYWJsZWRUZXN0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5IdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCisvKioKKyAqIFRlc3RzIHBvc3NpYmlsaXR5IG9mIGRpc2FibGluZyBidWZmZXJpbmcgb2Ygb3V0Z29pbmcgZW50aXR5IGluCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBDbGllbnRCdWZmZXJpbmdEaXNhYmxlZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTEVOR1RIID0gMjAwMDAwMDAwTDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hVTksgPSAyMDQ4OworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIHBvc3RMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBsb25nIHBvc3QoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgIGxvbmcgY291bnQgPSAwOworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdEJ5dGUgPSB0cnVlOworICAgICAgICAgICAgd2hpbGUgKChiID0gaXMucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdEJ5dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RCeXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHBvc3RMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYnVmZmVyaW5nIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHtAbGluayBIdHRwVVJMQ29ubmVjdGlvbn0uIEJ5IGRlZmF1bHQsIHRoZQorICAgICAqIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0gYnVmZmVycyB0aGUgb3V0cHV0IGVudGl0eSBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlCisgICAgICogQ29udGVudC1sZW5ndGggcmVxdWVzdCBhdHRyaWJ1dGUuIFRoaXMgY2F1c2UgcHJvYmxlbXMgZm9yIGxhcmdlIGVudGl0aWVzLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgdGVzdCB1c2VzIHtAbGluayBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIjVVNFX0ZJWEVEX0xFTkdUSF9TVFJFQU1JTkd9IHRvIGVuYWJsZQorICAgICAqIGZpeCBsZW5ndGggc3RyZWFtaW5nIG9uIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZUJ1ZmZlcmluZ1dpdGhGaXhlZExlbmd0aFZpYVByb3BlcnR5KCkgeworICAgICAgICBwb3N0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgLy8gVGhpcyBJUyBzZW5kcyBvdXQgMTAgY2h1bmtzIGFuZCB3YWl0cyB3aGV0aGVyIHRoZXkgd2VyZSByZWNlaXZlZCBvbiB0aGUgc2VydmVyLiBUaGlzIHRlc3RzCisgICAgICAgIC8vIHdoZXRoZXIgdGhlIGJ1ZmZlcmluZyBpcyBkaXNhYmxlZC4KKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRJbnB1dFN0cmVhbSgpOworCisgICAgICAgIGZpbmFsIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlciA9IG5ldyBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIoKTsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgICAgIGNsaWVudENvbmZpZy5wcm9wZXJ0eShIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuVVNFX0ZJWEVEX0xFTkdUSF9TVFJFQU1JTkcsIHRydWUpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2xpZW50Q29uZmlnKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5oZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgsIExFTkdUSCkucG9zdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eS5lbnRpdHkoaXMsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU0pKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgbG9uZyBjb3VudCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkobG9uZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY29udGVudCBsZW5ndGggcmVjZWl2ZWQuIiwgTEVOR1RILCBjb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGJ1ZmZlcmluZyBjYW4gYmUgZGlzYWJsZWQgd2l0aCB7QGxpbmsgSHR0cFVSTENvbm5lY3Rpb259LiBCeSBkZWZhdWx0LCB0aGUKKyAgICAgKiB7QGNvZGUgSHR0cFVSTENvbm5lY3Rpb259IGJ1ZmZlcnMgdGhlIG91dHB1dCBlbnRpdHkgaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZQorICAgICAqIENvbnRlbnQtbGVuZ3RoIHJlcXVlc3QgYXR0cmlidXRlLiBUaGlzIGNhdXNlIHByb2JsZW1zIGZvciBsYXJnZSBlbnRpdGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHRlc3QgdXNlcyB7QGxpbmsgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyI3VzZUZpeGVkTGVuZ3RoU3RyZWFtaW5nKCl9IHRvIGVuYWJsZQorICAgICAqIGZpeCBsZW5ndGggc3RyZWFtaW5nIG9uIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZUJ1ZmZlcmluZ1dpdGhGaXhlZExlbmd0aFZpYU1ldGhvZCgpIHsKKyAgICAgICAgcG9zdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIC8vIFRoaXMgSVMgc2VuZHMgb3V0IDEwIGNodW5rcyBhbmQgd2FpdHMgd2hldGhlciB0aGV5IHdlcmUgcmVjZWl2ZWQgb24gdGhlIHNlcnZlci4gVGhpcyB0ZXN0cworICAgICAgICAvLyB3aGV0aGVyIHRoZSBidWZmZXJpbmcgaXMgZGlzYWJsZWQuCisgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICBmaW5hbCBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yUHJvdmlkZXIgPSBuZXcgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyKCkKKyAgICAgICAgICAgICAgICAudXNlRml4ZWRMZW5ndGhTdHJlYW1pbmcoKTsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjbGllbnRDb25maWcpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZQorICAgICAgICAgICAgICAgID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgTEVOR1RIKS5wb3N0KAorICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5LmVudGl0eShpcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBsb25nIGNvdW50ID0gcmVzcG9uc2UucmVhZEVudGl0eShsb25nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb250ZW50IGxlbmd0aCByZWNlaXZlZC4iLCBMRU5HVEgsIGNvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYnVmZmVyaW5nIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHtAbGluayBIdHRwVVJMQ29ubmVjdGlvbn0uIEJ5IGRlZmF1bHQsIHRoZQorICAgICAqIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0gYnVmZmVycyB0aGUgb3V0cHV0IGVudGl0eSBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlCisgICAgICogQ29udGVudC1sZW5ndGggcmVxdWVzdCBhdHRyaWJ1dGUuIFRoaXMgY2F1c2UgcHJvYmxlbXMgZm9yIGxhcmdlIGVudGl0aWVzLgorICAgICAqIDxwPgorICAgICAqIEluIEplcnNleSAxLnggY2h1bmsgZW5jb2Rpbmcgd2l0aCB7QGNvZGUgSHR0cFVSTENvbm5lY3Rpb259IHdhcyBjYXVzaW5nIGJ1Z3MKKyAgICAgKiB3aGljaCBvY2N1cnJlZCBmcm9tIHRpbWUgdG8gdGltZS4gVGhpcyBsb29rcyB0byBiZSBhIGNhc2UgYWxzbyBpbiBKZXJzZXkgMi54LiBUaGlzIHRlc3QKKyAgICAgKiBoYXMgZmFpbGVkIHVucHJlZGljdGFibHkgb24gc29tZSBtYWNoaW5lcy4gVGhlcmVmb3JlIGl0IGlzIGRpc2FibGVkIG5vdy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJmYWlscyB1bnByZWRpY3RhYmxlIChzZWUgamF2YWRvYykiKQorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQnVmZmVyaW5nV2l0aENodW5rRW5jb2RpbmcoKSB7CisgICAgICAgIHBvc3RMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICAvLyBUaGlzIElTIHNlbmRzIG91dCAxMCBjaHVua3MgYW5kIHdhaXRzIHdoZXRoZXIgdGhleSB3ZXJlIHJlY2VpdmVkIG9uIHRoZSBzZXJ2ZXIuIFRoaXMgdGVzdHMKKyAgICAgICAgLy8gd2hldGhlciB0aGUgYnVmZmVyaW5nIGlzIGRpc2FibGVkLgorICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGdldElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgZmluYWwgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyID0gbmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpCisgICAgICAgICAgICAgICAgLmNodW5rU2l6ZShDSFVOSyk7CisgICAgICAgIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAuY29ubmVjdG9yUHJvdmlkZXIoY29ubmVjdG9yUHJvdmlkZXIpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2xpZW50Q29uZmlnKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaXMsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU0pKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgbG9uZyBjb3VudCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkobG9uZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgY29udGVudCBsZW5ndGggcmVjZWl2ZWQuIiwgTEVOR1RILCBjb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGNudCA9IDA7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgICAgICBpZiAoY250ID4gQ0hVTksgKiAxMCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zdExhdGNoLmF3YWl0KDMgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygid2FpdGluZyBmb3IgY2h1bmsgb24gdGhlIHNlcnZlciBzaWRlIHRpbWUtb3V0ZWQiLCAwLCBwb3N0TGF0Y2guZ2V0Q291bnQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjbnQgPD0gTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYSc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnREZXN0cm95VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50RGVzdHJveVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk3YTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50RGVzdHJveVRlc3QuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBBc3NlcnQgdGhhdCBwcmUgZGVzdHJveSBtZXRob2Qgb24gcHJvdmlkZXJzIGlzIGludm9rZWQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnREZXN0cm95VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gZGVzdHJveWVkID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRlc3Ryb3llZC5jbGVhcigpOworICAgICAgICBkZXN0cm95ZWQucHV0KCJmaWx0ZXIiLCBmYWxzZSk7CisgICAgICAgIGRlc3Ryb3llZC5wdXQoInJlYWRlciIsIGZhbHNlKTsKKyAgICAgICAgZGVzdHJveWVkLnB1dCgiZmVhdHVyZSIsIGZhbHNlKTsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBIZWFkZXJQYXJhbSgiZm9vIikgZmluYWwgU3RyaW5nIGZvbykgeworICAgICAgICAgICAgcmV0dXJuICJyZXNvdXJjZS0iICsgZm9vOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKCJmb28iLCAiYmFyIik7CisgICAgICAgIH0KKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgZGVzdHJveWVkLnB1dCgiZmlsdGVyIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVhZGVyIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKGZpbmFsIFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBlbnRpdHkgPSBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIHJldHVybiAicmVhZGVyLSIgKyBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgZGVzdHJveWVkLnB1dCgicmVhZGVyIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBkZXN0cm95ZWQucHV0KCJmZWF0dXJlIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50SW52b2tlUHJlRGVzdHJveU1ldGhvZE9uUHJvdmlkZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNeUZpbHRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXlSZWFkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE15RmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygicmVhZGVyLXJlc291cmNlLWJhciIpKTsKKworICAgICAgICBjaGVja0Rlc3Ryb3llZChmYWxzZSk7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICBjaGVja0Rlc3Ryb3llZCh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEZXN0cm95ZWQoZmluYWwgYm9vbGVhbiBzaG91bGRCZURlc3Ryb3llZCkgeworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIEJvb2xlYW4+IGVudHJ5IDogZGVzdHJveWVkLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZW50cnkuZ2V0S2V5KCkgKyAgIiBzaG91bGQiICsgKHNob3VsZEJlRGVzdHJveWVkID8gIiIgOiAiIG5vdCIpICsgIiBiZSBkZXN0cm95ZWQiLAorICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZSgpLCBpcyhzaG91bGRCZURlc3Ryb3llZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29MaXN0ZW5lciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIsIENsaWVudExpZmVjeWNsZUxpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIElOSVRJQUxJWkVEID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBDTE9TRUQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geyAvKiBkbyBub3RoaW5nICovIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZSgpIHsKKyAgICAgICAgICAgIENMT1NFRCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Jbml0KCkgeworICAgICAgICAgICAgSU5JVElBTElaRUQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gdG8gY2hlY2sgaWYgY2xvc2luZyB3b3JrcyBhbHNvIGZvciBjbGFzcy1yZWdpc3RlcmVkIHByb3ZpZGVycworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gQ0xPU0VEOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gSU5JVElBTElaRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhckxpc3RlbmVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciwgQ2xpZW50TGlmZWN5Y2xlTGlzdGVuZXIgeworICAgICAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKyAgICAgICAgcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geyAvKiBkbyBub3RoaW5nICovIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Jbml0KCkgeworICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG9uQ2xvc2UoKSB7CisgICAgICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjbG9zZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxpemVkOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYW5vdGhlciB0eXBlIG5lZWRlZCwgYXMgbXVsdGlwbGUgcmVnaXN0cmF0aW9ucyBvZiB0aGUgc2FtZSB0eXBlIGFyZSBub3QgYWxsb3dlZAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFyTGlzdGVuZXIyIGV4dGVuZHMgQmFyTGlzdGVuZXIgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpZmVjeWNsZUxpc3RlbmVyUHJvdmlkZXIoKSB7CisgICAgICAgIGZpbmFsIEplcnNleUNsaWVudEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBKZXJzZXlDbGllbnRCdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIEplcnNleUNsaWVudCBjbGllbnQgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgQmFyTGlzdGVuZXIgZmlsdGVyID0gbmV3IEJhckxpc3RlbmVyKCk7CisgICAgICAgIGZpbmFsIEJhckxpc3RlbmVyIGZpbHRlcjIgPSBuZXcgQmFyTGlzdGVuZXIyKCk7CisKKyAgICAgICAgLy8gQ2xpZW50UnVudGltZSBpbml0aWFsaXplcyBsYXppbHksIHNvIGl0IGlzIGZvcmNlZCBieSBpbnZva2luZyBhIChkdW1teSkgcmVxdWVzdAorICAgICAgICBjbGllbnQucmVnaXN0ZXIoZmlsdGVyMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zdGFuY2UgcmVnaXN0ZXJlZCBpbnRvIGNsaWVudAorICAgICAgICBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucmVnaXN0ZXIoZmlsdGVyKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7ICAgLy8gaW5zdGFuY2UgcmVnaXN0cmF0aW9uIGludG8gdGFyZ2V0CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsdGVyIHdhcyBleHBlY3RlZCB0byBiZSBhbHJlYWR5IGluaXRpYWxpemVkLiIsIGZpbHRlci5pc0luaXRpYWxpemVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWx0ZXIyIHdhcyBleHBlY3RlZCB0byBiZSBhbHJlYWR5IGluaXRpYWxpemVkLiIsIGZpbHRlcjIuaXNJbml0aWFsaXplZCgpKTsKKworICAgICAgICBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucmVnaXN0ZXIoRm9vTGlzdGVuZXIuY2xhc3MpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsgLy8gY2xhc3MgcmVnaXN0cmF0aW9uIGludG8gdGFyZ2V0CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2xhc3MtcmVnaXN0ZXJlZCBmaWx0ZXIgd2FzIGV4cGVjdGVkIHRvIGJlIGFscmVhZHkgaW5pdGlhbGl6ZWQiLCBGb29MaXN0ZW5lci5pc0luaXRpYWxpemVkKCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJDbGFzcy1yZWdpc3RlcmVkIGZpbHRlciB3YXMgZXhwZWN0ZWQgdG8gYmUgc3RpbGwgb3Blbi4iLCBGb29MaXN0ZW5lci5pc0Nsb3NlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkZpbHRlciB3YXMgZXhwZWN0ZWQgdG8gYmUgc3RpbGwgb3Blbi4iLCBmaWx0ZXIuaXNDbG9zZWQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJGaWx0ZXIyIHdhcyBleHBlY3RlZCB0byBiZSBzdGlsbCBvcGVuLiIsIGZpbHRlcjIuaXNDbG9zZWQoKSk7CisKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2xhc3MtcmVnaXN0ZXJlZCBmaWx0ZXIgd2FzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZC4iLCBGb29MaXN0ZW5lci5pc0Nsb3NlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsdGVyIHdhcyBleHBlY3RlZCB0byBiZSBjbG9zZWQuIiwgZmlsdGVyLmlzQ2xvc2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWx0ZXIyIHdhcyBleHBlY3RlZCB0byBiZSBjbG9zZWQuIiwgZmlsdGVyMi5pc0Nsb3NlZCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEVudGl0eUFubm90YXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRFbnRpdHlBbm5vdGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5Mjg4YzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRFbnRpdHlBbm5vdGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyBhbm5vdGF0aW9ucyBvZiBlbnRpdHkgb24gdGhlIGNsaWVudCBzaWRlLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRFbnRpdHlBbm5vdGF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDbGllbnRGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gTXlQcm92aWRlci5jbGFzcy5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICBFbnRpdHk8U3RyaW5nPiBwb3N0ID0gRW50aXR5LmVudGl0eSgidGVzdCIsIE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFLAorICAgICAgICAgICAgICAgIGFubm90YXRpb25zKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5wb3N0KHBvc3QpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBlbnRpdHlBbm5vdGF0aW9ucyA9IHJlcXVlc3RDb250ZXh0LmdldEVudGl0eUFubm90YXRpb25zKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGVudGl0eUFubm90YXRpb25zLmxlbmd0aCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE15UHJvdmlkZXIuY2xhc3MuZ2V0QW5ub3RhdGlvbihQcm92aWRlci5jbGFzcyksIGVudGl0eUFubm90YXRpb25zWzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVByb3ZpZGVyIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRFeGVjdXRvckNsb3NlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50RXhlY3V0b3JDbG9zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmMyZDNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50RXhlY3V0b3JDbG9zZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50RXhlY3V0b3JDbG9zZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBjZGwgPSBuZXcgQ291bnREb3duTGF0Y2goMik7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzY2hlZHVsZXJGb3VuZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBjbG9zaW5nIGEgY2xpZW50IHNodXRzIGRvd24gYSBjb3JyZXNwb25kaW5nIGNsaWVudCBhc3luYyBleGVjdXRvciBzZXJ2aWNlLgorICAgICAqLworICAgIEBUZXN0CisgICAgQElnbm9yZSgiSmVyc2V5IHVzZXMgRm9ya0pvaW4gY29tbW9uIHBvb2wgYnkgZGVmYXVsdCwgd2hpY2ggc2hvdWxkbid0IGJlIGNsb3NlZCB3aGVuIGNsaWVudCBjbG9zZXMuIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VBc3luY0V4ZWN1dG9yKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50RXhlY3V0b3JUaHJlYWRQcmVzZW50KCkpOworICAgICAgICB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFNzZUV2ZW50U291cmNlIGV2ZW50U291cmNlID0gU3NlRXZlbnRTb3VyY2UKKyAgICAgICAgICAgICAgICAudGFyZ2V0KHRhcmdldCgicmVzb3VyY2UvZmFpbCIpKQorICAgICAgICAgICAgICAgIC5yZWNvbm5lY3RpbmdFdmVyeSgxMSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBldmVudFNvdXJjZS5yZWdpc3RlcihTeXN0ZW0ub3V0OjpwcmludGxuKTsKKyAgICAgICAgZXZlbnRTb3VyY2Uub3BlbigpOworICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIGZvciBldmVudFNvdXJjZSB0byBvcGVuIHRpbWUtb3V0ZWQiLCBjZGwuYXdhaXQoNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIGFzc2VydFRydWUoIkNsaWVudCBhc3luYyBleGVjdXRvciB0aHJlYWQgbm90IGZvdW5kLiIsIGNsaWVudEV4ZWN1dG9yVGhyZWFkUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2NoZWR1bGVyIHRocmVhZCBub3QgZm91bmQuIiwgc2NoZWR1bGVyRm91bmQpOworICAgICAgICBjbGllbnQoKS5jbG9zZSgpOworICAgICAgICBhc3NlcnRGYWxzZSgiQ2xpZW50IGFzeW5jIGV4ZWN1dG9yIHRocmVhZCBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgcmVtb3ZlZC4iLAorICAgICAgICAgICAgICAgIGNsaWVudEV4ZWN1dG9yVGhyZWFkUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkNsaWVudCBiYWNrZ3JvdW5kIHNjaGVkdWxlciB0aHJlYWQgc2hvdWxkIGhhdmUgYmVlbiBhbHJlYWR5IHJlbW92ZWQuIiwKKyAgICAgICAgICAgICAgICBjbGllbnRTY2hlZHVsZXJUaHJlYWRQcmVzZW50KCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjbGllbnRFeGVjdXRvclRocmVhZFByZXNlbnQoKSB7CisgICAgICAgIFNldDxUaHJlYWQ+IHRocmVhZHMgPSBUaHJlYWQuZ2V0QWxsU3RhY2tUcmFjZXMoKS5rZXlTZXQoKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZHMuc3RyZWFtKCkubWFwKFRocmVhZDo6Z2V0TmFtZSkuYW55TWF0Y2gobmFtZSAtPiBuYW1lLmNvbnRhaW5zKCJqZXJzZXktY2xpZW50LWFzeW5jLWV4ZWN1dG9yIikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2xpZW50U2NoZWR1bGVyVGhyZWFkUHJlc2VudCgpIHsKKyAgICAgICAgU2V0PFRocmVhZD4gdGhyZWFkcyA9IFRocmVhZC5nZXRBbGxTdGFja1RyYWNlcygpLmtleVNldCgpOworICAgICAgICBmb3IgKFRocmVhZCB0aHJlYWQgOiB0aHJlYWRzKSB7CisgICAgICAgICAgICBpZiAodGhyZWFkLmdldE5hbWUoKS5jb250YWlucygiamVyc2V5LWNsaWVudC1iYWNrZ3JvdW5kLXNjaGVkdWxlciIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuICJIZWxsbyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJmYWlsIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGZhaWwoKSB7CisgICAgICAgICAgICAvLyBzaG91bGQgcmV0dXJuIGZhbHNlIG9uIGZpcnN0IChyZWd1bGFyKSBjb25uZWN0IGFuZCB0cnVlIG9uIHJlY29ubmVjdAorICAgICAgICAgICAgc2NoZWR1bGVyRm91bmQgPSBjbGllbnRTY2hlZHVsZXJUaHJlYWRQcmVzZW50KCk7CisgICAgICAgICAgICBjZGwuY291bnREb3duKCk7CisgICAgICAgICAgICAvLyBzaW11bGF0ZSB1bnN1Y2Nlc3NmdWwgY29ubmVjdCBhdHRlbXB0IC0+IGZvcmNlIHJlY29ubmVjdCAoZXZlbnRTb3VyY2Ugd2lsbCBzdWJtaXQgYSB0YXNrIGludG8gc2NoZWR1bGVyKQorICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1MDMpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRFeGVjdXRvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEV4ZWN1dG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxN2IyYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRFeGVjdXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRBc3luY0V4ZWN1dG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENsaWVudEV4ZWN1dG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIkNsaWVudEV4ZWN1dG9yVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnRFeGVjdXRvclRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhDbGllbnRFeGVjdXRvclRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTdHJpbmcgdGhyZWFkTmFtZSA9IG51bGw7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21FeGVjdXRvclJ4KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICBFeGVjdXRvclNlcnZpY2UgY2xpZW50RXhlY3V0b3IgPQorICAgICAgICAgICAgICAgIEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldE5hbWVGb3JtYXQoIkNsaWVudEV4ZWN1dG9yLSVkIikuYnVpbGQoKSk7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpLmV4ZWN1dG9yU2VydmljZShjbGllbnRFeGVjdXRvcikuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICB0ZXN0UngoY2xpZW50LCBsYXRjaCk7CisKKyAgICAgICAgbGF0Y2guYXdhaXQoMywgVGltZVVuaXQuU0VDT05EUyk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aHJlYWROYW1lKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0aHJlYWROYW1lLCBjb250YWluc1N0cmluZygiQ2xpZW50RXhlY3V0b3IiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEV4ZWN1dG9yUngoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIHRlc3RSeChjbGllbnQsIGxhdGNoKTsKKworICAgICAgICBsYXRjaC5hd2FpdCgzLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0aHJlYWROYW1lKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0aHJlYWROYW1lLCBjb250YWluc1N0cmluZygiamVyc2V5LWNsaWVudC1hc3luYy1leGVjdXRvciIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RXhlY3V0b3JBc3luYygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgdGVzdEFzeW5jKGNsaWVudCwgbGF0Y2gpOworCisgICAgICAgIGxhdGNoLmF3YWl0KDMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRocmVhZE5hbWUpOworICAgICAgICBhc3NlcnRUaGF0KHRocmVhZE5hbWUsIGNvbnRhaW5zU3RyaW5nKCJqZXJzZXktY2xpZW50LWFzeW5jLWV4ZWN1dG9yIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleUN1c3RvbUV4ZWN1dG9yQXN5bmMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKE15RXhlY3V0b3JQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgdGVzdEFzeW5jKGNsaWVudCwgbGF0Y2gpOworCisgICAgICAgIGxhdGNoLmF3YWl0KDMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRocmVhZE5hbWUpOworICAgICAgICBhc3NlcnRUaGF0KHRocmVhZE5hbWUsIGNvbnRhaW5zU3RyaW5nKCJNeUV4ZWN1dG9yUHJvdmlkZXIiKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFJ4KENsaWVudCBjbGllbnQsIENvdW50RG93bkxhdGNoIGxhdGNoKSB7CisgICAgICAgIGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aCgiQ2xpZW50RXhlY3V0b3JUZXN0IikpCisgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTWVzc2FnZUJvZHlSZWFkZXI8Q2xpZW50RXhlY3V0b3JUZXN0PigpIHsKKyAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICBwdWJsaWMgQ2xpZW50RXhlY3V0b3JUZXN0IHJlYWRGcm9tKENsYXNzPENsaWVudEV4ZWN1dG9yVGVzdD4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgICAgICAgICAgICBDbGllbnRFeGVjdXRvclRlc3QudGhpcy50aHJlYWROYW1lID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudEV4ZWN1dG9yVGVzdCgpOworCisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgLnJ4KCkKKyAgICAgICAgICAgICAgLmdldChDbGllbnRFeGVjdXRvclRlc3QuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0QXN5bmMoQ2xpZW50IGNsaWVudCwgQ291bnREb3duTGF0Y2ggbGF0Y2gpIHsKKyAgICAgICAgY2xpZW50LnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJDbGllbnRFeGVjdXRvclRlc3QiKSkKKyAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBNZXNzYWdlQm9keVJlYWRlcjxDbGllbnRFeGVjdXRvclRlc3Q+KCkgeworICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgIHB1YmxpYyBDbGllbnRFeGVjdXRvclRlc3QgcmVhZEZyb20oQ2xhc3M8Q2xpZW50RXhlY3V0b3JUZXN0PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgICAgICAgIENsaWVudEV4ZWN1dG9yVGVzdC50aGlzLnRocmVhZE5hbWUgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50RXhlY3V0b3JUZXN0KCk7CisKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAuYXN5bmMoKQorICAgICAgICAgICAgICAuZ2V0KENsaWVudEV4ZWN1dG9yVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgQENsaWVudEFzeW5jRXhlY3V0b3IKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RXhlY3V0b3JQcm92aWRlciBpbXBsZW1lbnRzIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9CisgICAgICAgICAgICAgICAgRXhlY3V0b3JzCisgICAgICAgICAgICAgICAgICAgICAgICAubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKS5zZXROYW1lRm9ybWF0KCJNeUV4ZWN1dG9yUHJvdmlkZXItJWQiKS5idWlsZCgpKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gZXhlY3V0b3JTZXJ2aWNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgeworICAgICAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRGaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0MjkwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNhY2hlQ29udHJvbDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50RmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUICIKKyAgICAgICAgICAgICAgICAgICAgKyBoZWFkZXJzLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT09LSUUpCisgICAgICAgICAgICAgICAgICAgICsgaGVhZGVycy5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ0FDSEVfQ09OVFJPTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbVJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IGNsaWVudFJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgY2xpZW50UmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCJPSyEiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRm9vUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZmlsdGVyQWJvcnRUZXN0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihDdXN0b21SZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyEiLCBlbnRpdHkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhZGVyUHJvdmlkZXJzUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50UmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBDYWNoZUNvbnRyb2wgY2FjaGVDb250cm9sID0gbmV3IENhY2hlQ29udHJvbCgpOworICAgICAgICAgICAgY2FjaGVDb250cm9sLnNldFByaXZhdGUodHJ1ZSk7CisgICAgICAgICAgICBjbGllbnRSZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkNBQ0hFX0NPTlRST0wsIGNhY2hlQ29udHJvbCk7CisgICAgICAgICAgICBjbGllbnRSZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkNPT0tJRSwgbmV3IENvb2tpZSgiY29va2llIiwgImNvb2tpZS12YWx1ZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZmlsdGVySGVhZGVyUHJvdmlkZXJzVGVzdCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoSGVhZGVyUHJvdmlkZXJzUmVxdWVzdEZpbHRlci5jbGFzcykucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJ0ZXN0IikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoInByaXZhdGUiKSk7CisgICAgICAgIGFzc2VydFRydWUoZW50aXR5LmNvbnRhaW5zKCJjb29raWUtdmFsdWUiKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJT0V4Y2VwdGlvblJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cworICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihJT0V4Y2VwdGlvblJlc3BvbnNlRmlsdGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaW9FeGNlcHRpb25SZXNwb25zZUZpbHRlclRlc3QoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKElPRXhjZXB0aW9uUmVzcG9uc2VGaWx0ZXIuY2xhc3MpLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucGF0aCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJT0V4Y2VwdGlvbi5jbGFzcywgZS5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKElPRXhjZXB0aW9uUmVzcG9uc2VGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpLCBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoY2F1Z2h0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRQYXRoVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50UGF0aFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTA3YmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50UGF0aFRlc3QuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGRlZmluaXRpb24gb2YgcGF0aCBpbiBjbGllbnQgaW52b2NhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50UGF0aFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzLCBUZXN0UmVzb3VyY2VXaXRoUGF0aFBhcmFtcy5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IHtAbGluayBQYXRoUGFyYW0gcGF0aCBwYXJhbWV0ZXJzfSBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBDbGllbnQjdGFyZ2V0KFN0cmluZyl9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhdGhQYXJhbUluVGFyZ2V0VGVzdCgpIHsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudCgpLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDoiICsgZ2V0UG9ydCgpICsgIi90ZXN0L3tiZWdpbkJ5fSIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgiYmVnaW5CeSIsICJhYmMiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC1nZXQsYWJjIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBwYXRoIGNvbmNhdGVuYXRpb24uIChyZWdyZXNzaW9uIHRlc3QgZm9yIEpFUlNFWS0xMTE0KQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGF0aENvbmNhdGVuYXRpb25UZXN0MSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQoKS50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIGdldFBvcnQoKSkucGF0aCgicGF0aCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LXBhdGgiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHBhdGggY29uY2F0ZW5hdGlvbi4gKHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTExMTQpCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXRoQ29uY2F0ZW5hdGlvblRlc3QyKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudCgpLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDoiICsgZ2V0UG9ydCgpKS5wYXRoKCIvcGF0aCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LXBhdGgiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHBhdGggY29uY2F0ZW5hdGlvbi4gKHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTExMTQpCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXRoQ29uY2F0ZW5hdGlvblRlc3QzKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudCgpLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDoiICsgZ2V0UG9ydCgpKS5wYXRoKCIvcGF0aC8iKS5wYXRoKCIvYW5vdGhlci8iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC1hbm90aGVyLXBhdGgiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHBhdGggY29uY2F0ZW5hdGlvbi4gKHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTExMTQpCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXRoQ29uY2F0ZW5hdGlvblRlc3Q0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudCgpLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDoiICsgZ2V0UG9ydCgpKS5wYXRoKCIvcGF0aCIpLnBhdGgoImFub3RoZXIvIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QtYW5vdGhlci1wYXRoIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBwYXRoIGNvbmNhdGVuYXRpb24uIChyZWdyZXNzaW9uIHRlc3QgZm9yIEpFUlNFWS0xMTE0KQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGF0aENvbmNhdGVuYXRpb25UZXN0NigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQoKS50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIGdldFBvcnQoKSArICIvIikucGF0aCgiL3BhdGgvYW5vdGhlciIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LWFub3RoZXItcGF0aCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZXNvdXJjZSBjbGFzcyB3aXRoIHtAbGluayBQYXRoUGFyYW0gcGF0aCBwYXJhbWV0ZXJzKS4KKyAgICAgKgorICAgICAqLworICAgIEBQYXRoKCJ0ZXN0L3tiZWdpbkJ5fSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2VXaXRoUGF0aFBhcmFtcyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSh2YWx1ZSA9ICJiZWdpbkJ5IikgU3RyaW5nIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gInRlc3QtZ2V0LCIgKyBwYXJhbTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZXNvdXJjZSBjbGFzcy4KKyAgICAgKgorICAgICAqLworICAgIEBQYXRoKCJwYXRoIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInRlc3QtcGF0aCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBAUGF0aCgiYW5vdGhlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5vdGhlcigpIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdC1hbm90aGVyLXBhdGgiOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudFByZUluaXRUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRQcmVJbml0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGQ2ODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRQcmVJbml0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlXZWJUYXJnZXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCBwcmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsaWVudC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRQcmVJbml0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQEhlYWRlclBhcmFtKCJmaWx0ZXItcmVxdWVzdCIpIFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAicmVzb3VyY2U6IiArIChoZWFkZXIgPT0gbnVsbCA/ICI8bnVsbD4iIDogaGVhZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNoaWxkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGlsZChASGVhZGVyUGFyYW0oImZpbHRlci1yZXF1ZXN0IikgU3RyaW5nIGhlYWRlcikgeworICAgICAgICAgICAgcmV0dXJuICJjaGlsZDoiICsgKGhlYWRlciA9PSBudWxsID8gIjxudWxsPiIgOiBoZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiZmlsdGVyLXJlcXVlc3QiLCAiY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJmaWx0ZXItcmVzcG9uc2UiLCAiY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxJbnRlZ2VyPiB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbml0aWFsaXplZDsKKworICAgICAgICBwdWJsaWMgVGVzdFJlYWRlcigpIHsKKyAgICAgICAgICAgIFRlc3RSZWFkZXIuaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEludGVnZXIgcmVhZEZyb20oQ2xhc3M8SW50ZWdlcj4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHsKKyAgICAgICAgVGVzdFJlYWRlci5pbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkluaXRpYWxpemVkKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKE15UmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoVGVzdFJlYWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoVGVzdFJlYWRlci5pbml0aWFsaXplZCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc291cmNlUmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVja1Jlc3BvbnNlKHJlc291cmNlUmVzcG9uc2UsICJyZXNvdXJjZTo8bnVsbD4iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShUZXN0UmVhZGVyLmluaXRpYWxpemVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQcmVpbml0aWFsaXplKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoTXlSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjaGlsZFRhcmdldCA9IHRhcmdldC5wYXRoKCJjaGlsZCIpOworICAgICAgICAoKEplcnNleVdlYlRhcmdldCkgY2hpbGRUYXJnZXQpLnByZUluaXRpYWxpemUoKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjaGlsZFRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrUmVzcG9uc2UocmVzcG9uc2UsICJjaGlsZDo8bnVsbD4iKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNvdXJjZVJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2tSZXNwb25zZShyZXNvdXJjZVJlc3BvbnNlLCAicmVzb3VyY2U6PG51bGw+Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV1c2luZ1ByZWluaXRpYWxpemVkQ29uZmlnKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKFRlc3RSZWFkZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihNeVJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgKChKZXJzZXlXZWJUYXJnZXQpIHRhcmdldCkucHJlSW5pdGlhbGl6ZSgpOworICAgICAgICBhc3NlcnRUcnVlKFRlc3RSZWFkZXIuaW5pdGlhbGl6ZWQpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgY2hpbGRUYXJnZXQgPSB0YXJnZXQucGF0aCgiY2hpbGQiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjaGlsZFRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgY2hlY2tSZXNwb25zZShyZXNwb25zZSwgImNoaWxkOjxudWxsPiIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc291cmNlUmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVja1Jlc3BvbnNlKHJlc291cmNlUmVzcG9uc2UsICJyZXNvdXJjZTo8bnVsbD4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXVzaW5nUHJlaW5pdGlhbGl6ZWRDb25maWcyKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKFRlc3RSZWFkZXIuY2xhc3MpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoTXlSZXNwb25zZUZpbHRlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoVGVzdFJlYWRlci5pbml0aWFsaXplZCk7CisgICAgICAgICgoSmVyc2V5Q2xpZW50KSBjbGllbnQpLnByZUluaXRpYWxpemUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShUZXN0UmVhZGVyLmluaXRpYWxpemVkKTsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIik7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjaGlsZFRhcmdldCA9IHRhcmdldC5wYXRoKCJjaGlsZCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNoaWxkVGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2tSZXNwb25zZShyZXNwb25zZSwgImNoaWxkOjxudWxsPiIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc291cmNlUmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVja1Jlc3BvbnNlKHJlc291cmNlUmVzcG9uc2UsICJyZXNvdXJjZTo8bnVsbD4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXNwb25zZShSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImNhbGxlZCIsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXQoImZpbHRlci1yZXNwb25zZSIpLmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVudGl0eSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3Rlck9uUHJlaW5pdGlhbGl6ZWQxKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoTXlSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgKChKZXJzZXlXZWJUYXJnZXQpIHRhcmdldCkucHJlSW5pdGlhbGl6ZSgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoTXlSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2tSZXNwb25zZShyZXNwb25zZSwgInJlc291cmNlOmNhbGxlZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyT25QcmVpbml0aWFsaXplZDIoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihNeVJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgKChKZXJzZXlXZWJUYXJnZXQpIHRhcmdldCkucHJlSW5pdGlhbGl6ZSgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgY2hpbGQgPSB0YXJnZXQucGF0aCgiY2hpbGQiKTsKKyAgICAgICAgY2hpbGQucmVnaXN0ZXIoTXlSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrUmVzcG9uc2UocmVzcG9uc2UsICJyZXNvdXJjZTo8bnVsbD4iKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBjaGlsZFJlc3BvbnNlID0gY2hpbGQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVja1Jlc3BvbnNlKGNoaWxkUmVzcG9uc2UsICJjaGlsZDpjYWxsZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9Gb2xsb3dSZWRpcmVjdEhlYWRUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9Gb2xsb3dSZWRpcmVjdEhlYWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0Y2ExNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0ZvbGxvd1JlZGlyZWN0SGVhZFRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyB0aGF0IGNvbmZpZ3VyYXRpb24gb2Yge0BsaW5rIENsaWVudFByb3BlcnRpZXMjRk9MTE9XX1JFRElSRUNUU30gd29ya3Mgd2hlbiBIRUFEIG1ldGhvZCBpcyB1c2VkLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEZvbGxvd1JlZGlyZWN0SGVhZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoInJlZGlyZWN0IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcmVkaXJlY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDMwMykubG9jYXRpb24oVVJJLmNyZWF0ZSgicmVzb3VyY2UvZmluYWwiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJmaW5hbCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGFmdGVyUmVkaXJlY3Rpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soImZpbmFsLWVudGl0eSIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgZ2V0VGFyZ2V0KGJvb2xlYW4gZm9sbG93UmVkaXJlY3QpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKS5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkZPTExPV19SRURJUkVDVFMsCisgICAgICAgICAgICAgICAgZm9sbG93UmVkaXJlY3QpKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZS9yZWRpcmVjdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRGb2xsb3dSZWRpcmVjdEhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBnZXRUYXJnZXQoZmFsc2UpLnJlcXVlc3QoKS5oZWFkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiL2ZpbmFsIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRGb2xsb3dSZWRpcmVjdEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGdldFRhcmdldChmYWxzZSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi9maW5hbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb2xsb3dSZWRpcmVjdEhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBnZXRUYXJnZXQodHJ1ZSkucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb2xsb3dSZWRpcmVjdEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGdldFRhcmdldCh0cnVlKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImZpbmFsLWVudGl0eSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvRm9sbG93UmVkaXJlY3RzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvRm9sbG93UmVkaXJlY3RzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNjEwYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEZvbGxvd1JlZGlyZWN0c1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVkaXJlY3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZWRpcmVjdCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSByZWRpcmVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZWVPdGhlcihVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShSZWRpcmVjdFJlc291cmNlLmNsYXNzKS5idWlsZCgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZWRpcmVjdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb0ZvbGxvdygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInRlc3QvcmVkaXJlY3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRGb2xsb3coKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInRlc3QvcmVkaXJlY3QiKTsKKyAgICAgICAgdGFyZ2V0LnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUywgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzAzLCB0YXJnZXQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9HZW5lcmljUmVzcG9uc2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9HZW5lcmljUmVzcG9uc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkYWRjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0dlbmVyaWNSZXNwb25zZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQXN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IHtAbGluayBHZW5lcmljVHlwZX0gd2l0aCB7QGxpbmsgUmVzcG9uc2V9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEdlbmVyaWNSZXNwb25zZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBwb3N0KSB7CisgICAgICAgICAgICByZXR1cm4gcG9zdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIEdlbmVyaWNUeXBlPFJlc3BvbnNlPiBnZW5lcmljID0gbmV3IEdlbmVyaWNUeXBlPFJlc3BvbnNlPihSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIEVudGl0eSBlbnRpdHkgPSBFbnRpdHkuZW50aXR5KCJlbnRpdHkiLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSk7CisKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzb3VyY2UiKTsKKyAgICAgICAgU3luY0ludm9rZXIgc3luYyA9IHRhcmdldC5yZXF1ZXN0KCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBzeW5jLnBvc3QoZW50aXR5LCBnZW5lcmljKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZW50aXR5IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1Bvc3QoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEdlbmVyaWNUeXBlPFJlc3BvbnNlPiBnZW5lcmljID0gbmV3IEdlbmVyaWNUeXBlPFJlc3BvbnNlPihSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIEVudGl0eSBlbnRpdHkgPSBFbnRpdHkuZW50aXR5KCJlbnRpdHkiLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSk7CisKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgQXN5bmNJbnZva2VyIGFzeW5jID0gdGFyZ2V0LnJlcXVlc3QoKS5hc3luYygpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYXN5bmMucG9zdChlbnRpdHksIGdlbmVyaWMpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJlbnRpdHkiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgR2VuZXJpY1R5cGU8UmVzcG9uc2U+IGdlbmVyaWMgPSBuZXcgR2VuZXJpY1R5cGU8UmVzcG9uc2U+KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNvdXJjZSIpOworICAgICAgICBTeW5jSW52b2tlciBzeW5jID0gdGFyZ2V0LnJlcXVlc3QoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBzeW5jLmdldChnZW5lcmljKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0dldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgR2VuZXJpY1R5cGU8UmVzcG9uc2U+IGdlbmVyaWMgPSBuZXcgR2VuZXJpY1R5cGU8UmVzcG9uc2U+KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBBc3luY0ludm9rZXIgYXN5bmMgPSB0YXJnZXQucmVxdWVzdCgpLmFzeW5jKCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYXN5bmMuZ2V0KGdlbmVyaWMpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEdlbmVyaWNTdHJpbmcoKSB7CisgICAgICAgIEdlbmVyaWNUeXBlPFN0cmluZz4gZ2VuZXJpYyA9IG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzb3VyY2UiKTsKKyAgICAgICAgU3luY0ludm9rZXIgc3luYyA9IHRhcmdldC5yZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSBzeW5jLmdldChnZW5lcmljKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2V0IiwgZW50aXR5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9IdHRwQXV0aG9yaXphdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0h0dHBBdXRob3JpemF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDgxMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9IdHRwQXV0aG9yaXphdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkJhc2U2NDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5Db25jdXJyZW50UnVubmVyOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogVGVzdHMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgSHR0cEF1dGhvcml6YXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgRGlnZXN0IHsKKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgQmFzaWMgeworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBBbHRlcm5hdGluZyB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWx0ZXJuYXRlcyBiZXR3ZWVuIEJBU0lDIGFuZCBESUdFU1QgKGVhY2ggaXMgdXNlZCBmb3IgMiByZXF1ZXN0cykuCisgICAgICovCisgICAgQEFsdGVybmF0aW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbHRlcm5hdGluZ0RpZ2VzdEJhc2ljRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoKGNvdW50ZXIrKyAvIDIpICUgMiA9PSAwKSB7CisgICAgICAgICAgICAgICAgbmV3IEJhc2ljRmlsdGVyKCkuZmlsdGVyKHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmV3IERpZ2VzdEZpbHRlcigpLmZpbHRlcihyZXF1ZXN0Q29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBARGlnZXN0CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaWdlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhvcml6YXRpb24gPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQVVUSE9SSVpBVElPTik7CisKKyAgICAgICAgICAgIGlmIChhdXRob3JpemF0aW9uICE9IG51bGwgJiYgYXV0aG9yaXphdGlvbi50cmltKCkudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJESUdFU1QiKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2ggPSBQYXR0ZXJuLmNvbXBpbGUoInVzZXJuYW1lPVwiKFteXCJdKylcIiIpLm1hdGNoZXIoYXV0aG9yaXphdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKCFtYXRjaC5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlcm5hbWUgPSBtYXRjaC5ncm91cCgxKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFNlY3VyaXR5Q29udGV4dChuZXcgU2VjdXJpdHlDb250ZXh0KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlcm5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJESUdFU1QiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLnN0YXR1cyg0MDEpLmhlYWRlcihIdHRwSGVhZGVycy5XV1dfQVVUSEVOVElDQVRFLAorICAgICAgICAgICAgICAgICAgICAiRGlnZXN0IHJlYWxtPVwibXktcmVhbG1cIiwgZG9tYWluPVwiXCIsIG5vbmNlPVwibjlpdjNNZVNOa0VmTTN1SnQyZ25CVWFXVWJLQWxqeHBcIiwgYWxnb3JpdGhtPU1ENSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInFvcD1cImF1dGhcIiwgc3RhbGU9ZmFsc2UiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNpYyBBdXRoOiBwYXNzd29yZCBtdXN0IGJlIHRoZSBzYW1lIGFzIHVzZXIgbmFtZSBleGNlcHQgZmlyc3QgbGV0dGVyIGlzIGNhcGl0YWxpemVkLgorICAgICAqIEV4YW1wbGU6IHVzZXJuYW1lICJob21lciIgLT4gIHBhc3N3b3JkICJIb21lciIKKyAgICAgKi8KKyAgICBAQmFzaWMKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhc2ljRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIENoYXJzZXQgQ0hBUkFDVEVSX1NFVCA9IENoYXJzZXQuZm9yTmFtZSgiaXNvLTg4NTktMSIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIX1NDSEVNRV9DQVNFID0gIkF1dGgtU2NoZW1lLUNhc2UiOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgU3RyaW5nIGF1dGhIZWFkZXIgPSByZXF1ZXN0LmdldEhlYWRlcnMoKS5nZXRGaXJzdChIdHRwSGVhZGVycy5BVVRIT1JJWkFUSU9OKTsKKyAgICAgICAgICAgIGlmIChhdXRoSGVhZGVyICE9IG51bGwgJiYgYXV0aEhlYWRlci50cmltKCkudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKCJCQVNJQyIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRlY29kZWQgPSBuZXcgU3RyaW5nKEJhc2U2NC5kZWNvZGUoYXV0aEhlYWRlci5zdWJzdHJpbmcoNikuZ2V0Qnl0ZXMoKSksIENIQVJBQ1RFUl9TRVQpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIFN0cmluZyBkZWNvZGVkID0gQmFzZTY0LmRlY29kZUFzU3RyaW5nKGF1dGhIZWFkZXIuc3Vic3RyaW5nKDYpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzcGxpdCA9IGRlY29kZWQuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlcm5hbWUgPSBzcGxpdFswXTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHdkID0gc3BsaXRbMV07CisgICAgICAgICAgICAgICAgU3RyaW5nIGNhcGl0YWxpemVkVXNlck5hbWUgPSB1c2VybmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHVzZXJuYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FwaXRhbGl6ZWRVc2VyTmFtZS5lcXVhbHMocHdkKSkgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFNlY3VyaXR5Q29udGV4dChuZXcgU2VjdXJpdHlDb250ZXh0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlcm5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQkFTSUMiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdXRoU2NoZW1lQ2FzZSA9IHJlcXVlc3QuZ2V0SGVhZGVyU3RyaW5nKEFVVEhfU0NIRU1FX0NBU0UpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aFNjaGVtZTsKKyAgICAgICAgICAgIGlmICgidXBwZXJjYXNlIi5lcXVhbHMoYXV0aFNjaGVtZUNhc2UpKSB7CisgICAgICAgICAgICAgICAgYXV0aFNjaGVtZSA9ICJCQVNJQyI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJsb3dlcmNhc2UiLmVxdWFscyhhdXRoU2NoZW1lQ2FzZSkpIHsKKyAgICAgICAgICAgICAgICBhdXRoU2NoZW1lID0gImJhc2ljIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXV0aFNjaGVtZSA9ICJCYXNpYyI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcXVlc3QuYWJvcnRXaXRoKFJlc3BvbnNlLnN0YXR1cyg0MDEpLmhlYWRlcihIdHRwSGVhZGVycy5XV1dfQVVUSEVOVElDQVRFLCBhdXRoU2NoZW1lKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG5ldyBCYXNpY0ZpbHRlcigpKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IERpZ2VzdEZpbHRlcigpKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IEFsdGVybmF0aW5nRGlnZXN0QmFzaWNGaWx0ZXIoKSk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdW5zZWN1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gInVuc2VjdXJlIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImJhc2ljIikKKyAgICAgICAgQEJhc2ljCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYmFzaWMoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250ZXh0LmdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgKyAiOiIgKyBzZWN1cml0eUNvbnRleHQuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRpZ2VzdCIpCisgICAgICAgIEBEaWdlc3QKKyAgICAgICAgcHVibGljIFN0cmluZyBkaWdlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250ZXh0LmdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgKyAiOiIgKyBzZWN1cml0eUNvbnRleHQuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFsdGVybmF0aW5nIikKKyAgICAgICAgQEFsdGVybmF0aW5nCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYWx0ZXJuYXRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250ZXh0LmdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgKyAiOiIgKyBzZWN1cml0eUNvbnRleHQuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNQcmVlbXB0aXZlKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJob21lciIsICJIb21lciIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkJBU0lDOmhvbWVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNOb25QcmVlbXB0aXZlKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljQnVpbGRlcigpLm5vblByZWVtcHRpdmUoKS5jcmVkZW50aWFscygiaG9tZXIiLCAiSG9tZXIiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJCQVNJQzpob21lciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljTm9uUHJlZW1wdGl2ZVdpdGhFbXB0eVBhc3N3b3JkKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljQnVpbGRlcigpLm5vblByZWVtcHRpdmUoKS5idWlsZCgpKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAidW5zZWN1cmUiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImJhc2ljIikKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWNCdWlsZGVyKCkubm9uUHJlZW1wdGl2ZSgpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgic2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBhcyBjcmVkZW50aWFscyBhcmUgbWlzc2luZyIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoImJhc2ljIikucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfUEFTU1dPUkQsICJCYXJ0IikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkJBU0lDOmJhcnQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbml2ZXJzYWxCYXNpYygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImJhc2ljIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWxCdWlsZGVyKCkuY3JlZGVudGlhbHMoImhvbWVyIiwgIkhvbWVyIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6aG9tZXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjk0MTogQmFzaWNBdXRoZW50aWNhdG9yI2ZpbHRlclJlc3BvbnNlQW5kQXV0aGVudGljYXRlOiBhdXRoLXNjaGVtZSBjaGVja3Mgc2hvdWxkIGJlIGNhc2UKKyAgICAgKiBpbnNlbnNpdHZlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuaXZlcnNhbEJhc2ljQ2FzZVNlbnNpdGl2aXR5KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFscygiaG9tZXIiLCAiSG9tZXIiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAvLyBubyBBVVRIX1NDSEVNRV9DQVNFIGhlYWRlciA9IG1peGVkIGNhc2UKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJCQVNJQzpob21lciIpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJob21lciIsICJIb21lciIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoQmFzaWNGaWx0ZXIuQVVUSF9TQ0hFTUVfQ0FTRSwgImxvd2VyY2FzZSIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6aG9tZXIiKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFscygiaG9tZXIiLCAiSG9tZXIiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKEJhc2ljRmlsdGVyLkFVVEhfU0NIRU1FX0NBU0UsICJ1cHBlcmNhc2UiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkJBU0lDOmhvbWVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pdmVyc2FsQmFzaWNXcm9uZ1Bhc3N3b3JkKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFscygiaG9tZXIiLCAiRk9PIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgNDAxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1dpdGhEaWZmZXJlbnRDcmVkZW50aWFscygpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJtYXJnZSIsICJNYXJnZSIpLmJ1aWxkKCkpOworCisgICAgICAgIF90ZXN0QmFzaWNXaXRoRGlmZmVyZW50Q3JlZGVudGlhbHModGFyZ2V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1VuaXZlcnNhbFdpdGhEaWZmZXJlbnRDcmVkZW50aWFscygpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFscygibWFyZ2UiLCAiTWFyZ2UiKS5idWlsZCgpKTsKKworICAgICAgICBfdGVzdEJhc2ljV2l0aERpZmZlcmVudENyZWRlbnRpYWxzKHRhcmdldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3RCYXNpY1dpdGhEaWZmZXJlbnRDcmVkZW50aWFscyhXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0CisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkJBU0lDOm1hcmdlIik7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkQsICJCYXJ0IikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkJBU0lDOmJhcnQiKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6YmFydCIpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfUEFTU1dPUkQsICJCYXJ0IikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkJBU0lDOm1hcmdlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZGlnZXN0IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoImhvbWVyIiwgIkhvbWVyIikpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpob21lciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpZ2VzdFdpdGhQYXNzd29yZHMoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImRpZ2VzdCIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuZGlnZXN0KCJob21lciIsICJIb21lciIpKTsKKyAgICAgICAgX3Rlc3REaWdlc3RXaXRoUGFzc3dvcmRzKHRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pdmVyc2FsRGlnZXN0V2l0aFBhc3N3b3JkcygpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZGlnZXN0IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWxCdWlsZGVyKCkuY3JlZGVudGlhbHMoImhvbWVyIiwgIkhvbWVyIikuYnVpbGQoKSk7CisgICAgICAgIF90ZXN0RGlnZXN0V2l0aFBhc3N3b3Jkcyh0YXJnZXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0RGlnZXN0V2l0aFBhc3N3b3JkcyhXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpob21lciIpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfUEFTU1dPUkQsICJCYXJ0IikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJESUdFU1Q6YmFydCIpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfVVNFUk5BTUUsICJiYXJ0IikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1BBU1NXT1JELCAiQmFydCIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkQsICJCYXJ0IikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJESUdFU1Q6YmFydCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpZ2VzdFdpdGhFbXB0eURlZmF1bHRQYXNzd29yZCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoKSk7CisgICAgICAgIF90ZXN0RGlnZXN0V2l0aEVtcHR5RGVmYXVsdFBhc3N3b3JkKHRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0VW5pdmVyc2FsV2l0aEVtcHR5RGVmYXVsdFBhc3N3b3JkKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5idWlsZCgpKTsKKyAgICAgICAgX3Rlc3REaWdlc3RXaXRoRW1wdHlEZWZhdWx0UGFzc3dvcmQodGFyZ2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdERpZ2VzdFdpdGhFbXB0eURlZmF1bHRQYXNzd29yZChXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgInVuc2VjdXJlIik7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfVVNFUk5BTUUsICJiYXJ0IikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgInVuc2VjdXJlIik7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiZGlnZXN0IikucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfVVNFUk5BTUUsICJiYXJ0IikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpiYXJ0Iik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5wYXRoKCJkaWdlc3QiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1BBU1NXT1JELCAiQmFydCIpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGFzIG5vIGNyZWRlbnRpYWxzIHdlcmUgc3VwcGxpZWQgZm9yIGRpZ2VzdCBhdXRoIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBvaworICAgICAgICB9CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiZGlnZXN0IikucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkQsICJCYXJ0IikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJESUdFU1Q6YmFydCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVjayhSZXNwb25zZSByZXNwb25zZSwgaW50IHN0YXR1cywgU3RyaW5nIGVudGl0eSkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0YXR1cywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVudGl0eSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2soUmVzcG9uc2UgcmVzcG9uc2UsIGludCBzdGF0dXMpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdGF0dXMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RVbml2ZXJzYWxTaW1wbGUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJkaWdlc3QiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFscygiaG9tZXIiLCAiSG9tZXIiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJESUdFU1Q6aG9tZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RVbml2ZXJzYWxTaW1wbGUyKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZGlnZXN0IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWxCdWlsZGVyKCkuY3JlZGVudGlhbHNGb3JEaWdlc3QoImhvbWVyIiwgIkhvbWVyIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0VW5pdmVyc2FsU2ltcGxlMygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImRpZ2VzdCIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuY3JlZGVudGlhbHNGb3JEaWdlc3QoImhvbWVyIiwgIkhvbWVyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVkZW50aWFsc0ZvckJhc2ljKCJmb28iLCAiYmFyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJESUdFU1Q6aG9tZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RVbml2ZXJzYWxTaW1wbGU0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZGlnZXN0IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWwoImhvbWVyIiwgIkhvbWVyIikpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpob21lciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuaXZlcnNhbCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWwoImhvbWVyIiwgIkhvbWVyIikpOworCisgICAgICAgIGNoZWNrKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCksIDIwMCwgInVuc2VjdXJlIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJkaWdlc3QiKS5yZXF1ZXN0KCkuZ2V0KCksIDIwMCwgIkRJR0VTVDpob21lciIpOworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiYmFzaWMiKS5yZXF1ZXN0KCkuZ2V0KCksIDIwMCwgIkJBU0lDOmhvbWVyIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJiYXNpYyIpLnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAiQkFTSUM6aG9tZXIiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImRpZ2VzdCIpLnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJkaWdlc3QiKS5yZXF1ZXN0KCkuZ2V0KCksIDIwMCwgIkRJR0VTVDpob21lciIpOworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiZGlnZXN0IikucmVxdWVzdCgpLmdldCgpLCAyMDAsICJESUdFU1Q6aG9tZXIiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImJhc2ljIikucmVxdWVzdCgpLmdldCgpLCAyMDAsICJCQVNJQzpob21lciIpOworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiYmFzaWMiKS5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1BBU1NXT1JELCAiQmFydCIpLmdldCgpLCAyMDAsICJCQVNJQzpob21lciIpOworCisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJkaWdlc3QiKS5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1BBU1NXT1JELCAiQmFydCIpLmdldCgpLCAyMDAsICJESUdFU1Q6YmFydCIpOworCisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJkaWdlc3QiKS5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9QQVNTV09SRCwgIkJhcnQiKS5nZXQoKSwgMjAwLCAiRElHRVNUOmJhcnQiKTsKKworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiYWx0ZXJuYXRpbmciKS5yZXF1ZXN0KCkuZ2V0KCksIDIwMCwgIkJBU0lDOmhvbWVyIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJhbHRlcm5hdGluZyIpLnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJhbHRlcm5hdGluZyIpLnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAiQkFTSUM6aG9tZXIiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImJhc2ljIikucmVxdWVzdCgpLmdldCgpLCAyMDAsICJCQVNJQzpob21lciIpOworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiYWx0ZXJuYXRpbmciKS5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9QQVNTV09SRCwgIkJhcnQiKS5nZXQoKSwgMjAwLCAiRElHRVNUOmJhcnQiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImFsdGVybmF0aW5nIikucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkQsICJCYXJ0IikuZ2V0KCksIDIwMCwgIkJBU0lDOmJhcnQiKTsKKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSHR0cERpZ2VzdEF1dGhGaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9IdHRwRGlnZXN0QXV0aEZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFhZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSHR0cERpZ2VzdEF1dGhGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgU3RlZmFuIEthdGVya2FtcCA8c3RlZmFuIGF0IGthdGVya2FtcC5kZT4KKyAqLworcHVibGljIGNsYXNzIEh0dHBEaWdlc3RBdXRoRmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJR0VTVF9URVNUX0xPR0lOID0gInVzZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUdFU1RfVEVTVF9QQVNTID0gInBhc3N3b3JkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUX1RFU1RfSU5WQUxJRFBBU1MgPSAibm9wYXNzIjsKKyAgICAvLyBEaWdlc3Qgc3RyaW5nIGV4cGVjdGVkIGZvciBPSyBhdXRoOgorICAgIC8vIERpZ2VzdCByZWFsbT0idGVzdCIsIG5vbmNlPSJlRGVQRk5lSkJBQT1hODc0ODE0ZWM1NTY0Nzg2MmI2NmE3NDc2MzI2MDNlNTgyNWFjZDM5IiwKKyAgICAvLyAgIGFsZ29yaXRobT1NRDUsIGRvbWFpbj0iL2F1dGgtZGlnZXN0LyIsIHFvcD0iYXV0aCIKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUX1RFU1RfTk9OQ0UgPSAiZURlUEZOZUpCQUE9YTg3NDgxNGVjNTU2NDc4NjJiNjZhNzQ3NjMyNjAzZTU4MjVhY2QzOSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJR0VTVF9URVNUX1JFQUxNID0gInRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUdFU1RfVEVTVF9ET01BSU4gPSAiL2F1dGgtZGlnZXN0LyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG5jRXhwZWN0ZWQgPSAxOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi9hdXRoLWRpZ2VzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBIdHRwSGVhZGVycyBodHRwSGVhZGVyczsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0MSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2ZXJpZnkoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgixJvFocSNxZnFvsO9w6HDrcOpIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEVuY29kaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHZlcmlmeSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZXNwb25zZSB2ZXJpZnkoKSB7CisgICAgICAgICAgICBpZiAoaHR0cEhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcihIdHRwSGVhZGVycy5BVVRIT1JJWkFUSU9OKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0IHJlcXVlc3QgaGFzIG5vIGF1dGhvcml6YXRpb24gaGVhZGVyLCB0ZWxsIGZpbHRlciBpdHMgNDAxCisgICAgICAgICAgICAgICAgLy8gYW5kIHNlbmQgZmlsdGVyIGJhY2sgc2VlZCBmb3IgdGhlIG5ldyB0byBiZSBidWlsdCBoZWFkZXIKKyAgICAgICAgICAgICAgICBSZXNwb25zZUJ1aWxkZXIgcmVzcG9uc2VCdWlsZGVyID0gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5VTkFVVEhPUklaRUQpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlQnVpbGRlciA9IHJlc3BvbnNlQnVpbGRlci5oZWFkZXIoSHR0cEhlYWRlcnMuV1dXX0FVVEhFTlRJQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEaWdlc3QgcmVhbG09XCIiICsgRElHRVNUX1RFU1RfUkVBTE0gKyAiXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibm9uY2U9XCIiICsgRElHRVNUX1RFU1RfTk9OQ0UgKyAiXCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWxnb3JpdGhtPU1ENSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkb21haW49XCIiICsgRElHRVNUX1RFU1RfRE9NQUlOICsgIlwiLCBxb3A9XCJhdXRoXCIiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZSBmaWx0ZXIgdGFrZXMgdGhlIHNlZWQgYW5kIGFkZHMgdGhlIGhlYWRlcgorICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhdXRoTGlzdCA9IGh0dHBIZWFkZXJzLmdldFJlcXVlc3RIZWFkZXIoSHR0cEhlYWRlcnMuQVVUSE9SSVpBVElPTik7CisgICAgICAgICAgICAgICAgaWYgKGF1dGhMaXN0LnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUikuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhIZWFkZXIgPSBhdXRoTGlzdC5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGExID0gbWQ1KERJR0VTVF9URVNUX0xPR0lOLCBESUdFU1RfVEVTVF9SRUFMTSwgRElHRVNUX1RFU1RfUEFTUyk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSBVcmlDb21wb25lbnQuZnVsbFJlbGF0aXZlVXJpKHVyaUluZm8uZ2V0UmVxdWVzdFVyaSgpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGEyID0gbWQ1KCJHRVQiLCByZXF1ZXN0VXJpLnN0YXJ0c1dpdGgoIi8iKSA/IHJlcXVlc3RVcmkgOiAiLyIgKyByZXF1ZXN0VXJpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBtZDUoCisgICAgICAgICAgICAgICAgICAgICAgICBoYTEsCisgICAgICAgICAgICAgICAgICAgICAgICBESUdFU1RfVEVTVF9OT05DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERpZ2VzdEF1dGhIZWFkZXJWYWx1ZShhdXRoSGVhZGVyLCAibmM9IiksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREaWdlc3RBdXRoSGVhZGVyVmFsdWUoYXV0aEhlYWRlciwgImNub25jZT0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERpZ2VzdEF1dGhIZWFkZXJWYWx1ZShhdXRoSGVhZGVyLCAicW9wPSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgaGEyKTsKKworICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VuZXJhdGVzIElOVEVSTkFMX1NFUlZFUl9FUlJPUiBpZiBub3QgbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5jRXhwZWN0ZWQsIEludGVnZXIucGFyc2VJbnQoZ2V0RGlnZXN0QXV0aEhlYWRlclZhbHVlKGF1dGhIZWFkZXIsICJuYz0iKSkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVxdWFscyhnZXREaWdlc3RBdXRoSGVhZGVyVmFsdWUoYXV0aEhlYWRlciwgInJlc3BvbnNlPSIpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlVOQVVUSE9SSVpFRCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyc2V0IENIQVJBQ1RFUl9TRVQgPSBDaGFyc2V0LmZvck5hbWUoImlzby04ODU5LTEiKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29sb24gc2VwYXJhdGVkIHZhbHVlIE1ENSBoYXNoLiBDYWxsIG1kNSBtZXRob2Qgb2YgdGhlIGZpbHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRva2VucyBvbmUgb3IgbW9yZSBzdHJpbmdzCisgICAgICAgICAqIEByZXR1cm4gTTUgaGFzaCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBTdHJpbmcgbWQ1KGZpbmFsIFN0cmluZy4uLiB0b2tlbnMpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdG9rZW4gOiB0b2tlbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlRGlnZXN0IG1kOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1kLnVwZGF0ZShzYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJBQ1RFUl9TRVQpLCAwLCBzYi5sZW5ndGgoKSk7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gbWQ1aGFzaCA9IG1kLmRpZ2VzdCgpOworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzVG9IZXgobWQ1aGFzaCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydCBieXRlcyBhcnJheSB0byBoZXggc3RyaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYnl0ZXMgYXJyYXkgb2YgYnl0ZXMKKyAgICAgICAgICogQHJldHVybiBoZXggc3RyaW5nCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnl0ZXNUb0hleChmaW5hbCBieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBoZXhDaGFycyA9IG5ldyBjaGFyW2J5dGVzLmxlbmd0aCAqIDJdOworICAgICAgICAgICAgaW50IHY7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgdiA9IGJ5dGVzW2pdICYgMHhGRjsKKyAgICAgICAgICAgICAgICBoZXhDaGFyc1tqICogMl0gPSBIRVhfQVJSQVlbdiA+Pj4gNF07CisgICAgICAgICAgICAgICAgaGV4Q2hhcnNbaiAqIDIgKyAxXSA9IEhFWF9BUlJBWVt2ICYgMHgwRl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhoZXhDaGFycyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gSEVYX0FSUkFZID0geycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ307CisKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgdmFsdWUgb2YgdGhlIERpZ2VzdCBBdXRoIEhlYWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF1dGhIZWFkZXIgZGlnZXN0IGF1dGggaGVhZGVyIHN0cmluZworICAgICAgICAgKiBAcGFyYW0ga2V5TmFtZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJldHJpZXZlCisgICAgICAgICAqIEByZXR1cm4gdmFsdWUgc3RyaW5nCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgU3RyaW5nIGdldERpZ2VzdEF1dGhIZWFkZXJWYWx1ZShmaW5hbCBTdHJpbmcgYXV0aEhlYWRlciwgZmluYWwgU3RyaW5nIGtleU5hbWUpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpMSA9IGF1dGhIZWFkZXIuaW5kZXhPZihrZXlOYW1lKTsKKworICAgICAgICAgICAgaWYgKGkxID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGF1dGhIZWFkZXIuc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICBhdXRoSGVhZGVyLmluZGV4T2YoJz0nLCBpMSkgKyAxLAorICAgICAgICAgICAgICAgICAgICAoYXV0aEhlYWRlci5pbmRleE9mKCcsJywgaTEpICE9IC0xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhdXRoSGVhZGVyLmluZGV4T2YoJywnLCBpMSkgOiBhdXRoSGVhZGVyLmxlbmd0aCgpKSk7CisKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpOworICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PSAnIicgJiYgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCgpIC0gMSkgPT0gJyInKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cERpZ2VzdEF1dGhGaWx0ZXIoKSB7CisgICAgICAgIHRlc3RSZXF1ZXN0KCJhdXRoLWRpZ2VzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBEaWdlc3RBdXRoRmlsdGVyV2l0aEVuY29kZWRVcmkoKSB7CisgICAgICAgIHRlc3RSZXF1ZXN0KCJhdXRoLWRpZ2VzdC/Em8WhxI3FmcW+w73DocOtw6kiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwRGlnZXN0QXV0aEZpbHRlcldpdGhQYXJhbXMoKSB7CisgICAgICAgIHRlc3RSZXF1ZXN0KCJhdXRoLWRpZ2VzdCIsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBEaWdlc3RBdXRoRmlsdGVyV2l0aEVuY29kZWRVcmlBbmRQYXJhbXMoKSB7CisgICAgICAgIHRlc3RSZXF1ZXN0KCJhdXRoLWRpZ2VzdC/Em8WhxI3FmcW+w73DocOtw6kiLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFJlcXVlc3QoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGVzdFJlcXVlc3QocGF0aCwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVxdWVzdChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYm9vbGVhbiBhZGRQYXJhbXMpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoRElHRVNUX1RFU1RfTE9HSU4sIERJR0VTVF9URVNUX1BBU1MpKQorICAgICAgICAgICAgICAgIC5wYXRoKHBhdGgpOworCisgICAgICAgIGlmIChhZGRQYXJhbXMpIHsKKyAgICAgICAgICAgIHJlc291cmNlID0gcmVzb3VyY2UubWF0cml4UGFyYW0oImJhciIsICJmb28iKS5xdWVyeVBhcmFtKCJmb28iLCAiYmFyIik7CisgICAgICAgIH0KKworICAgICAgICBuY0V4cGVjdGVkID0gMTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcjEgPSByZXNvdXJjZS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLmZyb21TdGF0dXNDb2RlKHIxLmdldFN0YXR1cygpKSwgUmVzcG9uc2UuU3RhdHVzLk9LKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWVtcHRpdmUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuZGlnZXN0KERJR0VTVF9URVNUX0xPR0lOLCBESUdFU1RfVEVTVF9QQVNTKSkKKyAgICAgICAgICAgICAgICAucGF0aCgiYXV0aC1kaWdlc3QiKTsKKworICAgICAgICBuY0V4cGVjdGVkID0gMTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcjEgPSByZXNvdXJjZS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLmZyb21TdGF0dXNDb2RlKHIxLmdldFN0YXR1cygpKSwgUmVzcG9uc2UuU3RhdHVzLk9LKTsKKworICAgICAgICBuY0V4cGVjdGVkID0gMjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcjIgPSByZXNvdXJjZS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLmZyb21TdGF0dXNDb2RlKHIyLmdldFN0YXR1cygpKSwgUmVzcG9uc2UuU3RhdHVzLk9LKTsKKworICAgICAgICBuY0V4cGVjdGVkID0gMzsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcjMgPSByZXNvdXJjZS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLmZyb21TdGF0dXNDb2RlKHIzLmdldFN0YXR1cygpKSwgUmVzcG9uc2UuU3RhdHVzLk9LKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhlbnRpY2F0aW9uKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVzb3VyY2UgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdChESUdFU1RfVEVTVF9MT0dJTiwgRElHRVNUX1RFU1RfSU5WQUxJRFBBU1MpKQorICAgICAgICAgICAgICAgIC5wYXRoKCJhdXRoLWRpZ2VzdCIpOworCisgICAgICAgIG5jRXhwZWN0ZWQgPSAxOworICAgICAgICBmaW5hbCBSZXNwb25zZSByMSA9IHJlc291cmNlLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuZnJvbVN0YXR1c0NvZGUocjEuZ2V0U3RhdHVzKCkpLCBSZXNwb25zZS5TdGF0dXMuVU5BVVRIT1JJWkVEKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9IdHRwTWV0aG9kRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSHR0cE1ldGhvZEVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDZmZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSHR0cE1ldGhvZEVudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IRUFEOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0cyBIVFRQIG1ldGhvZHMgYW5kIGVudGl0eSBwcmVzZW5jZS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSHR0cE1ldGhvZEVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgX3Rlc3QoIkdFVCIsIHRydWUsIHRydWUpOworICAgICAgICBfdGVzdCgiR0VUIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBfdGVzdCgiUE9TVCIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgX3Rlc3QoIlBPU1QiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgX3Rlc3QoIlBVVCIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgX3Rlc3QoIlBVVCIsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB7CisgICAgICAgIF90ZXN0KCJERUxFVEUiLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgX3Rlc3QoIkRFTEVURSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZCgpIHsKKyAgICAgICAgX3Rlc3QoIkhFQUQiLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgX3Rlc3QoIkhFQUQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9wdGlvbnMoKSB7CisgICAgICAgIF90ZXN0KCJPUFRJT05TIiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIF90ZXN0KCJPUFRJT05TIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjM3MDogU2VuZGluZyBQT1NUIHdpdGhvdXQgYm9keS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVBvc3RXaXRob3V0Q29udGVudFR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IGZ1dHVyZSA9IHJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLnBvc3QobnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCBmdXR1cmUuZ2V0KCkuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc291cmNlLnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiU2VuZGluZyBQT1NUIG1ldGhvZCB3aXRob3V0IGVudGl0eSBzaG91bGQgbm90IGZhaWwuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjM3MDogU2VuZGluZyBQT1NUIHdpdGhvdXQgYm9keS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVBvc3RXaXRoQ29udGVudFR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IGZ1dHVyZSA9IHJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAidGV4dC9wbGFpbiIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIGZ1dHVyZS5nZXQoKS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzb3VyY2UucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAidGV4dC9wbGFpbiIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIlNlbmRpbmcgUE9TVCBtZXRob2Qgd2l0aG91dCBlbnRpdHkgc2hvdWxkIG5vdCBmYWlsLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3QoU3RyaW5nIG1ldGhvZCwgYm9vbGVhbiBlbnRpdHlQcmVzZW50LCBib29sZWFuIHNob3VsZEZhaWwpIHsKKyAgICAgICAgRW50aXR5IGVudGl0eSA9IGVudGl0eVByZXNlbnQgPyBFbnRpdHkuZW50aXR5KCJlbnRpdHkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSA6IG51bGw7CisgICAgICAgIF90ZXN0U3luYyhtZXRob2QsIGVudGl0eSwgc2hvdWxkRmFpbCk7CisgICAgICAgIF90ZXN0QXN5bmMobWV0aG9kLCBlbnRpdHksIHNob3VsZEZhaWwpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0QXN5bmMoU3RyaW5nIG1ldGhvZCwgRW50aXR5IGVudGl0eSwgYm9vbGVhbiBzaG91bGRGYWlsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IGZ1dHVyZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmFzeW5jKCkubWV0aG9kKG1ldGhvZCwgZW50aXR5KTsKKyAgICAgICAgICAgIGlmIChzaG91bGRGYWlsKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVGhlIG1ldGhvZCBzaG91bGQgZmFpbC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIGZ1dHVyZS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoIXNob3VsZEZhaWwpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJUaGUgbWV0aG9kICIgKyBtZXRob2QgKyAiIHdpdGggZW50aXR5PSIgKyAoZW50aXR5ICE9IG51bGwpICsgIiBzaG91bGQgbm90IGZhaWwuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFN5bmMoU3RyaW5nIG1ldGhvZCwgRW50aXR5IGVudGl0eSwgYm9vbGVhbiBzaG91bGRGYWlsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLm1ldGhvZChtZXRob2QsIGVudGl0eSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBpZiAoc2hvdWxkRmFpbCkgeworICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBtZXRob2Qgc2hvdWxkIGZhaWwuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoIXNob3VsZEZhaWwpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJUaGUgbWV0aG9kICIgKyBtZXRob2QgKyAiIHdpdGggZW50aXR5UHJlc2VudD0iICsgKGVudGl0eSAhPSBudWxsKSArICIgc2hvdWxkIG5vdCBmYWlsLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBodHRwSGVhZGVyczsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIC8vIFNlZSBKRVJTRVktMTQ1NQorICAgICAgICAgICAgYXNzZXJ0RmFsc2UoaHR0cEhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcnMoKS5jb250YWluc0tleShIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShodHRwSGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJzLkNPTlRFTlRfTEFOR1VBR0UpKTsKKworICAgICAgICAgICAgcmV0dXJuICJwb3N0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgcmV0dXJuICJwdXQiOworICAgICAgICB9CisKKyAgICAgICAgQEhFQUQKKyAgICAgICAgcHVibGljIFN0cmluZyBoZWFkKCkgeworICAgICAgICAgICAgcmV0dXJuICJoZWFkIjsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgcHVibGljIFN0cmluZyBkZWxldGUoKSB7CisgICAgICAgICAgICByZXR1cm4gImRlbGV0ZSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9JbmplY3RlZENsaWVudEJvZHlXb3JrZXIuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0luamVjdGVkQ2xpZW50Qm9keVdvcmtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTU0NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9JbmplY3RlZENsaWVudEJvZHlXb3JrZXIuamF2YQpAQCAtMCwwICsxLDI1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgaWYgSkFYLVJTIGluamVjdGlvbiBwb2ludHMgd29yayBpbiBjbGllbnQgc2lkZSBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEluamVjdGVkQ2xpZW50Qm9keVdvcmtlciBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgLy8gbWVkaWEgdHlwZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQga2luZCBvZiBpbmplY3Rpb24gc2hvdWxkIGJlIHRlc3RlZAorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUHJvdmlkZXJUeXBlID0gInRlc3QvcHJvdmlkZXJzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENvbmZpZ3VyYXRpb25UWVBFID0gInRlc3QvY29uZmlndXJhdGlvbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q29udGV4dCB7fQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxNeUNvbnRleHQ+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE15Q29udGV4dCBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKFByb3ZpZGVyVHlwZSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3ZpZGVyc0luamVjdGVkV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgUHJvdmlkZXJzIHByb3ZpZGVyczsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShTdHJpbmcgdCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTdHJpbmcgdCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbiBvY2N1cnMgaGVyZQorICAgICAgICAgICAgcHJvdmlkZXJzLmdldEV4Y2VwdGlvbk1hcHBlcihFeGNlcHRpb24uY2xhc3MpOworCisgICAgICAgICAgICBmaW5hbCBDb250ZXh0UmVzb2x2ZXI8TXlDb250ZXh0PiBjb250ZXh0UmVzb2x2ZXIgPSBwcm92aWRlcnMKKyAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHRSZXNvbHZlcihNeUNvbnRleHQuY2xhc3MsIE1lZGlhVHlwZS52YWx1ZU9mKFByb3ZpZGVyVHlwZSkpOworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKFN0cmluZy5mb3JtYXQoIiVzIiwgY29udGV4dFJlc29sdmVyKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBDb25zdW1lcyhQcm92aWRlclR5cGUpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm92aWRlcnNJbmplY3RlZFJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFN0cmluZz4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFByb3ZpZGVycyBwcm92aWRlcnM7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyByZWFkRnJvbShDbGFzczxTdHJpbmc+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbiBvY2N1cnMgaGVyZQorICAgICAgICAgICAgcHJvdmlkZXJzLmdldEV4Y2VwdGlvbk1hcHBlcihFeGNlcHRpb24uY2xhc3MpOworCisgICAgICAgICAgICBmaW5hbCBDb250ZXh0UmVzb2x2ZXI8TXlDb250ZXh0PiBjb250ZXh0UmVzb2x2ZXIgPSBwcm92aWRlcnMKKyAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHRSZXNvbHZlcihNeUNvbnRleHQuY2xhc3MsIE1lZGlhVHlwZS52YWx1ZU9mKFByb3ZpZGVyVHlwZSkpOworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzIiwgY29udGV4dFJlc29sdmVyKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKENvbmZpZ3VyYXRpb25UWVBFKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlndXJhdGlvbkluamVjdGVkV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGN0eFJlc29sdmVyUmVnaXN0ZXJlZCA9IGNvbmZpZ3VyYXRpb24uaXNSZWdpc3RlcmVkKE15Q29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShTdHJpbmcuZm9ybWF0KCIlYiIsIGN0eFJlc29sdmVyUmVnaXN0ZXJlZCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAQ29uc3VtZXMoQ29uZmlndXJhdGlvblRZUEUpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uSW5qZWN0ZWRSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxTdHJpbmc+IHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyByZWFkRnJvbShDbGFzczxTdHJpbmc+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY3R4UmVzb2x2ZXJSZWdpc3RlcmVkID0gY29uZmlndXJhdGlvbi5pc1JlZ2lzdGVyZWQoTXlDb250ZXh0UmVzb2x2ZXIuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiViIiwgY3R4UmVzb2x2ZXJSZWdpc3RlcmVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJlY2hvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVjaG9SZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKHtQcm92aWRlclR5cGUsIENvbmZpZ3VyYXRpb25UWVBFLCBNZWRpYVR5cGUuVEVYVF9QTEFJTn0pCisgICAgICAgIEBQcm9kdWNlcyh7UHJvdmlkZXJUeXBlLCBDb25maWd1cmF0aW9uVFlQRSwgTWVkaWFUeXBlLlRFWFRfUExBSU59KQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIHApIHsKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFY2hvUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZworICAgICAgICAgICAgICAgIC5yZWdpc3RlcihQcm92aWRlcnNJbmplY3RlZFdyaXRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQ29uZmlndXJhdGlvbkluamVjdGVkV3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihQcm92aWRlcnNJbmplY3RlZFJlYWRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQ29uZmlndXJhdGlvbkluamVjdGVkUmVhZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcnNJblJlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFByb3ZpZGVycyhQcm92aWRlclR5cGUsIE1lZGlhVHlwZS5URVhUX1BMQUlOKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcnNJbldyaXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFByb3ZpZGVycyhNZWRpYVR5cGUuVEVYVF9QTEFJTiwgUHJvdmlkZXJUeXBlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uSW5SZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENvbmZpZ3VyYXRpb24oQ29uZmlndXJhdGlvblRZUEUsIE1lZGlhVHlwZS5URVhUX1BMQUlOKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uSW5Xcml0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENvbmZpZ3VyYXRpb24oTWVkaWFUeXBlLlRFWFRfUExBSU4sIENvbmZpZ3VyYXRpb25UWVBFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RQcm92aWRlcnMoZmluYWwgU3RyaW5nIGluY29taW5nVHlwZSwgZmluYWwgU3RyaW5nIG91dGdvaW5nVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHBvc3RXaXRob3V0UHJvdmlkZXJSZXN1bHQgPSB0YXJnZXQoImVjaG8iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KG91dGdvaW5nVHlwZSkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJkb2VzIG5vdCBtYXR0ZXIiLCBpbmNvbWluZ1R5cGUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHBvc3RXaXRob3V0UHJvdmlkZXJSZXN1bHQsIGlzKCJudWxsIikpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBwb3N0V2l0aFByb3ZpZGVyUmVzdWx0ID0gdGFyZ2V0KCJlY2hvIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXlDb250ZXh0UmVzb2x2ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlcXVlc3Qob3V0Z29pbmdUeXBlKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoImlnbm9yZWQiLCBpbmNvbWluZ1R5cGUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHBvc3RXaXRoUHJvdmlkZXJSZXN1bHQsIGNvbnRhaW5zU3RyaW5nKE15Q29udGV4dFJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbihmaW5hbCBTdHJpbmcgaW5jb21pbmdUeXBlLCBmaW5hbCBTdHJpbmcgb3V0Z29pbmdUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdFdpdGhvdXRQcm92aWRlclJlc3VsdCA9IHRhcmdldCgiZWNobyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoaW5jb21pbmdUeXBlKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoIndoYXRldmVyIiwgb3V0Z29pbmdUeXBlKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwb3N0V2l0aG91dFByb3ZpZGVyUmVzdWx0LCBpcygiZmFsc2UiKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHBvc3RXaXRoUHJvdmlkZXJSZXN1bHQgPSB0YXJnZXQoImVjaG8iKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNeUNvbnRleHRSZXNvbHZlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVxdWVzdChpbmNvbWluZ1R5cGUpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgiYnVtbWVyIiwgb3V0Z29pbmdUeXBlKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwb3N0V2l0aFByb3ZpZGVyUmVzdWx0LCBpcygidHJ1ZSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9JbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9JbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlMzkzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0luamVjdGlvbk1hbmFnZXJQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5JbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkluamVjdGlvbk1hbmFnZXJDbGllbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlckNsaWVudFByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBJbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3RlZFNlcnZpY2UgeworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIE15SW5qZWN0ZWRTZXJ2aWNlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJpbmRlckZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIEJpbmRlckZlYXR1cmUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgYmluZChuZXcgTXlJbmplY3RlZFNlcnZpY2UobmFtZSkpLnRvKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25NYW5hZ2VyQ2xpZW50UHJvdmlkZXIuZ2V0SW5qZWN0aW9uTWFuYWdlcihyZXF1ZXN0Q29udGV4dCk7CisgICAgICAgICAgICBmaW5hbCBNeUluamVjdGVkU2VydmljZSBzZXJ2aWNlID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNeUluamVjdGVkU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHNlcnZpY2UuZ2V0TmFtZSgpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0RW50aXR5KG5hbWUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0RmlsdGVySW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmluZGVyRmVhdHVyZSgiaGVsbG8iKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IE15UmVxdWVzdEZpbHRlcigpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ3aWxsLWJlLW92ZXJ3cml0dGVuIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RGaWx0ZXJDbGFzcygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBCaW5kZXJGZWF0dXJlKCJoZWxsbyIpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNeVJlcXVlc3RGaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtb3ZlcndyaXR0ZW4iLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBsb2NhdG9yID0gSW5qZWN0aW9uTWFuYWdlckNsaWVudFByb3ZpZGVyLmdldEluamVjdGlvbk1hbmFnZXIocmVzcG9uc2VDb250ZXh0KTsKKyAgICAgICAgICAgIGZpbmFsIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2UgPSBsb2NhdG9yLmdldEluc3RhbmNlKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gc2VydmljZS5nZXROYW1lKCk7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuYW1lLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc3BvbnNlRmlsdGVySW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmluZGVyRmVhdHVyZSgid29ybGQiKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IE15UmVzcG9uc2VGaWx0ZXIoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgid2lsbC1iZS1vdmVyd3JpdHRlbiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUZpbHRlckNsYXNzKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJpbmRlckZlYXR1cmUoIndvcmxkIikpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE15UmVzcG9uc2VGaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtb3ZlcndyaXR0ZW4iLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoTXlGZWF0dXJlSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmVhdHVyZUludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICAgICAgQEluamVjdAorICAgICAgICAgICAgcHVibGljIE15RmVhdHVyZUludGVyY2VwdG9yKE15SW5qZWN0ZWRTZXJ2aWNlIGluamVjdGVkU2VydmljZSkgeworICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IGluamVjdGVkU2VydmljZS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItaW50ZXJjZXB0b3ItIiArIG5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluc3RhbmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmluZChuZXcgTXlJbmplY3RlZFNlcnZpY2UoImZlYXR1cmUiKSkudG8oTXlJbmplY3RlZFNlcnZpY2UuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IE15RmVhdHVyZSgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ3aWxsLWJlLWV4dGVuZGVkLWJ5IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2lsbC1iZS1leHRlbmRlZC1ieS1pbnRlcmNlcHRvci1mZWF0dXJlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlQ2xhc3MoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKG5ldyBNeUluamVjdGVkU2VydmljZSgiZmVhdHVyZSIpKS50byhNeUluamVjdGVkU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNeUZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtZXh0ZW5kZWQtYnkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsLWJlLWV4dGVuZGVkLWJ5LWludGVyY2VwdG9yLWZlYXR1cmUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgc2VydmljZUxvY2F0b3IgPSBJbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXIuZ2V0SW5qZWN0aW9uTWFuYWdlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGZpbmFsIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlTG9jYXRvci5nZXRJbnN0YW5jZShNeUluamVjdGVkU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eSgoKFN0cmluZykgY29udGV4dC5nZXRFbnRpdHkoKSkgKyAiLXdyaXRlci1pbnRlcmNlcHRvci0iICsgc2VydmljZS5nZXROYW1lKCkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZXJJbnRlcmNlcHRvckluc3RhbmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJpbmRlckZlYXR1cmUoInVuaXZlcnNlIikpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBNeVdyaXRlckludGVyY2VwdG9yKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtZXh0ZW5kZWQtYnkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsLWJlLWV4dGVuZGVkLWJ5LXdyaXRlci1pbnRlcmNlcHRvci11bml2ZXJzZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVySW50ZXJjZXB0b3JDbGFzcygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBCaW5kZXJGZWF0dXJlKCJ1bml2ZXJzZSIpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNeVdyaXRlckludGVyY2VwdG9yLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ3aWxsLWJlLWV4dGVuZGVkLWJ5IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2lsbC1iZS1leHRlbmRlZC1ieS13cml0ZXItaW50ZXJjZXB0b3ItdW5pdmVyc2UiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlYWRlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBlbnRpdHkgPSBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIGlmICghKGVudGl0eSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZ0VudGl0eSA9IChTdHJpbmcpIGVudGl0eTsKKyAgICAgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgc2VydmljZUxvY2F0b3IgPSBJbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXIuZ2V0SW5qZWN0aW9uTWFuYWdlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGZpbmFsIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlTG9jYXRvci5nZXRJbnN0YW5jZShNeUluamVjdGVkU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nRW50aXR5ICsgIi1yZWFkZXItaW50ZXJjZXB0b3ItIiArIHNlcnZpY2UuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJJbnRlcmNlcHRvckluc3RhbmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJpbmRlckZlYXR1cmUoInVuaXZlcnNlIikpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBNeVJlYWRlckludGVyY2VwdG9yKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtZXh0ZW5kZWQtYnkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsLWJlLWV4dGVuZGVkLWJ5LXJlYWRlci1pbnRlcmNlcHRvci11bml2ZXJzZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGVySW50ZXJjZXB0b3JDbGFzcygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBCaW5kZXJGZWF0dXJlKCJ1bml2ZXJzZSIpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNeVJlYWRlckludGVyY2VwdG9yLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ3aWxsLWJlLWV4dGVuZGVkLWJ5IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2lsbC1iZS1leHRlbmRlZC1ieS1yZWFkZXItaW50ZXJjZXB0b3ItdW5pdmVyc2UiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0pheFJzVGltZW91dFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0pheFJzVGltZW91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2RmOWEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSmF4UnNUaW1lb3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkplcnNleVdlYlRhcmdldDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzVGltZW91dFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgQ2xpZW50IGNsaWVudCA9CisgICAgICAgICAgICBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5yZWFkVGltZW91dCgyMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpLmJ1aWxkKCk7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGltZW91dFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInRpbWVvdXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWVvdXQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUaW1lb3V0VGVzdC5UaW1lb3V0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDbGllbnQgZ2V0Q2xpZW50KCkgeworICAgICAgICByZXR1cm4gY2xpZW50OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZhc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbG93KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0L3RpbWVvdXQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBmYWlsKCJUaW1lb3V0IGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICghKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNvY2tldFRpbWVvdXRFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9Ob25TdWNjZXNzZnVsUmVzcG9uc2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9Ob25TdWNjZXNzZnVsUmVzcG9uc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3NTYyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L05vblN1Y2Nlc3NmdWxSZXNwb25zZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuU3luY0ludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3Qgbm8gc3VjY2Vzc2Z1bCAoM1hYLCA0WFgsIDVYWCkgcmVzcG9uc2VzIHdpdGggbm8gZW1wdHkgYm9keS4KKyAqCisgKiBAYXV0aG9yIEJhbGxlc2kgRXplcXVpZWwgKGV6ZXF1aWVsYmFsbGVzaSBhdCBnbWFpbC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBOb25TdWNjZXNzZnVsUmVzcG9uc2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgLy8gTk9URTogVGhpcyBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gdXNpbmcgY29ubmVjdG9yLCB0aGF0IGRvZXMgbm90IGZvbGxvdyByZWRpcmVjdHMgYnkgZGVmYXVsdCwgc3VjaCBhcyBIdHRwVXJsQ29ubmVjdG9yLgorICAgICAgICAvLyBIb3dldmVyLCB0aGUgdGVzdGNhc2Ugd291bGQgZmFpbCB3aGVuIEZPTExPV19SRURJUkVDVFMgaXMgc2V0IHRvIHRydWUuIFRoZXJlZm9yLCB3ZSBjb25maWd1cmUgdGhlIGJlaGF2aW91ciBvbgorICAgICAgICAvLyByZWRpcmVjdHMgZXhwbGljaXRseS4KKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUywgZmFsc2UpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi97c3RhdHVzfSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRYWFgoQFBhdGhQYXJhbSgic3RhdHVzIikgaW50IHN0YXR1cykgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmVudGl0eSgiZ2V0IikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCIve3N0YXR1c30iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdFhYWChAUGF0aFBhcmFtKCJzdGF0dXMiKSBpbnQgc3RhdHVzLCBTdHJpbmcgcG9zdCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmVudGl0eShwb3N0KS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQzWFgoKSB7CisgICAgICAgIGdlbmVyYWxUZXN0R2V0KDMwMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdDNYWCgpIHsKKyAgICAgICAgZ2VuZXJhbFRlc3RQb3N0KDMwMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0NFhYKCkgeworICAgICAgICBnZW5lcmFsVGVzdEdldCg0MDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3Q0WFgoKSB7CisgICAgICAgIGdlbmVyYWxUZXN0UG9zdCg0MDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldDVYWCgpIHsKKyAgICAgICAgZ2VuZXJhbFRlc3RHZXQoNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0NVhYKCkgeworICAgICAgICBnZW5lcmFsVGVzdFBvc3QoNTAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZ2VuZXJhbFRlc3RHZXQoaW50IHN0YXR1cykgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnBhdGgoSW50ZWdlci50b1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgU3luY0ludm9rZXIgc3luYyA9IHRhcmdldC5yZXF1ZXN0KCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gc3luYy5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0YXR1cywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmFsVGVzdFBvc3QoaW50IHN0YXR1cykgeworICAgICAgICBFbnRpdHk8U3RyaW5nPiBlbnRpdHkgPSBFbnRpdHkuZW50aXR5KCJlbnRpdHkiLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJlc291cmNlIikucGF0aChJbnRlZ2VyLnRvU3RyaW5nKHN0YXR1cykpOworICAgICAgICBTeW5jSW52b2tlciBzeW5jID0gdGFyZ2V0LnJlcXVlc3QoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBzeW5jLnBvc3QoZW50aXR5LCBSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhdHVzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImVudGl0eSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9SZXF1ZXN0U2NvcGVkUmVhZEVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1JlcXVlc3RTY29wZWRSZWFkRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDg4MGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9SZXF1ZXN0U2NvcGVkUmVhZEVudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVE9ETzogamF2YWRvYy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZFJlYWRFbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lc3NhZ2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRleHQ7CisKKyAgICAgICAgcHVibGljIE1lc3NhZ2UoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgic2ltcGxlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInBhc3NlZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NvcGVkTWVzc2FnZUVudGl0eVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8TWVzc2FnZT4geworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBQcm92aWRlcjxDbGllbnRSZXF1ZXN0PiBjbGllbnRSZXF1ZXN0UHJvdmlkZXI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBNZXNzYWdlLmNsYXNzICYmIG1lZGlhVHlwZS5lcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lc3NhZ2UgcmVhZEZyb20oCisgICAgICAgICAgICAgICAgQ2xhc3M8TWVzc2FnZT4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBjbGllbnRSZXF1ZXN0UHJvdmlkZXIuZ2V0KCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IG5ldyBNZXNzYWdlKHJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpKSA6IG5ldyBNZXNzYWdlKCJmYWlsZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IE1lc3NhZ2UuY2xhc3MgJiYgbWVkaWFUeXBlLmVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgd3JpdGVUb0FzU3RyaW5nKChjbGllbnRSZXF1ZXN0UHJvdmlkZXIuZ2V0KCkgIT0gbnVsbCkgPyBtZXNzYWdlLnRleHQgOiAiZmFpbGVkIiwgZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFmdGVyQ2xvc2UoKSB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlIikucmVnaXN0ZXIoU2NvcGVkTWVzc2FnZUVudGl0eVByb3ZpZGVyLmNsYXNzKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXF1ZXN0LmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIC8vIHJlYWRpbmcgZW50aXR5ICJvdXQtb2Ytc2NvcGUiCisgICAgICAgIGZpbmFsIE1lc3NhZ2UgbXNnID0gcmVzcG9uc2UucmVhZEVudGl0eShNZXNzYWdlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXNzZWQiLCBtc2cudGV4dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvUmVzcG9uc2VDbG9zZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1Jlc3BvbnNlQ2xvc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhYjgzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1Jlc3BvbnNlQ2xvc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3QgZm9yIFJlc3BvbnNlLmNsb3NlKCkgbWV0aG9kLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZUNsb3NlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInNpbXBsZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEl0KCkgeworICAgICAgICAgICAgcmV0dXJuICJpdCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJlbXB0eSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFmdGVyQ2xvc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGVudGl0eSBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlQmVmb3JlUmVhZGluZ0VtcHR5Q29udGVudEhhc05vRWZmZWN0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInNpbXBsZSIpLnBhdGgoImVtcHR5IikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGVudGl0eSBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRBZnRlck11bHRpcGxlQ2xvc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGVudGl0eSBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRCdWZmZXJlZEVudGl0eUFmdGVyQ2xvc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gcmVhZGluZyBhIGJ1ZmZlcmVkIGVudGl0eSBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlckVudGl0eUFmdGVyQ2xvc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgYSBidWZmZXJlZCBlbnRpdHkgYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbnRpdHlBZnRlckNsb3NlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInNpbXBsZSIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGEgYnVmZmVyZWQgZW50aXR5IGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzRW50aXR5QWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmhhc0VudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGluc2lkZSBoYXNFbnRpdHkuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1Jlc3BvbnNlUmVhZEFuZEJ1ZmZlckVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1Jlc3BvbnNlUmVhZEFuZEJ1ZmZlckVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWRkZmFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvUmVzcG9uc2VSZWFkQW5kQnVmZmVyRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBCdWZmZXJlZCByZXNwb25zZSBlbnRpdHkgdGVzdHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VSZWFkQW5kQnVmZmVyRW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVzcG9uc2VSZWFkQW5kQnVmZmVyRW50aXR5VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb3JydXB0YWJsZUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBjbG9zZUNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gY29ycnVwdENsb3NlID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb3JydXB0UmVhZCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZGVsZWdhdGU7CisKKyAgICAgICAgcHVibGljIENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFJlc291cmNlLkVOVElUWS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChjb3JydXB0UmVhZCkgeworICAgICAgICAgICAgICAgIGNvcnJ1cHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5yZWFkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGNvcnJ1cHRSZWFkKSB7CisgICAgICAgICAgICAgICAgY29ycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnJlYWQoYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGNvcnJ1cHRSZWFkKSB7CisgICAgICAgICAgICAgICAgY29ycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHNraXAoZmluYWwgbG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGNvcnJ1cHRSZWFkKSB7CisgICAgICAgICAgICAgICAgY29ycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNraXAobik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGNvcnJ1cHRSZWFkKSB7CisgICAgICAgICAgICAgICAgY29ycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmF2YWlsYWJsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUubWFya1N1cHBvcnRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG1hcmsoZmluYWwgaW50IHJlYWRBaGVhZExpbWl0KSB7CisgICAgICAgICAgICBkZWxlZ2F0ZS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGNsb3NlQ291bnRlci5zZXQoMCk7CisgICAgICAgICAgICBkZWxlZ2F0ZS5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNsb3NlQ291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIGlmIChjb3JydXB0Q2xvc2UpIHsKKyAgICAgICAgICAgICAgICBjb3JydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxlZ2F0ZS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29ycnVwdFJlYWQoZmluYWwgYm9vbGVhbiBjb3JydXB0UmVhZCkgeworICAgICAgICAgICAgdGhpcy5jb3JydXB0UmVhZCA9IGNvcnJ1cHRSZWFkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29ycnVwdENsb3NlKGZpbmFsIGJvb2xlYW4gY29ycnVwdENsb3NlKSB7CisgICAgICAgICAgICB0aGlzLmNvcnJ1cHRDbG9zZSA9IGNvcnJ1cHRDbG9zZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2xvc2VDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjbG9zZUNvdW50ZXIuZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvcnJ1cHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJBcG9jYWx5cHNlIE5vdyIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiRU50aVR5IjsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjb3JydXB0ZWQiKQorICAgICAgICBwdWJsaWMgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSBjb3JydXB0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN0cmluZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIEVOVElUWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJJbnN0YW5jZXMobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyRW50aXR5UmVhZHNPcmlnaW5hbFN0cmVhbVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzcG9uc2UvY29ycnVwdGVkIik7CisgICAgICAgIGZpbmFsIENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0gY2lzID0gbmV3IENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKG5ldyBDbGllbnRSZXNwb25zZUZpbHRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKGNpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5idWlsZEdldCgpLmludm9rZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjaXMuc2V0Q29ycnVwdFJlYWQodHJ1ZSk7CisgICAgICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIlByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgICAgICBhc3NlcnRUaGF0KHBlLmdldENhdXNlKCksIGluc3RhbmNlT2YoSU9FeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgLy8gU2VlIEpFUlNFWS0xMzQwCisgICAgcHVibGljIHZvaWQgdGVzdFNlY29uZFVuYnVmZmVyZWRSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNwb25zZS9zdHJpbmciKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlLkVOVElUWSwgZW50aXR5KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShSZWFkZXIuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHRvIGJlIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAvLyBwYXNzZWQuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIC8vIFNlZSBKRVJTRVktMTMzOQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNvbmRCdWZmZXJlZFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3BvbnNlL3N0cmluZyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldCgpOworICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKworICAgICAgICBTdHJpbmcgZW50aXR5OworCisgICAgICAgIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlLkVOVElUWSwgZW50aXR5KTsKKworICAgICAgICBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZS5FTlRJVFksIGVudGl0eSk7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWQgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVzcG9uc2UucmVhZEVudGl0eShSZWFkZXIuY2xhc3MpKTsKKyAgICAgICAgU3RyaW5nIGxpbmUgPSBidWZmZXJlZC5yZWFkTGluZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2UuRU5USVRZLCBsaW5lKTsKKworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMF07CisgICAgICAgIGJ1ZmZlciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoYnVmZmVyLmdldENsYXNzKCkpOworICAgICAgICBTdHJpbmcgZW50aXR5RnJvbUJ5dGVzID0gbmV3IFN0cmluZyhidWZmZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2UuRU5USVRZLCBlbnRpdHlGcm9tQnl0ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHRlc3RzIGJlaGF2aW9yIG9mIGlucHV0IHN0cmVhbSBvcGVyYXRpb25zIGluIGNhc2UgdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBjbG9zZWQuCisgICAgICogUmVwcm9kdWNlciBmb3IgSlJGQ0FGLTEzNDQuCisgICAgICogPHA+CisgICAgICogVUMtMSA6IFJlYWQgdW5idWZmZXJlZCBlbnRpdHkgYW5kIHRoZW4gdHJ5IHRvIGNsb3NlIHRoZSBjb250ZXh0CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFVuYnVmZmVyZWRFbnRpdHlGcm9tU3RyZWFtVGhhdEZhaWxzVG9DbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtID0gbmV3IENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzcG9uc2UvY29ycnVwdGVkIik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihuZXcgQ2xpZW50UmVzcG9uc2VGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eVN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuYnVpbGRHZXQoKS5pbnZva2UoKTsKKyAgICAgICAgZW50aXR5U3RyZWFtLnNldENvcnJ1cHRDbG9zZSh0cnVlKTsKKworICAgICAgICAvLyBSZWFkIGVudGl0eSBzaG91bGQgbm90IGZhaWwgLSB3ZSBzaWxlbnRseSBjb25zdW1lIHRoZSB1bmRlcmx5aW5nIElPRXhjZXB0aW9uIGZyb20gY2xvc2VkIGlucHV0IHN0cmVhbS4KKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCByZXNwb25zZS4iLCBlbnRpdHkudG9TdHJpbmcoKSwgZXF1YWxUbyhSZXNvdXJjZS5FTlRJVFkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbG9zZSBub3QgaW52b2tlZCBvbiB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbS4iLCAxLCBlbnRpdHlTdHJlYW0uZ2V0Q2xvc2VDb3VudCgpKTsKKworICAgICAgICAvLyBDbG9zZSBzaG91bGQgbm90IGZhaWwgYW5kIHNob3VsZCBiZSBpZGVtcG90ZW50CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2xvc2UgaW52b2tlZCB0b28gbWFueSB0aW1lcyBvbiB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbS4iLCAxLCBlbnRpdHlTdHJlYW0uZ2V0Q2xvc2VDb3VudCgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVUMtMS4xIDogVHJ5IHRvIHJlYWQgYW4gdW5idWZmZXJlZCBlbnRpdHkgZnJvbSBhIGNsb3NlZCBjb250ZXh0CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGZyb20gYSBjbG9zZWQgY29udGV4dC4iKTsKKyAgICAgICAgICAgIC8vIFVDLTEuMSA6IEVORAorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdGVzdHMgYmVoYXZpb3Igb2YgaW5wdXQgc3RyZWFtIG9wZXJhdGlvbnMgaW4gY2FzZSB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0gdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGNsb3NlZC4KKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKUkZDQUYtMTM0NC4KKyAgICAgKiA8cD4KKyAgICAgKiBVQy0yIDogUmVhZCBidWZmZXJlZCBlbnRpdHkgbXVsdGlwbGUgdGltZXMgYW5kIHRoZW4gdHJ5IHRvIGNsb3NlIHRoZSBjb250ZXh0CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ1ZmZlcmVkRW50aXR5TXVsdGlwbGVUaW1lc0Zyb21TdHJlYW1UaGF0RmFpbHNUb0Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtID0gbmV3IENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzcG9uc2UvY29ycnVwdGVkIik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihuZXcgQ2xpZW50UmVzcG9uc2VGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eVN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuYnVpbGRHZXQoKS5pbnZva2UoKTsKKyAgICAgICAgZW50aXR5U3RyZWFtLnNldENvcnJ1cHRDbG9zZSh0cnVlKTsKKworICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbG9zZSBub3QgaW52b2tlZCBvbiB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbS4iLCAxLCBlbnRpdHlTdHJlYW0uZ2V0Q2xvc2VDb3VudCgpKTsKKworICAgICAgICBTdHJpbmcgZW50aXR5OworICAgICAgICBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcywgbnVsbCk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgcmVzcG9uc2UuIiwgZW50aXR5LnRvU3RyaW5nKCksIGVxdWFsVG8oUmVzb3VyY2UuRU5USVRZKSk7CisgICAgICAgIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCByZXNwb25zZS4iLCBlbnRpdHkudG9TdHJpbmcoKSwgZXF1YWxUbyhSZXNvdXJjZS5FTlRJVFkpKTsKKworICAgICAgICAvLyBDbG9zZSBzaG91bGQgbm90IGZhaWwgYW5kIHNob3VsZCBiZSBpZGVtcG90ZW50CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2xvc2UgaW52b2tlZCB0b28gbWFueSB0aW1lcyBvbiB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbS4iLCAxLCBlbnRpdHlTdHJlYW0uZ2V0Q2xvc2VDb3VudCgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVUMtMi4xIDogVHJ5IHRvIHJlYWQgYSBidWZmZXJlZCBlbnRpdHkgZnJvbSBhIGNsb3NlZCBjb250ZXh0CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGZyb20gYSBjbG9zZWQgYnVmZmVyZWQgY29udGV4dC4iKTsKKyAgICAgICAgICAgIC8vIFVDLTIuMSA6IEVORAorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgICAgIC8vIFVDLTIgOiBFTkQKKworICAgICAgICBlbnRpdHlTdHJlYW0ucmVzZXQoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHRlc3RzIGJlaGF2aW9yIG9mIGlucHV0IHN0cmVhbSBvcGVyYXRpb25zIGluIGNhc2UgdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBjbG9zZWQuCisgICAgICogUmVwcm9kdWNlciBmb3IgSlJGQ0FGLTEzNDQuCisgICAgICogPHA+CisgICAgICogVUMtMyA6IFRyeSB0byBjbG9zZSB0aGUgcmVzcG9uc2UgLSB1bmRlcmx5aW5nIGV4Y2VwdGlvbiBzaG91bGQgYmUgcmVwb3J0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VVbnJlYWRSZXNwb25zZVdpdGhFbnRpdHlTdHJlYW1UaGF0RmFpbHNUb0Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtID0gbmV3IENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0oKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzcG9uc2UvY29ycnVwdGVkIik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihuZXcgQ2xpZW50UmVzcG9uc2VGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eVN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuYnVpbGRHZXQoKS5pbnZva2UoKTsKKyAgICAgICAgZW50aXR5U3RyZWFtLnNldENvcnJ1cHRDbG9zZSh0cnVlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiBjbG9zaW5nIHRoZSBjb250ZXh0IGFuZCB1bmRlcmx5aW5nIHN0cmVhbSB0aHJvd3MgYW4gSU9FeGNlcHRpb24uIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocGUuZ2V0Q2F1c2UoKSwgaW5zdGFuY2VPZihJT0V4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9TaHV0ZG93bkhvb2tNZW1vcnlMZWFrVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvU2h1dGRvd25Ib29rTWVtb3J5TGVha1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmY0YjVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvU2h1dGRvd25Ib29rTWVtb3J5TGVha1Rlc3QuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50TGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yLkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBFbnN1cmUgSmVyc2V5IGNvbm5lY3RvcnMgZG8gbm90IGxlYWsgcmVzb3VyY2VzCisgKiBpbiBjYXNlIG11bHRpcGxlIGNsaWVudCBydW50aW1lIGluc3RhbmNlcyBhcmUgYmVpbmcgY3JlYXRlZC4KKyAqCisgKiBPbiBteSBsYXB0b3AsIDEwMDAgaXRlcmF0aW9ucyB3YXMgc3VmZmljaWVudCB0byBjYXVzZQorICogYSBtZW1vcnkgbGVhayB1bnRpbCBKRVJTRVktMjY4OCBnb3QgZml4ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTaHV0ZG93bkhvb2tNZW1vcnlMZWFrVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAidGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElURVJBVElPTlMgPSAxMDAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlcjsKKworICAgIHB1YmxpYyBTaHV0ZG93bkhvb2tNZW1vcnlMZWFrVGVzdChmaW5hbCBDb25uZWN0b3JQcm92aWRlciBjcCkgeworICAgICAgICBjb25uZWN0b3JQcm92aWRlciA9IGNwOworICAgIH0KKworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxDb25uZWN0b3JQcm92aWRlcltdPiBjb25uZWN0aW9uUHJvdmlkZXJzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQ29ubmVjdG9yUHJvdmlkZXJbXVtdIHsKKyAgICAgICAgICAgICAgICB7bmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpfSwKKyAgICAgICAgICAgICAgICB7bmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKX0sCisgICAgICAgICAgICAgICAge25ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpfSwKKyAgICAgICAgICAgICAgICB7bmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAUGF0aChQQVRIKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJVbnN0YWJsZSwgaWdub3JlZCBmb3Igbm93IikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50RG9lc05vdExlYWtSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGxpc3RlbmVyc0luaXRpYWxpemVkID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgbGlzdGVuZXJzQ2xvc2VkID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KFBBVEgpLnByb3BlcnR5KCJhbm90aGVyIiwgInJ1bnRpbWUiKS5yZWdpc3RlcihuZXcgQ2xpZW50TGlmZWN5Y2xlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Jbml0KCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNJbml0aWFsaXplZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsb3NlKCkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNDbG9zZWQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbGxlY3Rpb24gc2h1dGRvd25Ib29rcyA9IGdldFNodXRkb3duSG9va3MoY2xpZW50KCkpOworCisgICAgICAgIGFzc2VydFRoYXQoU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIiVzOiBudW1iZXIgb2YgaW5pdGlhbGl6ZWQgbGlzdGVuZXJzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBudW1iZXIgb2YgdG90YWwgcmVxdWVzdCBjb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JQcm92aWRlci5nZXRDbGFzcygpKSwKKyAgICAgICAgICAgICAgICBsaXN0ZW5lcnNJbml0aWFsaXplZC5nZXQoKSwgaXMoSVRFUkFUSU9OUykpOworCisvLyAgICAgIHRoZSBmb2xsb3dpbmcgY2hlY2sgaXMgZnJhZ2lsZSwgYXMgR0MgY291bGQgYnJlYWsgaXQgZWFzaWx5CisvLyAgICAgICAgYXNzZXJ0VGhhdChTdHJpbmcuZm9ybWF0KAorLy8gICAgICAgICAgICAgICAgIiVzOiBudW1iZXIgb2YgY2xvc2VkIGxpc3RlbmVycyBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgbnVtYmVyIG9mIG1pc3NpbmcgaG9va3MiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JQcm92aWRlci5nZXRDbGFzcygpKSwKKy8vICAgICAgICAgICAgICAgIGxpc3RlbmVyc0Nsb3NlZC5nZXQoKSwgaXMoSVRFUkFUSU9OUyAtIHNodXRkb3duSG9va3Muc2l6ZSgpKSk7CisKKyAgICAgICAgY2xpZW50KCkuY2xvc2UoKTsgICAgICAvLyBjbGVhbiB1cCB0aGUgcmVzdAorCisgICAgICAgIGFzc2VydFRoYXQoU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICIlczogbnVtYmVyIG9mIGNsb3NlZCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgdG90YWwgcmVxdWVzdHMgbWFkZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3JQcm92aWRlci5nZXRDbGFzcygpKSwKKyAgICAgICAgICAgICAgICBsaXN0ZW5lcnNDbG9zZWQuZ2V0KCksIGlzKElURVJBVElPTlMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gZ2V0U2h1dGRvd25Ib29rcyhqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50IGNsaWVudCkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgSmVyc2V5Q2xpZW50IGplcnNleUNsaWVudCA9IChKZXJzZXlDbGllbnQpIGNsaWVudDsKKyAgICAgICAgRmllbGQgc2h1dGRvd25Ib29rc0ZpZWxkID0gSmVyc2V5Q2xpZW50LmNsYXNzLmdldERlY2xhcmVkRmllbGQoInNodXRkb3duSG9va3MiKTsKKyAgICAgICAgc2h1dGRvd25Ib29rc0ZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbikgc2h1dGRvd25Ib29rc0ZpZWxkLmdldChqZXJzZXlDbGllbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1RpbWVvdXRUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9UaW1lb3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzMyMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9UaW1lb3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lb3V0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lb3V0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGltZW91dCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZW91dCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRpbWVvdXRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAyMDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGYXN0KCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xvdygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldCgidGVzdC90aW1lb3V0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgZmFpbCgiVGltZW91dCBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAoIShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9IdHRwUGF0Y2hUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3IvSHR0cFBhdGNoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ODZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3IvSHR0cFBhdGNoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uU3RhZ2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlBBVENIOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3Rvci5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yLk5ldHR5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBIdHRwUGF0Y2hUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSZXF1ZXN0SGVhZGVyTW9kaWZpY2F0aW9uc1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICAgICAgICAgIC8vIHtIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuY2xhc3N9LCAvLyBjYW5ub3QgcHJvY2VzcyBQQVRDSCB3aXRob3V0IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgIHtHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuY2xhc3N9LAorICAgICAgICAgICAgICAgIHtKZXR0eUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzfSwgLy8gdW5zdGFibGUuCisgICAgICAgICAgICAgICAge0FwYWNoZUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzfSwKKyAgICAgICAgICAgICAgICB7R3JpenpseUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzfSwKKyAgICAgICAgICAgICAgICB7TmV0dHlDb25uZWN0b3JQcm92aWRlci5jbGFzc30sCisgICAgICAgICAgICAgICAge0pka0Nvbm5lY3RvclByb3ZpZGVyLmNsYXNzfSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyOworCisgICAgcHVibGljIEh0dHBQYXRjaFRlc3QoQ2xhc3M8PyBleHRlbmRzIENvbm5lY3RvclByb3ZpZGVyPiBjb25uZWN0b3JQcm92aWRlckNsYXNzKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLmNvbm5lY3RvclByb3ZpZGVyID0gY29ubmVjdG9yUHJvdmlkZXJDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5XQVJOSU5HLmludFZhbHVlKCkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFBhdGNoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZykgeworICAgICAgICBjbGllbnRDb25maWcuY29ubmVjdG9yUHJvdmlkZXIoY29ubmVjdG9yUHJvdmlkZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGNoUmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkubWV0aG9kKCJQQVRDSCIsIEVudGl0eS50ZXh0KCJwYXRjaCIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGF0Y2giLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGNoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5tZXRob2QoIlBBVENIIiwgRW50aXR5LnRleHQoInBhdGNoIiksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRjaCIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRjaEdlbmVyaWNUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5tZXRob2QoIlBBVENIIiwgRW50aXR5LnRleHQoInBhdGNoIiksIG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkgeworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGNoIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUGF0Y2hSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmFzeW5jKCkubWV0aG9kKCJQQVRDSCIsIEVudGl0eS50ZXh0KCJwYXRjaCIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGF0Y2giLCByZXNwb25zZS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUGF0Y2hFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRnV0dXJlPFN0cmluZz4gcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYXN5bmMoKS5tZXRob2QoIlBBVENIIiwgRW50aXR5LnRleHQoInBhdGNoIiksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRjaCIsIHJlc3BvbnNlLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1BhdGNoR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRnV0dXJlPFN0cmluZz4gcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYXN5bmMoKS5tZXRob2QoIlBBVENIIiwgRW50aXR5LnRleHQoInBhdGNoIiksIG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkgeworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGNoIiwgcmVzcG9uc2UuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ4UGF0Y2hSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb21wbGV0aW9uU3RhZ2U8UmVzcG9uc2U+IHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnJ4KCkubWV0aG9kKCJQQVRDSCIsIEVudGl0eS50ZXh0KCJwYXRjaCIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS50b0NvbXBsZXRhYmxlRnV0dXJlKCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGNoIiwgcmVzcG9uc2UudG9Db21wbGV0YWJsZUZ1dHVyZSgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnhQYXRjaEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5yeCgpLm1ldGhvZCgiUEFUQ0giLCBFbnRpdHkudGV4dCgicGF0Y2giKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGNoIiwgcmVzcG9uc2UudG9Db21wbGV0YWJsZUZ1dHVyZSgpLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSeFBhdGNoR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tcGxldGlvblN0YWdlPFN0cmluZz4gcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucngoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZCgiUEFUQ0giLCBFbnRpdHkudGV4dCgicGF0Y2giKSwgbmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGNoIiwgcmVzcG9uc2UudG9Db21wbGV0YWJsZUZ1dHVyZSgpLmdldCgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRjaFJlc291cmNlIHsKKworICAgICAgICBAUEFUQ0gKKyAgICAgICAgcHVibGljIFN0cmluZyBwYXRjaChTdHJpbmcgZW50aXR5KSB7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU0VSVkVSOiBwYXRjaCByZXF1ZXN0IHJlY2VpdmVkLiIpOworCisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL1JlcXVlc3RIZWFkZXJNb2RpZmljYXRpb25zVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL1JlcXVlc3RIZWFkZXJNb2RpZmljYXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWI0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3IvUmVxdWVzdEhlYWRlck1vZGlmaWNhdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkFzeW5jSW52b2tlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5IdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3IuSmV0dHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBKRVJTRVktMjIwNiByZXByb2R1Y2VyCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0SGVhZGVyTW9kaWZpY2F0aW9uc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlcXVlc3RIZWFkZXJNb2RpZmljYXRpb25zVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gR1pJUCA9IGZhbHNlOyAvLyBjaGFuZ2UgdG8gdHJ1ZSB3aGVuIEpFUlNFWS0yMzQxIGZpeGVkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBEVU1QX0VOVElUWSA9IGZhbHNlOyAvLyBJIGhhdmUgdHJvdWJsZXMgdG8gZHVtcCBlbnRpdHkgd2l0aCBhc3luYyBqZXR0eSEKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVTVElPTiA9ICJRVUVTVElPTiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFOU1dFUiA9ICJBTlNXRVIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0hFQURFUl9OQU1FX0NMSUVOVCA9ICJDbGllbnQtUHJvcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX1ZBTFVFX0NMSUVOVCA9ICJDbGllbnQtVmFsdWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0hFQURFUl9OQU1FX0ZJTFRFUiA9ICJGaWx0ZXItUHJvcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX1ZBTFVFX0ZJTFRFUiA9ICJGaWx0ZXItVmFsdWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0hFQURFUl9OQU1FX0lOVEVSQ0VQVE9SID0gIkljZXB0b3ItUHJvcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX1ZBTFVFX0lOVEVSQ0VQVE9SID0gIkljZXB0b3ItVmFsdWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0hFQURFUl9OQU1FX01CVyA9ICJNYnctUHJvcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX1ZBTFVFX01CVyA9ICJNYnctVmFsdWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0hFQURFUl9NT0RJRklDQVRJT05fU1VQUE9SVEVEID0gIm1vZGlmaWNhdGlvblN1cHBvcnRlZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAiL3Jlc291cmNlIjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB7MH0gLyBtb2RpZmljYXRpb25TdXBwb3J0ZWQ9IHsxfSAvIGFkZEhlYWRlcj0gezJ9IikKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAge0h0dHBVcmxDb25uZWN0b3JQcm92aWRlci5jbGFzcywgdHJ1ZSwgZmFsc2V9LAorICAgICAgICAgICAgICAgIHtHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuY2xhc3MsIGZhbHNlLCBmYWxzZX0sIC8vIGNoYW5nZSB0byB0cnVlIHdoZW4gSkVSU0VZLTIzNDEgZml4ZWQKKyAgICAgICAgICAgICAgICB7SmV0dHlDb25uZWN0b3JQcm92aWRlci5jbGFzcywgZmFsc2UsIGZhbHNlfSwgLy8gY2hhbmdlIHRvIHRydWUgd2hlbiBKRVJTRVktMjM0MSBmaXhlZAorICAgICAgICAgICAgICAgIHtBcGFjaGVDb25uZWN0b3JQcm92aWRlci5jbGFzcywgZmFsc2UsIGZhbHNlfSwgLy8gY2hhbmdlIHRvIHRydWUgd2hlbiBKRVJTRVktMjM0MSBmaXhlZAorICAgICAgICAgICAgICAgIHtIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuY2xhc3MsIHRydWUsIHRydWV9LAorICAgICAgICAgICAgICAgIHtHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuY2xhc3MsIGZhbHNlLCB0cnVlfSwgLy8gY2hhbmdlIHRvIHRydWUgd2hlbiBKRVJTRVktMjM0MSBmaXhlZAorICAgICAgICAgICAgICAgIHtKZXR0eUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzLCBmYWxzZSwgdHJ1ZX0sIC8vIGNoYW5nZSB0byB0cnVlIHdoZW4gSkVSU0VZLTIzNDEgZml4ZWQKKyAgICAgICAgICAgICAgICB7QXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIuY2xhc3MsIGZhbHNlLCB0cnVlfSwgLy8gY2hhbmdlIHRvIHRydWUgd2hlbiBKRVJTRVktMjM0MSBmaXhlZAorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtb2RpZmljYXRpb25TdXBwb3J0ZWQ7IC8vIHJlbW92ZSB3aGVuIEpFUlNFWS0yMzQxIGZpeGVkCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFkZEhlYWRlcjsKKworICAgIHB1YmxpYyBSZXF1ZXN0SGVhZGVyTW9kaWZpY2F0aW9uc1Rlc3QoQ2xhc3M8PyBleHRlbmRzIENvbm5lY3RvclByb3ZpZGVyPiBjb25uZWN0b3JQcm92aWRlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmljYXRpb25TdXBwb3J0ZWQsIGJvb2xlYW4gYWRkSGVhZGVyKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLmNvbm5lY3RvclByb3ZpZGVyID0gY29ubmVjdG9yUHJvdmlkZXJDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICB0aGlzLm1vZGlmaWNhdGlvblN1cHBvcnRlZCA9IG1vZGlmaWNhdGlvblN1cHBvcnRlZDsKKyAgICAgICAgdGhpcy5hZGRIZWFkZXIgPSBhZGRIZWFkZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLldBUk5JTkcuaW50VmFsdWUoKSk7CisKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgaWYgKERVTVBfRU5USVRZKSB7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKS5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuSEVBREVSU19PTkxZKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjbGllbnRDb25maWcpIHsKKyAgICAgICAgY2xpZW50Q29uZmlnLnJlZ2lzdGVyKE15Q2xpZW50UmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgIGNsaWVudENvbmZpZy5yZWdpc3RlcihuZXcgTXlXcml0ZXJJbnRlcmNlcHRvcihhZGRIZWFkZXIpKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLnJlZ2lzdGVyKG5ldyBNeU1lc3NhZ2VCb2R5V3JpdGVyKGFkZEhlYWRlcikpOworICAgICAgICBjbGllbnRDb25maWcuY29ubmVjdG9yUHJvdmlkZXIoY29ubmVjdG9yUHJvdmlkZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhcm5pbmdMb2dnZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXF1ZXN0QnVpbGRlcigpLnBvc3QocmVxdWVzdEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2UocmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhcm5pbmdMb2dnZWRBc3luYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBc3luY0ludm9rZXIgYXN5bmNJbnZva2VyID0gcmVxdWVzdEJ1aWxkZXIoKS5hc3luYygpOworICAgICAgICBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gYXN5bmNJbnZva2VyLnBvc3QocmVxdWVzdEVudGl0eSgpKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNwb25zZUZ1dHVyZS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2UocmVzcG9uc2UpOworICAgIH0KKworICAgIHByaXZhdGUgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3RCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0KFBBVEgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoUkVRVUVTVF9IRUFERVJfTkFNRV9DTElFTlQsIFJFUVVFU1RfSEVBREVSX1ZBTFVFX0NMSUVOVCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKFJFUVVFU1RfSEVBREVSX01PRElGSUNBVElPTl9TVVBQT1JURUQsIG1vZGlmaWNhdGlvblN1cHBvcnRlZCAmJiBhZGRIZWFkZXIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiaGVsbG8iLCAiZG91YmxlIikuaGVhZGVyKCJoZWxsbyIsICJ2YWx1ZSIpOworICAgIH0KKworICAgIHByaXZhdGUgRW50aXR5PE15RW50aXR5PiByZXF1ZXN0RW50aXR5KCkgeworICAgICAgICByZXR1cm4gRW50aXR5LnRleHQobmV3IE15RW50aXR5KFFVRVNUSU9OKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc3BvbnNlKFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIGlmICghbW9kaWZpY2F0aW9uU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgVU5TRU5UX0hFQURFUl9DSEFOR0VTID0gIlVuc2VudCBoZWFkZXIgY2hhbmdlcyI7CisgICAgICAgICAgICBMb2dSZWNvcmQgbG9nUmVjb3JkID0gZmluZExvZ1JlY29yZChVTlNFTlRfSEVBREVSX0NIQU5HRVMpOworICAgICAgICAgICAgaWYgKGFkZEhlYWRlcikgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk1pc3NpbmcgTG9nUmVjb3JkIGZvciBtZXNzYWdlICciICsgVU5TRU5UX0hFQURFUl9DSEFOR0VTICsgIicuIiwgbG9nUmVjb3JkKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGxvZ1JlY29yZC5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKFJFUVVFU1RfSEVBREVSX05BTUVfSU5URVJDRVBUT1IpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGxvZ1JlY29yZC5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKFJFUVVFU1RfSEVBREVSX05BTUVfTUJXKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIlVuZXhwZWN0ZWQgTG9nUmVjb3JkIGZvciBtZXNzYWdlICciICsgVU5TRU5UX0hFQURFUl9DSEFOR0VTICsgIicuIiwgbG9nUmVjb3JkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFOU1dFUiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExvZ1JlY29yZCBmaW5kTG9nUmVjb3JkKFN0cmluZyBtZXNzYWdlQ29udGFpbnMpIHsKKyAgICAgICAgZm9yIChmaW5hbCBMb2dSZWNvcmQgcmVjb3JkIDogZ2V0TG9nZ2VkUmVjb3JkcygpKSB7CisgICAgICAgICAgICBpZiAocmVjb3JkLmdldE1lc3NhZ2UoKS5jb250YWlucyhtZXNzYWdlQ29udGFpbnMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAUGF0aChQQVRIKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGhhbmRsZShJbnB1dFN0cmVhbSBxdWVzdGlvblN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKFJFUVVFU1RfSEVBREVSX05BTUVfQ0xJRU5UKSBTdHJpbmcgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oUkVRVUVTVF9IRUFERVJfTkFNRV9GSUxURVIpIFN0cmluZyBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbShSRVFVRVNUX0hFQURFUl9OQU1FX0lOVEVSQ0VQVE9SKSBTdHJpbmcgaW50ZXJjZXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbShSRVFVRVNUX0hFQURFUl9OQU1FX01CVykgU3RyaW5nIG1idywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKFJFUVVFU1RfSEVBREVSX01PRElGSUNBVElPTl9TVVBQT1JURUQpIGJvb2xlYW4gbW9kaWZpY2F0aW9uU3VwcG9ydGVkKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9IRUFERVJfVkFMVUVfQ0xJRU5ULCBjbGllbnQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJFUVVFU1RfSEVBREVSX1ZBTFVFX0ZJTFRFUiwgZmlsdGVyKTsKKyAgICAgICAgICAgIGlmIChtb2RpZmljYXRpb25TdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9IRUFERVJfVkFMVUVfSU5URVJDRVBUT1IsIGludGVyY2VwdG9yKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9IRUFERVJfVkFMVUVfTUJXLCBtYncpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFFVRVNUSU9OLCBuZXcgU2Nhbm5lcihHWklQID8gbmV3IEdaSVBJbnB1dFN0cmVhbShxdWVzdGlvblN0cmVhbSkgOiBxdWVzdGlvblN0cmVhbSkubmV4dExpbmUoKSk7CisgICAgICAgICAgICByZXR1cm4gQU5TV0VSOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhZGRIZWFkZXI7CisKKyAgICAgICAgcHVibGljIE15V3JpdGVySW50ZXJjZXB0b3IoYm9vbGVhbiBhZGRIZWFkZXIpIHsKKyAgICAgICAgICAgIHRoaXMuYWRkSGVhZGVyID0gYWRkSGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGFkZEhlYWRlcikgeworICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0SGVhZGVycygpLmFkZChSRVFVRVNUX0hFQURFUl9OQU1FX0lOVEVSQ0VQVE9SLCBSRVFVRVNUX0hFQURFUl9WQUxVRV9JTlRFUkNFUFRPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoR1pJUCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKG5ldyBHWklQT3V0cHV0U3RyZWFtKGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNsaWVudFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZChSRVFVRVNUX0hFQURFUl9OQU1FX0ZJTFRFUiwgUkVRVUVTVF9IRUFERVJfVkFMVUVfRklMVEVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eShQcmlvcml0aWVzLkVOVElUWV9DT0RFUikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TWVzc2FnZUJvZHlXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxNeUVudGl0eT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhZGRIZWFkZXI7CisKKyAgICAgICAgcHVibGljIE15TWVzc2FnZUJvZHlXcml0ZXIoYm9vbGVhbiBhZGRIZWFkZXIpIHsKKyAgICAgICAgICAgIHRoaXMuYWRkSGVhZGVyID0gYWRkSGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzIHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShNeUVudGl0eSBvLCBDbGFzcyB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsgLy9pZ25vcmVkCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhNeUVudGl0eSBvLCBDbGFzcyB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXAgaHR0cEhlYWRlcnMsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoYWRkSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgaHR0cEhlYWRlcnMuYWRkKFJFUVVFU1RfSEVBREVSX05BTUVfTUJXLCBSRVFVRVNUX0hFQURFUl9WQUxVRV9NQlcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKG8uZ2V0VmFsdWUoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFbnRpdHkgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBNeUVudGl0eSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNeUVudGl0eShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BYnN0cmFjdENvbm5lY3RvclNlcnZlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvQWJzdHJhY3RDb25uZWN0b3JTZXJ2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzMTVmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvQWJzdHJhY3RDb25uZWN0b3JTZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3Iuc3NsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Tc2xDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3Rvci5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5CeXRlU3RyZWFtczsKKworLyoqCisgKiBTU0wgY29ubmVjdG9yIGhvc3RuYW1lIHZlcmlmaWNhdGlvbiB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbm5lY3RvclNlcnZlclRlc3QgeworCisgICAgLy8gRGVmYXVsdCB0cnVzdHN0b3JlIGFuZCBrZXlzdG9yZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfVFJVU1RfU1RPUkUgPSAidHJ1c3RzdG9yZS1sb2NhbGhvc3QtY2xpZW50IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0tFWV9TVE9SRSA9ICJrZXlzdG9yZS1sb2NhbGhvc3Qtc2VydmVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0tFWV9TVE9SRSA9ICJrZXlzdG9yZS1jbGllbnQiOworCisgICAgLyoqCisgICAgICogVGVzdCBwYXJhbWV0ZXJzIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0ZXN0IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIntpbmRleH06IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7bmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpfSwKKyAgICAgICAgICAgICAgICB7bmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpfSwKKyAgICAgICAgICAgICAgICB7bmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKX0sCisgICAgICAgICAgICAgICAge25ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMCkKKyAgICBwdWJsaWMgQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yUHJvdmlkZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBzZXJ2ZXJHdWFyZCA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIFNlcnZlciBzZXJ2ZXIgPSBudWxsOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmVyR3VhcmQpIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdCBydW4gc3luYyBpc3N1ZTogQW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgU1NMLXNlY3VyZWQgSFRUUCB0ZXN0IHNlcnZlciBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJ2ZXIgPSBTZXJ2ZXIuc3RhcnQoc2VydmVyS2V5U3RvcmUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcnZlckd1YXJkKSB7CisgICAgICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUZXN0IHJ1biBzeW5jIGlzc3VlOiBUaGVyZSBpcyBubyBTU0wtc2VjdXJlZCBIVFRQIHRlc3Qgc2VydmVyIHRvIHN0b3AuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpOworICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBTU0xDb250ZXh0IGdldFNzbENvbnRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSB0cnVzdFN0b3JlID0gU3NsQ29ubmVjdG9yQ29uZmlndXJhdGlvblRlc3QuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShjbGllbnRUcnVzdFN0b3JlKCkpOworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBrZXlTdG9yZSA9IFNzbENvbm5lY3RvckNvbmZpZ3VyYXRpb25UZXN0LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oQ0xJRU5UX0tFWV9TVE9SRSk7CisgICAgICAgIHJldHVybiBTc2xDb25maWd1cmF0b3IubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlQnl0ZXMoQnl0ZVN0cmVhbXMudG9CeXRlQXJyYXkodHJ1c3RTdG9yZSkpCisgICAgICAgICAgICAgICAgLnRydXN0U3RvcmVQYXNzd29yZCgiYXNkZmdoIikKKyAgICAgICAgICAgICAgICAua2V5U3RvcmVCeXRlcyhCeXRlU3RyZWFtcy50b0J5dGVBcnJheShrZXlTdG9yZSkpCisgICAgICAgICAgICAgICAgLmtleVBhc3N3b3JkKCJhc2RmZ2giKQorICAgICAgICAgICAgICAgIC5jcmVhdGVTU0xDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJLZXlTdG9yZSgpIHsKKyAgICAgICAgcmV0dXJuIFNFUlZFUl9LRVlfU1RPUkU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBjbGllbnRUcnVzdFN0b3JlKCkgeworICAgICAgICByZXR1cm4gQ0xJRU5UX1RSVVNUX1NUT1JFOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvQXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvQXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZjZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3Iuc3NsOworCisvKioKKyAqIEEgcnVudGltZSBleGNlcHRpb24gcmVwcmVzZW50aW5nIGEgZmFpbHVyZSB0byBwcm92aWRlIGNvcnJlY3QgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGF1dGhlbnRpY2F0aW9uIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIGVycm9yIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIHJlYWxtICAgc2VjdXJpdHkgcmVhbG0uCisgICAgICovCisgICAgcHVibGljIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcmVhbG0pIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIHRoaXMucmVhbG0gPSByZWFsbTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyByZWFsbSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBHZXQgc2VjdXJpdHkgcmVhbG0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlY3VyaXR5IHJlYWxtLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbG0oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWxtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvQXV0aGVudGljYXRpb25FeGNlcHRpb25NYXBwZXIuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvQXV0aGVudGljYXRpb25FeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkxMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3Iuc3NsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBNYXAgYW4gYXV0aGVudGljYXRpb24gZXhjZXB0aW9uIHRvIGFuIEhUVFAgNDAxIHJlc3BvbnNlLAorICogb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIHJlYWxtIGZvciBhIGNyZWRlbnRpYWxzIGNoYWxsZW5nZSBhdCB0aGUgY2xpZW50LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmIChlLmdldFJlYWxtKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoU3RhdHVzLlVOQVVUSE9SSVpFRCkKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJCYXNpYyByZWFsbT1cIiIgKyBlLmdldFJlYWxtKCkgKyAiXCIiKQorICAgICAgICAgICAgICAgICAgICAudHlwZSgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoZS5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoU3RhdHVzLlVOQVVUSE9SSVpFRCkKKyAgICAgICAgICAgICAgICAgICAgLnR5cGUoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KGUuZ2V0TWVzc2FnZSgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvUm9vdFJlc291cmNlLmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1Jvb3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjY2JmOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1Jvb3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3Iuc3NsOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkJhc2U2NDsKKworLyoqCisgKiBTaW1wbGUgcmVzb3VyY2UgZGVtb25zdHJhdGluZyBsb3cgbGV2ZWwgYXBwcm9hY2ggb2YgZ2V0dGluZyB1c2VyIGNyZWRlbnRpYWxzLgorICoKKyAqIEEgYmV0dGVyIHdheSB3b3VsZCBiZSBpbmplY3Rpbmcge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0fS4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUm9vdFJlc291cmNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSb290UmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAvKioKKyAgICAgKiBTZXJ2ZWQgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gIkpFUlNFWSBIVFRQUyBFWEFNUExFXG4iOworCisgICAgLyoqCisgICAgICogU2VydmUgY29udGVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXJzIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgKiBAcmV0dXJuIGNvbnRlbnQgKHNlZSB7QGxpbmsgI0NPTlRFTlR9KS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgLy8geW91IGNhbiBnZXQgdXNlcm5hbWUgZm9ybSBIdHRwSGVhZGVycworICAgICAgICBMT0dHRVIuaW5mbygiU2VydmljZTogR0VUIC8gVXNlcjogIiArIGdldFVzZXIoaGVhZGVycykpOworCisgICAgICAgIHJldHVybiBDT05URU5UOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFVzZXIoSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAvLyB0aGlzIGlzIGEgdmVyeSBtaW5pbWFsaXN0aWMgYW5kICJuYWl2ZSIgY29kZTsKKyAgICAgICAgLy8gaWYgeW91IHBsYW4gdG8gdXNlIGl0LCBhZGQgdGhlIG5lY2Vzc2FyeSBjaGVja3MKKyAgICAgICAgU3RyaW5nIGF1dGggPSBoZWFkZXJzLmdldFJlcXVlc3RIZWFkZXIoImF1dGhvcml6YXRpb24iKS5nZXQoMCk7CisKKyAgICAgICAgYXV0aCA9IGF1dGguc3Vic3RyaW5nKCJCYXNpYyAiLmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gQmFzZTY0LmRlY29kZUFzU3RyaW5nKGF1dGgpLnNwbGl0KCI6Iik7CisKKyAgICAgICAgLy8gU3RyaW5nIHVzZXJuYW1lID0gdmFsdWVzWzBdOworICAgICAgICAvLyBTdHJpbmcgcGFzc3dvcmQgPSB2YWx1ZXNbMV07CisgICAgICAgIHJldHVybiB2YWx1ZXNbMF07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9TZWN1cml0eUZpbHRlci5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9TZWN1cml0eUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGQ0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NlY3VyaXR5RmlsdGVyLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3Iuc3NsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5CYXNlNjQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CisKKy8qKgorICogU2ltcGxlIGF1dGhlbnRpY2F0aW9uIGZpbHRlci4KKyAqCisgKiBSZXR1cm5zIHJlc3BvbnNlIHdpdGggaHR0cCBzdGF0dXMgNDAxIHdoZW4gcHJvcGVyIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBwcm92aWRlZCBpbiBpbmNvbWluZyByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAc2VlIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIKKyAqLworQFByb3ZpZGVyCitAUHJlTWF0Y2hpbmcKK3B1YmxpYyBjbGFzcyBTZWN1cml0eUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgLyoqCisgICAgICogU2VjdXJpdHkgcmVhbG0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTE0gPSAiVGVzdCBIVFRQUyBBdXRoZW50aWNhdGlvbiBSRUFMTSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoU2VjdXJpdHlGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgZmlsdGVyQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVXNlciB1c2VyID0gYXV0aGVudGljYXRlKGZpbHRlckNvbnRleHQuZ2V0UmVxdWVzdCgpKTsKKyAgICAgICAgZmlsdGVyQ29udGV4dC5zZXRTZWN1cml0eUNvbnRleHQobmV3IEF1dGhvcml6YXRpb25Db250ZXh0KHVzZXIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFVzZXIgYXV0aGVudGljYXRlKFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAvLyBFeHRyYWN0IGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzCisgICAgICAgIFN0cmluZyBhdXRoZW50aWNhdGlvbiA9ICgoQ29udGFpbmVyUmVxdWVzdCkgcmVxdWVzdCkuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT04pOworICAgICAgICBpZiAoYXV0aGVudGljYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKCJBdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyBhcmUgcmVxdWlyZWQiLCBSRUFMTSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhdXRoZW50aWNhdGlvbi5zdGFydHNXaXRoKCJCYXNpYyAiKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGNoZWNrcyBzaG91bGQgYmUgZG9uZSBoZXJlCisgICAgICAgICAgICAvLyAiT25seSBIVFRQIEJhc2ljIGF1dGhlbnRpY2F0aW9uIGlzIHN1cHBvcnRlZCIKKyAgICAgICAgfQorICAgICAgICBhdXRoZW50aWNhdGlvbiA9IGF1dGhlbnRpY2F0aW9uLnN1YnN0cmluZygiQmFzaWMgIi5sZW5ndGgoKSk7CisgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IEJhc2U2NC5kZWNvZGVBc1N0cmluZyhhdXRoZW50aWNhdGlvbikuc3BsaXQoIjoiKTsKKyAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPCAyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oNDAwKTsKKyAgICAgICAgICAgIC8vICJJbnZhbGlkIHN5bnRheCBmb3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIgorICAgICAgICB9CisgICAgICAgIFN0cmluZyB1c2VybmFtZSA9IHZhbHVlc1swXTsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gdmFsdWVzWzFdOworICAgICAgICBpZiAoKHVzZXJuYW1lID09IG51bGwpIHx8IChwYXNzd29yZCA9PSBudWxsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwMCk7CisgICAgICAgICAgICAvLyAiTWlzc2luZyB1c2VybmFtZSBvciBwYXNzd29yZCIKKyAgICAgICAgfQorCisgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBleHRyYWN0ZWQgY3JlZGVudGlhbHMKKyAgICAgICAgVXNlciB1c2VyOworCisgICAgICAgIGlmICgidXNlciIuZXF1YWxzKHVzZXJuYW1lKSAmJiAicGFzc3dvcmQiLmVxdWFscyhwYXNzd29yZCkpIHsKKyAgICAgICAgICAgIHVzZXIgPSBuZXcgVXNlcigidXNlciIsICJ1c2VyIik7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiVVNFUiBBVVRIRU5USUNBVEVEIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiVVNFUiBOT1QgQVVUSEVOVElDQVRFRCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkIiwgUkVBTE0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1c2VyOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQXV0aG9yaXphdGlvbkNvbnRleHQgaW1wbGVtZW50cyBTZWN1cml0eUNvbnRleHQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgVXNlciB1c2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIFByaW5jaXBhbCBwcmluY2lwYWw7CisKKyAgICAgICAgcHVibGljIEF1dGhvcml6YXRpb25Db250ZXh0KGZpbmFsIFVzZXIgdXNlcikgeworICAgICAgICAgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgICAgICAgICAgIHRoaXMucHJpbmNpcGFsID0gbmV3IFByaW5jaXBhbCgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZXIudXNlcm5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmluY2lwYWw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7CisgICAgICAgICAgICByZXR1cm4gKHJvbGUuZXF1YWxzKHVzZXIucm9sZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgcmV0dXJuICJodHRwcyIuZXF1YWxzKHVyaUluZm8uZ2V0UmVxdWVzdFVyaSgpLmdldFNjaGVtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29udGV4dC5CQVNJQ19BVVRIOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXNlciB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB1c2VybmFtZTsKKyAgICAgICAgcHVibGljIFN0cmluZyByb2xlOworCisgICAgICAgIHB1YmxpYyBVc2VyKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICAgICAgICAgIHRoaXMucm9sZSA9IHJvbGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NlcnZlci5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9TZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNjYjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9TZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3Rvci5zc2w7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5LnNzbC5TU0xDb250ZXh0Q29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5zc2wuU1NMRW5naW5lQ29uZmlndXJhdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uQnl0ZVN0cmVhbXM7CisKKy8qKgorICogQSBzaW1wbGUgU1NMLXNlY3VyZWQgSFRUUCBzZXJ2ZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgU2VydmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNlcnZlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9UUlVTVF9TVE9SRSA9ICJ0cnVzdHN0b3JlLXNlcnZlciI7CisKKyAgICAvKioKKyAgICAgKiBCYXNlIHNlcnZlciBVUkkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBnZXRCYXNlVVJJKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2ZXIgd2ViU2VydmVyOworCisgICAgcHJpdmF0ZSBTZXJ2ZXIoZmluYWwgSHR0cFNlcnZlciB3ZWJTZXJ2ZXIpIHsKKyAgICAgICAgdGhpcy53ZWJTZXJ2ZXIgPSB3ZWJTZXJ2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGdldEJhc2VVUkkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHBzOi8vbG9jYWxob3N0LyIpLnBvcnQoZ2V0UG9ydCg4NDYzKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UG9ydChpbnQgZGVmYXVsdFBvcnQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBvcnQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydCIpOworICAgICAgICBpZiAobnVsbCAhPSBwb3J0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHBvcnQpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZygiVmFsdWUgb2YgamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0IHByb3BlcnR5IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIHZhbGlkIHBvc2l0aXZlIGludGVnZXIgWyIgKyBwb3J0ICsgIl0uIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFJldmVydGluZyB0byBkZWZhdWx0IFsiICsgZGVmYXVsdFBvcnQgKyAiXS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgU1NMLXNlY3VyZWQgSFRUUCB0ZXN0IHNlcnZlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaW4gY2FzZSB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSByZWFkaW5nIHNlcnZlciBrZXkgc3RvcmUgb3IgdHJ1c3Qgc3RvcmUuCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgc3RhcnRlZCBTU0wtc2VjdXJlZCBIVFRQIHRlc3Qgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyIHN0YXJ0KFN0cmluZyBrZXlzdG9yZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZSA9IFNlcnZlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKFNFUlZFUl9UUlVTVF9TVE9SRSk7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGtleVN0b3JlID0gU2VydmVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oa2V5c3RvcmUpOworCisgICAgICAgIC8vIEdyaXp6bHkgc3NsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgU1NMQ29udGV4dENvbmZpZ3VyYXRvciBzc2xDb250ZXh0ID0gbmV3IFNTTENvbnRleHRDb25maWd1cmF0b3IoKTsKKworICAgICAgICAvLyBzZXQgdXAgc2VjdXJpdHkgY29udGV4dAorICAgICAgICBzc2xDb250ZXh0LnNldEtleVN0b3JlQnl0ZXMoQnl0ZVN0cmVhbXMudG9CeXRlQXJyYXkoa2V5U3RvcmUpKTsgIC8vIGNvbnRhaW5zIHNlcnZlciBrZXkgcGFpcgorICAgICAgICBzc2xDb250ZXh0LnNldEtleVN0b3JlUGFzcygiYXNkZmdoIik7CisgICAgICAgIHNzbENvbnRleHQuc2V0VHJ1c3RTdG9yZUJ5dGVzKEJ5dGVTdHJlYW1zLnRvQnl0ZUFycmF5KHRydXN0U3RvcmUpKTsgLy8gY29udGFpbnMgY2xpZW50IGNlcnRpZmljYXRlCisgICAgICAgIHNzbENvbnRleHQuc2V0VHJ1c3RTdG9yZVBhc3MoImFzZGZnaCIpOworCisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJjLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICByYy5yZWdpc3RlckNsYXNzZXMoUm9vdFJlc291cmNlLmNsYXNzLCBTZWN1cml0eUZpbHRlci5jbGFzcywgQXV0aGVudGljYXRpb25FeGNlcHRpb25NYXBwZXIuY2xhc3MpOworCisgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgZ3JpenpseVNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKAorICAgICAgICAgICAgICAgIGdldEJhc2VVUkkoKSwKKyAgICAgICAgICAgICAgICByYywKKyAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgIG5ldyBTU0xFbmdpbmVDb25maWd1cmF0b3Ioc3NsQ29udGV4dCkuc2V0Q2xpZW50TW9kZShmYWxzZSkuc2V0TmVlZENsaWVudEF1dGgodHJ1ZSkKKyAgICAgICAgKTsKKworICAgICAgICAvLyBzdGFydCBHcml6emx5IGVtYmVkZGVkIHNlcnZlciAvLworICAgICAgICBMT0dHRVIuaW5mbygiSmVyc2V5IGFwcCBzdGFydGVkLiBUcnkgb3V0ICIgKyBCQVNFX1VSSSArICJcbkhpdCBDVFJMICsgQyB0byBzdG9wIGl0Li4uIik7CisgICAgICAgIGdyaXp6bHlTZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICByZXR1cm4gbmV3IFNlcnZlcihncml6emx5U2VydmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wIFNTTC1zZWN1cmVkIEhUVFAgdGVzdCBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgd2ViU2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9Tc2xDb25uZWN0b3JDb25maWd1cmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9Tc2xDb25uZWN0b3JDb25maWd1cmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWRjYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NzbENvbm5lY3RvckNvbmZpZ3VyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3Iuc3NsOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFNTTCBjb25uZWN0b3IgdGVzdHMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFNzbENvbm5lY3RvckNvbmZpZ3VyYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0b3JTZXJ2ZXJUZXN0IHsKKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gc2VlIHRoYXQgdGhlIGNvcnJlY3QgSHR0cCBzdGF0dXMgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNTTFdpdGhBdXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IGdldFNzbENvbnRleHQoKTsKKworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIoY29ubmVjdG9yUHJvdmlkZXIpOworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjYykKKyAgICAgICAgICAgICAgICAuc3NsQ29udGV4dChzc2xDb250ZXh0KQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIC8vIGNsaWVudCBiYXNpYyBhdXRoIGRlbW9uc3RyYXRpb24KKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWMoInVzZXIiLCAicGFzc3dvcmQiKSk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KFNlcnZlci5CQVNFX1VSSSkucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoIi8iKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgdGhhdCBIVFRQIDQwMSBpcyByZXR1cm5lZCB3aGVuIGNsaWVudCB0cmllcyB0byBHRVQgd2l0aG91dAorICAgICAqIHByb3BlciBjcmVkZW50aWFscy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SFRUUEJhc2ljQXV0aDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gZ2V0U3NsQ29udGV4dCgpOworCisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNjKQorICAgICAgICAgICAgICAgIC5zc2xDb250ZXh0KHNzbENvbnRleHQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoU2VydmVyLkJBU0VfVVJJKS5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiLyIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDEsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIHNlZSB0aGF0IFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBjbGllbnQgZG9uJ3QgaGF2ZQorICAgICAqIHRydXN0ZWQga2V5LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTU0xBdXRoMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTU0xDb250ZXh0IHNzbENvbnRleHQgPSBnZXRTc2xDb250ZXh0KCk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY2MpCisgICAgICAgICAgICAgICAgLnNzbENvbnRleHQoc3NsQ29udGV4dCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChTZXJ2ZXIuQkFTRV9VUkkpLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0LnBhdGgoIi8iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjYXVnaHQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYXVnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBhIHJlc3BvbnNlIHRvIGFuIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSBoYXMgdGhlIHNhbWUgU1NMIGNvbmZpZ3VyYXRpb24gYXMgdGhlIG9yaWdpbmFsIHJlcXVlc3QuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U1NMV2l0aE5vblByZWVtcHRpdmVBdXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IGdldFNzbENvbnRleHQoKTsKKworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIoY29ubmVjdG9yUHJvdmlkZXIpOworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjYykKKyAgICAgICAgICAgICAgICAuc3NsQ29udGV4dChzc2xDb250ZXh0KQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIC8vIGNsaWVudCBiYXNpYyBhdXRoIGRlbW9uc3RyYXRpb24KKyAgICAgICAgSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBhdXRoRmVhdHVyZSA9IEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWNCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAubm9uUHJlZW1wdGl2ZSgpCisgICAgICAgICAgICAgICAgLmNyZWRlbnRpYWxzKCJ1c2VyIiwgInBhc3N3b3JkIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBjbGllbnQucmVnaXN0ZXIoYXV0aEZlYXR1cmUpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChTZXJ2ZXIuQkFTRV9VUkkpLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCIvIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvU3NsQ29ubmVjdG9ySG9zdG5hbWVWZXJpZmllclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvU3NsQ29ubmVjdG9ySG9zdG5hbWVWZXJpZmllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDFmMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9Tc2xDb25uZWN0b3JIb3N0bmFtZVZlcmlmaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQuY29ubmVjdG9yLnNzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlc3Npb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3Rvci5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogU1NMIGNvbm5lY3RvciBob3N0bmFtZSB2ZXJpZmljYXRpb24gdGVzdHMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3NsQ29ubmVjdG9ySG9zdG5hbWVWZXJpZmllclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3RvclNlcnZlclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9UUlVTVF9TVE9SRSA9ICJ0cnVzdHN0b3JlLWV4YW1wbGVfY29tLWNsaWVudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9LRVlfU1RPUkUgPSAia2V5c3RvcmUtZXhhbXBsZV9jb20tc2VydmVyIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgc2VydmVyS2V5U3RvcmUoKSB7CisgICAgICAgIHJldHVybiBTRVJWRVJfS0VZX1NUT1JFOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY2xpZW50VHJ1c3RTdG9yZSgpIHsKKyAgICAgICAgcmV0dXJuIENMSUVOVF9UUlVTVF9TVE9SRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIGFwcGx5IHtAbGluayBIb3N0bmFtZVZlcmlmaWVyfSBhbG9uZyB3aXRoIFNTTCBpbiB0aGUgcHJlZGVmaW5lZCBjb25uZWN0b3JzCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhvc3RuYW1lVmVyaWZpZXJBcHBsaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEdyaXp6bHkgYW5kIEpldHR5IGNvbm5lY3RvcnMgZG9uJ3Qgc3VwcG9ydCBIb3N0bmFtZSBWZXJpZmljYXRpb24KKyAgICAgICAgaWYgKGlzRXhjbHVkZWQoQXJyYXlzLmFzTGlzdChHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuY2xhc3MsIEpldHR5Q29ubmVjdG9yUHJvdmlkZXIuY2xhc3MpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLndpdGhDb25maWcobmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKGNvbm5lY3RvclByb3ZpZGVyKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpYygidXNlciIsICJwYXNzd29yZCIpKQorICAgICAgICAgICAgICAgIC5ob3N0bmFtZVZlcmlmaWVyKG5ldyBDdXN0b21Ib3N0bmFtZVZlcmlmaWVyKCkpCisgICAgICAgICAgICAgICAgLnNzbENvbnRleHQoZ2V0U3NsQ29udGV4dCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGFyZ2V0KFNlcnZlci5CQVNFX1VSSSkucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJIb3N0bmFtZVZlcmlmaWVyIHdhcyBub3QgYXBwbGllZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBwZXgpIHsKKyAgICAgICAgICAgIEN1c3RvbUhvc3RuYW1lVmVyaWZpZXIuSG9zdG5hbWVWZXJpZmllckV4Y2VwdGlvbiBodmUgPSBnZXRIVkUocGV4KTsKKworICAgICAgICAgICAgaWYgKGh2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEN1c3RvbUhvc3RuYW1lVmVyaWZpZXIuRVhfVkVSSUZJRVJfTUVTU0FHRSwgaHZlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZhaWwoIkludmFsaWQgd3JhcHBlZCBleGNlcHRpb24uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFeGNsdWRlZChMaXN0PENsYXNzPD8gZXh0ZW5kcyBDb25uZWN0b3JQcm92aWRlcj4+IGV4Y2x1ZGVkKSB7CisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xhenogOiBleGNsdWRlZCkgeworICAgICAgICAgICAgaWYgKGNsYXp6LmlzQXNzaWduYWJsZUZyb20oY29ubmVjdG9yUHJvdmlkZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDdXN0b21Ib3N0bmFtZVZlcmlmaWVyLkhvc3RuYW1lVmVyaWZpZXJFeGNlcHRpb24gZ2V0SFZFKGZpbmFsIFRocm93YWJsZSBzdGFja3RyYWNlKSB7CisgICAgICAgIFRocm93YWJsZSB0ZW1wID0gc3RhY2t0cmFjZTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdGVtcCA9IHRlbXAuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIGlmICh0ZW1wIGluc3RhbmNlb2YgQ3VzdG9tSG9zdG5hbWVWZXJpZmllci5Ib3N0bmFtZVZlcmlmaWVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChDdXN0b21Ib3N0bmFtZVZlcmlmaWVyLkhvc3RuYW1lVmVyaWZpZXJFeGNlcHRpb24pIHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHRlbXAgIT0gbnVsbCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tSG9zdG5hbWVWZXJpZmllciBpbXBsZW1lbnRzIEhvc3RuYW1lVmVyaWZpZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWF9WRVJJRklFUl9NRVNTQUdFID0gIlZlcmlmaWVyIEFwcGxpZWQiOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoZmluYWwgU3RyaW5nIHMsIGZpbmFsIFNTTFNlc3Npb24gc3NsU2Vzc2lvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEhvc3RuYW1lVmVyaWZpZXJFeGNlcHRpb24oRVhfVkVSSUZJRVJfTUVTU0FHRSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQ1VTVE9NX0hPU1RfVkVSSUZJRVIiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIb3N0bmFtZVZlcmlmaWVyRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIHB1YmxpYyBIb3N0bmFtZVZlcmlmaWVyRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NzbEh0dHBVcmxDb25uZWN0b3JUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NzbEh0dHBVcmxDb25uZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E4MjMyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvU3NsSHR0cFVybENvbm5lY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3Rvci5zc2w7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IGN1c3RvbSBzb2NrZXQgZmFjdG9yeSBpbiBIdHRwVXJsQ29ubmVjdGlvbiB1c2luZyBTU0wKKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIFNzbEh0dHBVcmxDb25uZWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0b3JTZXJ2ZXJUZXN0IHsKKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gc2VlIHRoYXQgdGhlIGNvcnJlY3QgSHR0cCBzdGF0dXMgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNTTFdpdGhDdXN0b21Tb2NrZXRGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IGdldFNzbENvbnRleHQoKTsKKyAgICAgICAgZmluYWwgQ3VzdG9tU1NMU29ja2V0RmFjdG9yeSBzb2NrZXRGYWN0b3J5ID0gbmV3IEN1c3RvbVNTTFNvY2tldEZhY3Rvcnkoc3NsQ29udGV4dCk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZygpCisgICAgICAgICAgICAgICAgLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIoKS5jb25uZWN0aW9uRmFjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuQ29ubmVjdGlvbkZhY3RvcnkoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEh0dHBVUkxDb25uZWN0aW9uIGdldENvbm5lY3Rpb24oZmluYWwgVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cHNVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cHNVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRTU0xTb2NrZXRGYWN0b3J5KHNvY2tldEZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY2MpCisgICAgICAgICAgICAgICAgLnNzbENvbnRleHQoc3NsQ29udGV4dCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpYygidXNlciIsICJwYXNzd29yZCIpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoU2VydmVyLkJBU0VfVVJJKS5wYXRoKCIvIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoc29ja2V0RmFjdG9yeS5pc1Zpc2l0ZWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21TU0xTb2NrZXRGYWN0b3J5IGV4dGVuZHMgU1NMU29ja2V0RmFjdG9yeSB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZpc2l0ZWQgPSBmYWxzZTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dDsKKworICAgICAgICBwcm90ZWN0ZWQgQ3VzdG9tU1NMU29ja2V0RmFjdG9yeShTU0xDb250ZXh0IHNzbENvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuc3NsQ29udGV4dCA9IHNzbENvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2l0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdmlzaXRlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU29ja2V0IGNyZWF0ZVNvY2tldChTb2NrZXQgcywgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBib29sZWFuIGF1dG9DbG9zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMudmlzaXRlZCA9IHRydWU7CisgICAgICAgICAgICBTU0xTb2NrZXRGYWN0b3J5IHNzbFNvY2tldEZhY3RvcnkgPSBzc2xDb250ZXh0LmdldFNvY2tldEZhY3RvcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBzc2xTb2NrZXRGYWN0b3J5LmNyZWF0ZVNvY2tldChzLCBob3N0LCBwb3J0LCBhdXRvQ2xvc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTb2NrZXQgY3JlYXRlU29ja2V0KEluZXRBZGRyZXNzIGFkZHJlc3MsIGludCBwb3J0LCBJbmV0QWRkcmVzcyBsb2NhbEFkZHJlc3MsIGludCBsb2NhbFBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgY3JlYXRlU29ja2V0IG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNvY2tldCBjcmVhdGVTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBJbmV0QWRkcmVzcyBsb2NhbEhvc3QsIGludCBsb2NhbFBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgY3JlYXRlU29ja2V0IG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNvY2tldCBjcmVhdGVTb2NrZXQoSW5ldEFkZHJlc3MgaG9zdCwgaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgY3JlYXRlU29ja2V0IG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNvY2tldCBjcmVhdGVTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIGNyZWF0ZVNvY2tldCBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkLiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZWZhdWx0Q2lwaGVyU3VpdGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENpcGhlclN1aXRlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvZ3JpenpseWNvbm5lY3Rvci9Ob25CbG9ja2luZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2dyaXp6bHljb25uZWN0b3IvTm9uQmxvY2tpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwNmIxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2dyaXp6bHljb25uZWN0b3IvTm9uQmxvY2tpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmdyaXp6bHljb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbkNhbGxiYWNrOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBHcml6emx5IGNvbm5lY3RvciBub24gYmxvY2tpbmcgdGVzdC4KKyAqLworcHVibGljIGNsYXNzIE5vbkJsb2NraW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTdHJpbmcgaW52b2NhdGlvbkNhbGxiYWNrVGhyZWFkTmFtZTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkJsb2NraW5nQ29ubmVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGNvdW50RG93bkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIEZ1dHVyZTxTdHJpbmc+IGZ1dHVyZSA9IHRhcmdldCgidGVzdCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5hc3luYygpCisgICAgICAgICAgICAgICAgLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPFN0cmluZz4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ2FsbGJhY2tUaHJlYWROYW1lID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudERvd25MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbkNhbGxiYWNrVGhyZWFkTmFtZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnREb3duTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBmdXR1cmUuZ2V0KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOworICAgICAgICBhc3NlcnRUcnVlKCJJbnZvY2F0aW9uIGNhbGxiYWNrIHdhcyBub3QgaW52b2tlZCIsCisgICAgICAgICAgICAgICAgY291bnREb3duTGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICBhc3NlcnRUcnVlKCJJbnZvY2F0aW9uIGNhbGxiYWNrIGlzIG5vdCBleGVjdXRlZCBvbiB0aGUgTklPIHBvb2wgdGhyZWFkLiIsCisgICAgICAgICAgICAgICAgICAgIWludm9jYXRpb25DYWxsYmFja1RocmVhZE5hbWUuY29udGFpbnMoImplcnNleS1jbGllbnQtYXN5bmMtZXhlY3V0b3IiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvaHR0cHVybGNvbm5lY3Rvci9Bc3luY1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2h0dHB1cmxjb25uZWN0b3IvQXN5bmNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyZmUzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2h0dHB1cmxjb25uZWN0b3IvQXN5bmNUZXN0LmphdmEKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5odHRwdXJsY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkFzeW5jSW52b2tlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlRpbWVvdXRIYW5kbGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubGVzc1RoYW5PckVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEFzeW5jaHJvbm91cyBjb25uZWN0b3IgdGVzdC4KKyAqCisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFzeW5jVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQXN5bmNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAiYXN5bmMiOworCisgICAgLyoqCisgICAgICogQXN5bmNocm9ub3VzIHRlc3QgcmVzb3VyY2UuCisgICAgICovCisgICAgQFBhdGgoUEFUSCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jUmVzb3VyY2UgeworICAgICAgICAvKioKKyAgICAgICAgICogVHlwaWNhbCBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGR1cmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE9QRVJBVElPTl9EVVJBVElPTiA9IDEwMDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvbmctcnVubmluZyBhc3luY2hyb25vdXMgcG9zdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2UuCisgICAgICAgICAqIEBwYXJhbSBpZCAgICAgICAgICAgIHBvc3QgcmVxdWVzdCBpZCAocmVjZWl2ZWQgYXMgcmVxdWVzdCBwYXlsb2FkKS4KKyAgICAgICAgICovCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jUG9zdChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSwgZmluYWwgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiTG9uZyBydW5uaW5nIHBvc3Qgb3BlcmF0aW9uIGNhbGxlZCB3aXRoIGlkICIgKyBpZCArICIgb24gdGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi4gdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uIHRoYXQgdHlwaWNhbGx5IGZpbmlzaGVzIHdpdGhpbiAxIHNlY29uZHMsIHNpbXVsYXRlZCB1c2luZyBzbGVlcCgpCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoT1BFUkFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRE9ORS0iICsgaWQ7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIklOVEVSUlVQVEVELSIgKyBpZDsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJMb25nIHJ1bm5pbmcgcG9zdCBvcGVyYXRpb24gZmluaXNoZWQgb24gdGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCAiYXN5bmMtcG9zdC1ydW5uZXItIiArIGlkKS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvbmctcnVubmluZyBhc3luYyBnZXQgcmVxdWVzdCB0aGF0IHRpbWVzIG91dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2UuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0aW1lb3V0IikKKyAgICAgICAgcHVibGljIHZvaWQgYXN5bmNHZXRXaXRoVGltZW91dChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgTE9HR0VSLmluZm8oIkFzeW5jIGxvbmctcnVubmluZyBnZXQgd2l0aCB0aW1lb3V0IGNhbGxlZCBvbiB0aHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0VGltZW91dEhhbmRsZXIobmV3IFRpbWVvdXRIYW5kbGVyKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoIk9wZXJhdGlvbiB0aW1lIG91dC4iKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0VGltZW91dCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uIHRoYXQgdHlwaWNhbGx5IGZpbmlzaGVzIHdpdGhpbiAxIHNlY29uZCBidXQgY2FuIHRha2UgdXAgdG8gNSBzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZWQgdXNpbmcgc2xlZXAoKQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUgKiBPUEVSQVRJT05fRFVSQVRJT04pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJET05FIjsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiSU5URVJSVVBURUQiOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkFzeW5jIGxvbmctcnVubmluZyBnZXQgd2l0aCB0aW1lb3V0IGZpbmlzaGVkIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBc3luY1Jlc291cmNlLmNsYXNzLCBUaHJlYWRQb29sUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhc3luY2hyb25vdXMgUE9TVC4KKyAgICAgKgorICAgICAqIFNlbmQgMyBhc3luYyBQT1NUIHJlcXVlc3RzIGFuZCB3YWl0IHRvIHJlY2VpdmUgdGhlIHJlc3BvbnNlcy4gQ2hlY2sgdGhlIHJlc3BvbnNlIGNvbnRlbnQgYW5kCisgICAgICogYXNzZXJ0IHRoYXQgdGhlIG9wZXJhdGlvbiBkaWQgbm90IHRha2UgbW9yZSB0aGFuIHR3aWNlIGFzIGxvbmcgYXMgYSBzaW5nbGUgbG9uZyBvcGVyYXRpb24gZHVyYXRpb24KKyAgICAgKiAodGhpcyBlbnN1cmVzIGFzeW5jIHJlcXVlc3QgZXhlY3V0aW9uKS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0ZXN0IGVycm9yLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBsb25nIHRpYyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIC8vIFN1Ym1pdCByZXF1ZXN0cyBhc3luY2hyb25vdXNseS4KKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZjEgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkudGV4dCgiMSIpKTsKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZjIgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkudGV4dCgiMiIpKTsKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZjMgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkudGV4dCgiMyIpKTsKKyAgICAgICAgLy8gZ2V0KCkgd2FpdHMgZm9yIHRoZSByZXNwb25zZQorICAgICAgICBmaW5hbCBTdHJpbmcgcjEgPSByZjEuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgcjIgPSByZjIuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgcjMgPSByZjMuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGZpbmFsIGxvbmcgdG9jID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJET05FLTEiLCByMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRE9ORS0yIiwgcjIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRPTkUtMyIsIHIzKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJBc3luYyBwcm9jZXNzaW5nIHRvb2sgdG9vIGxvbmcuIiwgdG9jIC0gdGljLCBNYXRjaGVycy5sZXNzVGhhbigzICogQXN5bmNSZXNvdXJjZS5PUEVSQVRJT05fRFVSQVRJT04pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGFjY2Vzc2luZyBhbiBvcGVyYXRpb24gdGhhdCB0aW1lcyBvdXQgb24gdGhlIHNlcnZlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0ZXN0IGVycm9yLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jR2V0V2l0aFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZXNwb25zZUZ1dHVyZSA9IHRhcmdldChQQVRIKS5wYXRoKCJ0aW1lb3V0IikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIC8vIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LgorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlRnV0dXJlLmdldCgpOworCisgICAgICAgIC8vIGdldCgpIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9wZXJhdGlvbiB0aW1lIG91dC4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBQYXRoKCIvdGhyZWFkcG9vbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaHJlYWRQb29sUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICBzbGVlcCgpOworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNsZWVwKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gTk9PUC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiVW5zdGFibGUgdGVzdC4iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRUaHJlYWRQb29sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jSW52b2tlciBpbnZva2VyID0gQ2xpZW50QnVpbGRlcgorICAgICAgICAgICAgICAgIC5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZygpLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQVNZTkNfVEhSRUFEUE9PTF9TSVpFLCA5KSkKKyAgICAgICAgICAgICAgICAudGFyZ2V0KGdldEJhc2VVcmkoKSkKKyAgICAgICAgICAgICAgICAucGF0aCgidGhyZWFkcG9vbCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5hc3luYygpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEwMCk7CisgICAgICAgIGZpbmFsIGludCB0aHJlYWRDb3VudCA9IFRocmVhZC5hY3RpdmVDb3VudCgpOworCisgICAgICAgIGZpbmFsIExpc3Q8VGhyZWFkPiB0aHJlYWRzID0gbmV3IEFycmF5TGlzdDxUaHJlYWQ+KDIwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICB0aHJlYWRzLmFkZChuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoaW52b2tlci5nZXQoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIkdFVCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KFRocmVhZC5hY3RpdmVDb3VudCgpIC0gdGhyZWFkQ291bnQgLSAyMCwgbGVzc1RoYW5PckVxdWFsVG8oMTApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGZpbmFsIFRocmVhZCB0aHJlYWQgOiB0aHJlYWRzKSB7CisgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoMTAgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wva2V5c3RvcmUtY2xpZW50IGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL2tleXN0b3JlLWNsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE2ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL2tleXN0b3JlLWNsaWVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wva2V5c3RvcmUtZXhhbXBsZV9jb20tc2VydmVyIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL2tleXN0b3JlLWV4YW1wbGVfY29tLXNlcnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmY2ZTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL2tleXN0b3JlLWV4YW1wbGVfY29tLXNlcnZlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wva2V5c3RvcmUtbG9jYWxob3N0LXNlcnZlciBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9rZXlzdG9yZS1sb2NhbGhvc3Qtc2VydmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmE4N2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wva2V5c3RvcmUtbG9jYWxob3N0LXNlcnZlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvdHJ1c3RzdG9yZS1leGFtcGxlX2NvbS1jbGllbnQgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvdHJ1c3RzdG9yZS1leGFtcGxlX2NvbS1jbGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmYWM4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC90cnVzdHN0b3JlLWV4YW1wbGVfY29tLWNsaWVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvdHJ1c3RzdG9yZS1sb2NhbGhvc3QtY2xpZW50IGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL3RydXN0c3RvcmUtbG9jYWxob3N0LWNsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ2MTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL3RydXN0c3RvcmUtbG9jYWxob3N0LWNsaWVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvdHJ1c3RzdG9yZS1zZXJ2ZXIgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvdHJ1c3RzdG9yZS1zZXJ2ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyNmNlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC90cnVzdHN0b3JlLXNlcnZlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vcG9tLnhtbCBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNzAwMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vcG9tLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZTJlLWNvcmUtY29tbW9uPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWUyZS1jb3JlLWNvbW1vbjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRTJFIENvcmUtQ29tbW9uIHRlc3RzPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+eGRrPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gZG8gbm90IHVzZSBzZWN1cml0eSBtYW5hZ2VyIGZvciB4ZGsgLS0+CisgICAgICAgICAgICAgICAgPHN1cmVmaXJlLnNlY3VyaXR5LmFyZ2xpbmUgLz4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2UgaXQncyBub3Qgd29ya2luZyB3aXRoIDxmb3JrTW9kZT5hbHdheXM8L2Zvcms+ICg8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4gcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2ppcmEuc29uYXJzb3VyY2UuY29tL2Jyb3dzZS9TT05BUkpBVkEtNzI4IChodHRwczovL2dpdGh1Yi5jb20vU29uYXJTb3VyY2Uvc29uYXItamF2YS9wdWxsLzMyNCkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzIGNvbWJpbmUuc2VsZj0ib3ZlcnJpZGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vVGVzdFJ1bnRpbWVEZWxlZ2F0ZS5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9UZXN0UnVudGltZURlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1MjAyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vVGVzdFJ1bnRpbWVEZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQWJzdHJhY3RSdW50aW1lRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdpbmdCaW5kZXJzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKKworLyoqCisgKiBUZXN0IHJ1bnRpbWUgZGVsZWdhdGUuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RSdW50aW1lRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVEZWxlZ2F0ZSB7CisKKyAgICBwdWJsaWMgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSgpIHsKKyAgICAgICAgc3VwZXIobmV3IE1lc3NhZ2luZ0JpbmRlcnMuSGVhZGVyRGVsZWdhdGVQcm92aWRlcnMoKS5nZXRIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgY3JlYXRlRW5kcG9pbnQoQXBwbGljYXRpb24gYXBwbGljYXRpb24sIENsYXNzPFQ+IGVuZHBvaW50VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlKCkgeworICAgICAgICBNZWRpYVR5cGUgbSA9IG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFVyaUJ1aWxkZXIoKSB7CisgICAgICAgIFVyaUJ1aWxkZXIgdWIgPSBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5jcmVhdGVVcmlCdWlsZGVyKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VCdWlsZGVyKCkgeworICAgICAgICBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmIgPSBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5jcmVhdGVSZXNwb25zZUJ1aWxkZXIoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocmIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWYXJpYW50TGlzdEJ1aWxkZXIoKSB7CisgICAgICAgIFZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyIHZsYiA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVZhcmlhbnRMaXN0QnVpbGRlcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh2bGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5rQnVpbGRlcigpIHsKKyAgICAgICAgZmluYWwgTGluay5CdWlsZGVyIGxpbmtCdWlsZGVyID0gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCkuY3JlYXRlTGlua0J1aWxkZXIoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobGlua0J1aWxkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKKyAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gd2FlID0gbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHdhZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvU2VydmljZUZpbmRlckJpbmRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1NlcnZpY2VGaW5kZXJCaW5kZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5NTIzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1NlcnZpY2VGaW5kZXJCaW5kZXJUZXN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFNlcnZpY2UgZmluZGVyIGluamVjdGlvbiBiaW5kZXIgdW5pdCB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2aWNlRmluZGVyQmluZGVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBwdWJsaWMgU2VydmljZUZpbmRlckJpbmRlclRlc3QoKSB7CisgICAgfQorCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQWJzdHJhY3RCaW5kZXIgYmluZGVyID0gbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZChUZXN0U2VydmljZUIuY2xhc3MpLnRvKFRlc3RDb250cmFjdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgYmluZChUZXN0U2VydmljZUQuY2xhc3MpLnRvKFRlc3RDb250cmFjdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgaW5zdGFsbChuZXcgU2VydmljZUZpbmRlckJpbmRlcjw+KFRlc3RDb250cmFjdC5jbGFzcywgbnVsbCwgUnVudGltZVR5cGUuU0VSVkVSKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoYmluZGVyKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFNldDxUZXN0Q29udHJhY3Q+IHByb3ZpZGVycyA9IFByb3ZpZGVycy5nZXRQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgVGVzdENvbnRyYWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHByb3ZpZGVycy5zaXplKCkpOworCisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwcm92aWRlck5hbWVzID0KKyAgICAgICAgICAgICAgICBwcm92aWRlcnMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFRlc3RDb250cmFjdDo6bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVyTmFtZXMuY29udGFpbnMoVGVzdFNlcnZpY2VBLmNsYXNzLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVyTmFtZXMuY29udGFpbnMoVGVzdFNlcnZpY2VCLmNsYXNzLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVyTmFtZXMuY29udGFpbnMoVGVzdFNlcnZpY2VDLmNsYXNzLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVyTmFtZXMuY29udGFpbnMoVGVzdFNlcnZpY2VELmNsYXNzLmdldE5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RDb250cmFjdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdENvbnRyYWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhMTQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RDb250cmFjdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5jb25maWc7CisKKy8qKgorICogVGVzdCBjb250cmFjdCBmb3Ige0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXJCaW5kZXJ9IHRlc3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBUZXN0Q29udHJhY3QgeworICAgIC8qKgorICAgICAqIEdldCBzZXJ2aWNlIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlcnZpY2UgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKTsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdFNlcnZpY2VBLmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDZkNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdFNlcnZpY2VBLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmNvbmZpZzsKKworLyoqCisgKiBUZXN0IGNvbnRyYWN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U2VydmljZUEgaW1wbGVtZW50cyBUZXN0Q29udHJhY3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUIuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RTZXJ2aWNlQi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTU3YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uY29uZmlnOworCisvKioKKyAqIFRlc3QgY29udHJhY3QgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlQiBpbXBsZW1lbnRzIFRlc3RDb250cmFjdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RTZXJ2aWNlQy5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdFNlcnZpY2VDLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwOWEzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RTZXJ2aWNlQy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5jb25maWc7CisKKy8qKgorICogVGVzdCBjb250cmFjdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2VDIGltcGxlbWVudHMgVGVzdENvbnRyYWN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdFNlcnZpY2VELmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTczYzUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdFNlcnZpY2VELmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmNvbmZpZzsKKworLyoqCisgKiBUZXN0IGNvbnRyYWN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U2VydmljZUQgaW1wbGVtZW50cyBUZXN0Q29udHJhY3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0NvbnRleHRSZXNvbHZlckZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0NvbnRleHRSZXNvbHZlckZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MwMGVkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvQ29udGV4dFJlc29sdmVyRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Db250ZXh0UmVzb2x2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5UZXN0UnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBDb250ZXh0IHJlc29sdmVycyBmYWN0b3J5IHVuaXQgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29udGV4dFJlc29sdmVyRmFjdG9yeVRlc3QgeworCisgICAgQFByb3ZpZGVyCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tU3RyaW5nUmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUUgPSAiZm9vZiI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uLyoiKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbUludGVnZXJSZXNvbHZlckEgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SW50ZWdlcj4geworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFID0gMTAwMTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEludGVnZXIgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbUludGVnZXJSZXNvbHZlckIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SW50ZWdlcj4geworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFID0gMjAwMjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEludGVnZXIgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbUludGVnZXJSZXNvbHZlckMgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SW50ZWdlcj4geworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTFVFID0gMzAwMzsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEludGVnZXIgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoQ3VzdG9tU3RyaW5nUmVzb2x2ZXIuY2xhc3MpLnRvKENvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgICAgICAgICBiaW5kKEN1c3RvbUludGVnZXJSZXNvbHZlckEuY2xhc3MpLnRvKENvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgICAgICAgICBiaW5kKEN1c3RvbUludGVnZXJSZXNvbHZlckIuY2xhc3MpLnRvKENvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRleHRSZXNvbHZlckZhY3RvcnkgY3JmOworCisgICAgcHVibGljIENvbnRleHRSZXNvbHZlckZhY3RvcnlUZXN0KCkgeworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobmV3IFRlc3RSdW50aW1lRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgUHJvdmlkZXJCaW5kZXIgcHJvdmlkZXJCaW5kZXIgPSBuZXcgUHJvdmlkZXJCaW5kZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIHByb3ZpZGVyQmluZGVyLmJpbmRDbGFzc2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihDdXN0b21JbnRlZ2VyUmVzb2x2ZXJDLmNsYXNzKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIobmV3IEJpbmRlcigpKTsKKworICAgICAgICBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnID0gbmV3IEJvb3RzdHJhcEJhZygpOworICAgICAgICBDb250ZXh0UmVzb2x2ZXJGYWN0b3J5LkNvbnRleHRSZXNvbHZlcnNDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0KKyAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFJlc29sdmVyRmFjdG9yeS5Db250ZXh0UmVzb2x2ZXJzQ29uZmlndXJhdG9yKCk7CisgICAgICAgIGNvbmZpZ3VyYXRvci5pbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZyk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgY29uZmlndXJhdG9yLnBvc3RJbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZyk7CisKKyAgICAgICAgY3JmID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb250ZXh0UmVzb2x2ZXJGYWN0b3J5LmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoQ3VzdG9tU3RyaW5nUmVzb2x2ZXIuVkFMVUUsIGNyZi5yZXNvbHZlKFN0cmluZy5jbGFzcywgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpLmdldENvbnRleHQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDdXN0b21TdHJpbmdSZXNvbHZlci5WQUxVRSwgY3JmLnJlc29sdmUoU3RyaW5nLmNsYXNzLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5nZXRDb250ZXh0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscyhDdXN0b21JbnRlZ2VyUmVzb2x2ZXJBLlZBTFVFLAorICAgICAgICAgICAgICAgIGNyZi5yZXNvbHZlKEludGVnZXIuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkuZ2V0Q29udGV4dChJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDdXN0b21JbnRlZ2VyUmVzb2x2ZXJBLlZBTFVFLAorICAgICAgICAgICAgICAgIGNyZi5yZXNvbHZlKEludGVnZXIuY2xhc3MsIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi8qIikpLmdldENvbnRleHQoSW50ZWdlci5jbGFzcykpOworCisgICAgICAgIC8vIFRlc3QgdGhhdCByZXNvbHZlciAiQiIgaXMgc2hhZG93ZWQgYnkgYSBjdXN0b20gcmVzb2x2ZXIgIkMiCisgICAgICAgIGFzc2VydEVxdWFscyhDdXN0b21JbnRlZ2VyUmVzb2x2ZXJDLlZBTFVFLAorICAgICAgICAgICAgICAgIGNyZi5yZXNvbHZlKEludGVnZXIuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldENvbnRleHQoSW50ZWdlci5jbGFzcykpOworCisgICAgICAgIC8vIFRlc3QgdGhhdCB0aGVyZSBpcyBubyBtYXRjaGluZyBwcm92aWRlcgorICAgICAgICBhc3NlcnROdWxsKGNyZi5yZXNvbHZlKEludGVnZXIuY2xhc3MsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0V4Y2VwdGlvbk1hcHBlckZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0V4Y2VwdGlvbk1hcHBlckZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNGZmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvRXhjZXB0aW9uTWFwcGVyRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkV4Y2VwdGlvbk1hcHBlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVW5pdCB0ZXN0IG9mIHtAbGluayBFeGNlcHRpb25NYXBwZXJGYWN0b3J5fS4KKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlckZhY3RvcnlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVycyBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25NYXBwZXIuY2xhc3MpLnRvKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmQoSWxsZWdhbFN0YXRlRXhjZXB0aW9uTWFwcGVyLmNsYXNzKS50byhFeGNlcHRpb25NYXBwZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFsbE1hcHBlcnMgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uTWFwcGVyLmNsYXNzKS50byhFeGNlcHRpb25NYXBwZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbk1hcHBlci5jbGFzcykudG8oRXhjZXB0aW9uTWFwcGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgYmluZChSdW50aW1lRXhjZXB0aW9uTWFwcGVyLmNsYXNzKS50byhFeGNlcHRpb25NYXBwZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc3BlYzoKKyAgICAgKiA8cC8+CisgICAgICogc2V0dXA6PGJyLz4KKyAgICAgKiAtIGhhdmUgdHdvIGV4dGVuZGVkIGV4Y2VwdGlvbiBtYXBwZXJzLCBvcmRlciBtYXR0ZXJzPGJyLz4KKyAgICAgKiAtIGJvdGggdXNpbmcgdGhlIHNhbWUgZ2VuZXJpYyB0eXBlIChSdW50aW1lRXhjZXB0aW9uKTxici8+CisgICAgICogLSBmaXJzdCBtYXBwZXIgcmV0dXJuIGlzTWFwcGFibGUgdHJ1ZSBvbmx5IHRvIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjxici8+CisgICAgICogLSBzZWNvbmQgbWFwcGVyIHJldHVybiBpc01hcHBhYmxlIHRydWUgb25seSB0byBJbGxlZ2FsU3RhdGVFeGNlcHRpb248YnIvPgorICAgICAqIDxici8+CisgICAgICogd2hlbjo8YnIvPgorICAgICAqIC0ge0BsaW5rIEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkjZmluZE1hcHBpbmcoVGhyb3dhYmxlKX0gd2l0aCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW5zdGFuY2U8YnIvPgorICAgICAqIDxici8+CisgICAgICogdGhlbjo8YnIvPgorICAgICAqIC0gZXhjZXB0aW9uIG1hcHBlciBmYWN0b3J5IHJldHVybnMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uTWFwcGVyPGJyLz4KKyAgICAgKiA8cC8+CisgICAgICogd2h5Ojxici8+CisgICAgICogLSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaGFzIHRoZSBzYW1lIGRpc3RhbmNlICgxKSBmb3IgYm90aCBleGNlcHRpb24gbWFwcGVycyBnZW5lcmljIHR5cGUgKFJ1bnRpbWVFeGNlcHRpb24pLAorICAgICAqIGJ1dCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ncyBpc01hcHBhYmxlIHJldHVybiB0cnVlLCBzbyBpdCBpcyB0aGUgd2lubmVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB1bmV4cGVjdGVkIC0gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgdGhlIHRlc3QgZmFpbHMKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kTWFwcGluZ0V4dGVuZGVkRXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIobmV3IEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVycygpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBmaW5hbCBFeGNlcHRpb25NYXBwZXJGYWN0b3J5IG1hcHBlckZhY3RvcnkgPSBuZXcgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeShpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgICAgICBmaW5hbCBFeGNlcHRpb25NYXBwZXIgbWFwcGVyID0gbWFwcGVyRmFjdG9yeS5maW5kTWFwcGluZyhuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25NYXBwZXIgc2hvdWxkIGJlIHJldHVybmVkIiwKKyAgICAgICAgICAgICAgICBtYXBwZXIgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25NYXBwZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc3BlYzoKKyAgICAgKiA8cC8+CisgICAgICogc2V0dXA6PGJyLz4KKyAgICAgKiAtIGhhdmUgMyBleGNlcHRpb24gbWFwcGVycywgb3JkZXIgbWF0dGVyczxici8+CisgICAgICogLSBmaXJzdCBpcyAqbm90KiBleHRlbmRlZCBtYXBwZXIgdHlwZWQgdG8gUnVudGltZUV4Y2VwdGlvbgorICAgICAqIC0gc2Vjb25kIGFuZCB0aGlyZCBhcmUgZXh0ZW5kZWQgbWFwcGVycyB0eXBlIHRvIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgKiA8YnIvPgorICAgICAqIHdoZW46PGJyLz4KKyAgICAgKiAtIHtAbGluayBFeGNlcHRpb25NYXBwZXJGYWN0b3J5I2ZpbmRNYXBwaW5nKFRocm93YWJsZSl9IGludm9rZWQgd2l0aCBSdW50aW1lRXhjZXB0aW9uIGluc3RhbmNlPGJyLz4KKyAgICAgKiB0aGVuOiA8YnIvPgorICAgICAqIC0gZXhjZXB0aW9uIG1hcHBlciBmYWN0b3J5IHJldHVybnMgUnVudGltZUV4Y2VwdGlvbk1hcHBlcjxici8+CisgICAgICogPHAvPgorICAgICAqIHdoeTo8YnIvPgorICAgICAqIC0gUnVudGltZUV4Y2VwdGlvbiBtYXBwZXIgaGFzIGRpc3RhbmNlIDAgZm9yIFJ1bnRpbWVFeGNlcHRpb24sIGl0IGlzIG5vdCBleHRlbmRlZCBtYXBwZXIsIHNvIGl0IHdpbGwgYmUgY2hvc2VuCisgICAgICogaW1tZWRpYXRlbHksIGNhdXNlIHRoZXJlIGlzIG5vIGJldHRlciBvcHRpb24gcG9zc2libGUKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHVuZXhwZWN0ZWQgLSBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCB0aGUgdGVzdCBmYWlscworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihuZXcgQWxsTWFwcGVycygpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBmaW5hbCBFeGNlcHRpb25NYXBwZXJGYWN0b3J5IG1hcHBlckZhY3RvcnkgPSBuZXcgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeShpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgICAgICBmaW5hbCBFeGNlcHRpb25NYXBwZXI8UnVudGltZUV4Y2VwdGlvbj4gbWFwcGVyID0gbWFwcGVyRmFjdG9yeS5maW5kTWFwcGluZyhuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUnVudGltZUV4Y2VwdGlvbk1hcHBlciBzaG91bGQgYmUgcmV0dXJuZWQiLCBtYXBwZXIgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uTWFwcGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHNwZWM6IDxici8+CisgICAgICogPHAvPgorICAgICAqIHNldHVwOjxici8+CisgICAgICogLSBoYXZlIDIgZXh0ZW5kZWQgbWFwcGVycywgb3JkZXIgbWF0dGVyczxici8+CisgICAgICogLSBmaXJzdCBtYXBwZXIgcmV0dXJuIGlzTWFwcGFibGUgdHJ1ZSBvbmx5IHRvIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjxici8+CisgICAgICogLSBzZWNvbmQgbWFwcGVyIHJldHVybiBpc01hcHBhYmxlIHRydWUgb25seSB0byBJbGxlZ2FsU3RhdGVFeGNlcHRpb248YnIvPgorICAgICAqIDxici8+CisgICAgICogd2hlbjo8YnIvPgorICAgICAqIC0ge0BsaW5rIEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkjZmluZChDbGFzcyl9IGludm9rZWQgd2l0aCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3M8YnIvPgorICAgICAqIHRoZW46PGJyLz4KKyAgICAgKiAtIGV4Y2VwdGlvbiBtYXBwZXIgZmFjdG9yeSByZXR1cm5zIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbk1hcHBlcjxici8+CisgICAgICogPHAvPgorICAgICAqIHdoeTo8YnIvPgorICAgICAqIC0gYm90aCBleGNlcHRpb24gbWFwcGVycyBoYXZlIGRpc3RhbmNlIDEgdG8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCB3ZSBkb24ndCBoYXZlIGluc3RhbmNlIG9mIHRoZQorICAgICAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgc28gdGhlIGlzTWFwcGFibGUgY2hlY2sgaXMgbm90IHVzZWQgYW5kIGJvdGggYXJlIGFjY2VwdGVkLCB0aGUgbGF0ZXIgYWNjZXB0ZWQgaXMKKyAgICAgKiB0aGUgd2lubmVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB1bmV4cGVjdGVkIC0gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgdGhlIHRlc3QgZmFpbHMKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kRXh0ZW5kZWRFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihuZXcgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJzKCkpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkgbWFwcGVyRmFjdG9yeSA9IG5ldyBFeGNlcHRpb25NYXBwZXJGYWN0b3J5KGluamVjdGlvbk1hbmFnZXIpOworCisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlciBtYXBwZXIgPSBtYXBwZXJGYWN0b3J5LmZpbmQoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uTWFwcGVyIHNob3VsZCBiZSByZXR1cm5lZCIsCisgICAgICAgICAgICAgICAgbWFwcGVyIGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uTWFwcGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRlbmRlZCBFeGNlcHRpb24gTWFwcGVyIHdoaWNoIGhhcyBSdW50aW1lRXhjZXB0aW9uIGFzIGdlbmVyaWMgdHlwZSBhbmQgaXNNYXBwYWJsZSByZXR1cm5zIHRydWUgaWYgdGhlCisgICAgICogZXhjZXB0aW9uIGlzIGluc3RhbmNlIG9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxSdW50aW1lRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTWFwcGFibGUoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24gaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dGVuZGVkIEV4Y2VwdGlvbiBNYXBwZXIgd2hpY2ggaGFzIFJ1bnRpbWVFeGNlcHRpb24gYXMgZ2VuZXJpYyB0eXBlIGFuZCBpc01hcHBhYmxlIHJldHVybnMgdHJ1ZSBpZiB0aGUKKyAgICAgKiBleGNlcHRpb24gaXMgaW5zdGFuY2Ugb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPFJ1bnRpbWVFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwYWJsZShmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGNlcHRpb24gTWFwcGVyIHdoaWNoIGhhcyBSdW50aW1lRXhjZXB0aW9uIGFzIGdlbmVyaWMgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSdW50aW1lRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFJ1bnRpbWVFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0pheHJzUHJvdmlkZXJzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9KYXhyc1Byb3ZpZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI2MjIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9KYXhyc1Byb3ZpZGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkNvbnRleHRSZXNvbHZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXhjZXB0aW9uTWFwcGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5KYXhyc1Byb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keUZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdpbmdCaW5kZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbW1vbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5UZXN0UnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworCisvKirCrgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheHJzUHJvdmlkZXJzVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQobmV3IENvbnRleHRSZXNvbHZlcjxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkudG8obmV3IEdlbmVyaWNUeXBlPENvbnRleHRSZXNvbHZlcjxTdHJpbmc+PigpIHsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBiaW5kKG5ldyBDb21tb25Db25maWcoUnVudGltZVR5cGUuU0VSVkVSLCBDb21wb25lbnRCYWcuRVhDTFVERV9FTVBUWSkpLnRvKENvbmZpZ3VyYXRpb24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEpheHJzUHJvdmlkZXJzVGVzdCgpIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlLnNldEluc3RhbmNlKG5ldyBUZXN0UnVudGltZURlbGVnYXRlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihuZXcgTWVzc2FnaW5nQmluZGVycy5NZXNzYWdlQm9keVByb3ZpZGVycyhudWxsLCBSdW50aW1lVHlwZS5TRVJWRVIpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihuZXcgQmluZGVyKCkpOworCisgICAgICAgIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcgPSBuZXcgQm9vdHN0cmFwQmFnKCk7CisgICAgICAgIExpc3Q8Qm9vdHN0cmFwQ29uZmlndXJhdG9yPiBib290c3RyYXBDb25maWd1cmF0b3JzID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBuZXcgUmVxdWVzdFNjb3BlLlJlcXVlc3RTY29wZUNvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBUZXN0Q29uZmlnQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IENvbnRleHRSZXNvbHZlckZhY3RvcnkuQ29udGV4dFJlc29sdmVyc0NvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlQm9keUZhY3RvcnkuTWVzc2FnZUJvZHlXb3JrZXJzQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkuRXhjZXB0aW9uTWFwcGVyc0NvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBKYXhyc1Byb3ZpZGVycy5Qcm92aWRlcnNDb25maWd1cmF0b3IoKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIobmV3IFRlc3RCaW5kZXIoKSk7CisKKyAgICAgICAgVGVzdEJpbmRlci5pbml0UHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBib290c3RyYXBDb25maWd1cmF0b3JzLmZvckVhY2goY29uZmlndXJhdG9yIC0+IGNvbmZpZ3VyYXRvci5pbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZykpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMuZm9yRWFjaChjb25maWd1cmF0b3IgLT4gY29uZmlndXJhdG9yLnBvc3RJbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZykpOworCisgICAgICAgIFJlcXVlc3RTY29wZSBzY29wZSA9IGJvb3RzdHJhcEJhZy5nZXRSZXF1ZXN0U2NvcGUoKTsKKworICAgICAgICBzY29wZS5ydW5JblNjb3BlKChDYWxsYWJsZTxPYmplY3Q+KSAoKSAtPiB7CisgICAgICAgICAgICBQcm92aWRlcnMgaW5zdGFuY2UgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByb3ZpZGVycy5jbGFzcyk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5zdGFuY2UpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShKYXhyc1Byb3ZpZGVycy5jbGFzcywgaW5zdGFuY2UuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5zdGFuY2UuZ2V0RXhjZXB0aW9uTWFwcGVyKFRocm93YWJsZS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YW5jZS5nZXRNZXNzYWdlQm9keVJlYWRlcihTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgbmV3IEFubm90YXRpb25bMF0sCisgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5zdGFuY2UuZ2V0TWVzc2FnZUJvZHlXcml0ZXIoU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIG5ldyBBbm5vdGF0aW9uWzBdLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGluc3RhbmNlLmdldENvbnRleHRSZXNvbHZlcihTdHJpbmcuY2xhc3MsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0xvY2FsaXphdGlvbk1lc3NhZ2VzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9Mb2NhbGl6YXRpb25NZXNzYWdlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM2NzlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9Mb2NhbGl6YXRpb25NZXNzYWdlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uaW50ZXJuYWw7CisKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXN9LgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgTG9jYWxpemF0aW9uTWVzc2FnZXNUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoTG9jYWxpemF0aW9uTWVzc2FnZXMuQ09NUE9ORU5UX0NPTlRSQUNUU19FTVBUWV9PUl9OVUxMKCJUWVBFIikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoIkF0dGVtcHQgdG8gcmVnaXN0ZXIgY29tcG9uZW50IG9mIHR5cGUgVFlQRSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL1Byb3ZpZGVyQmluZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9Qcm92aWRlckJpbmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTYwODczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9Qcm92aWRlckJpbmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Db21wb3NpdGVCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkN1c3RvbUFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlckJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnaW5nQmluZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLlRlc3RSdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBTZXJ2aWNlUHJvdmlkZXJzIHVuaXQgdGVzdC4KKyAqCisgKiBAYXV0aG9yIFNhbnRpYWdvIFBlcmljYXMtR2VlcnRzZW4gKHNhbnRpYWdvLnBlcmljYXNnZWVydHNlbiBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcm92aWRlckJpbmRlclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyLCBNZXNzYWdlQm9keVdyaXRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3MgdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCByZWFkRnJvbShDbGFzcyB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXAgaHR0cEhlYWRlcnMsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3MgdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoT2JqZWN0IHQsIENsYXNzIHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT2JqZWN0IHQsIENsYXNzIHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcCBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCaW5kZXIgaW5pdEJpbmRlcnMoQmluZGVyLi4uIGJpbmRlcnMpIHsKKyAgICAgICAgTGlzdDxCaW5kZXI+IGJpbmRlckxpc3QgPSBBcnJheXMuc3RyZWFtKGJpbmRlcnMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIGJpbmRlckxpc3QuYWRkKG5ldyBNZXNzYWdpbmdCaW5kZXJzLk1lc3NhZ2VCb2R5UHJvdmlkZXJzKG51bGwsIFJ1bnRpbWVUeXBlLlNFUlZFUikpOworICAgICAgICByZXR1cm4gQ29tcG9zaXRlQmluZGVyLndyYXAoYmluZGVyTGlzdCk7CisgICAgfQorCisgICAgcHVibGljIFByb3ZpZGVyQmluZGVyVGVzdCgpIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlLnNldEluc3RhbmNlKG5ldyBUZXN0UnVudGltZURlbGVnYXRlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VzTm90RW1wdHkoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihpbml0QmluZGVycygpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBTZXQ8TWVzc2FnZUJvZHlSZWFkZXI+IHByb3ZpZGVycyA9IFByb3ZpZGVycy5nZXRQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVycy5zaXplKCkgPiAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlc01icigpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKGluaXRCaW5kZXJzKCkpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIFNldDxNZXNzYWdlQm9keVJlYWRlcj4gcHJvdmlkZXJzID0gUHJvdmlkZXJzLmdldFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBNZXNzYWdlQm9keVJlYWRlci5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXJzLnNpemUoKSA+IDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VzTWJ3KCkgeworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoaW5pdEJpbmRlcnMoKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgU2V0PE1lc3NhZ2VCb2R5V3JpdGVyPiBwcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0UHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm92aWRlcnMuc2l6ZSgpID4gMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJzTWJyKCkgeworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoaW5pdEJpbmRlcnMoKSk7CisgICAgICAgIFByb3ZpZGVyQmluZGVyIHByb3ZpZGVyQmluZGVyID0gbmV3IFByb3ZpZGVyQmluZGVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBwcm92aWRlckJpbmRlci5iaW5kQ2xhc3NlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24oTXlQcm92aWRlci5jbGFzcykpOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgU2V0PE1lc3NhZ2VCb2R5UmVhZGVyPiBwcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0Q3VzdG9tUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIE1lc3NhZ2VCb2R5UmVhZGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGluc3RhbmNlc09mVHlwZShNeVByb3ZpZGVyLmNsYXNzLCBwcm92aWRlcnMpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJzTWJ3KCkgeworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoaW5pdEJpbmRlcnMoKSk7CisgICAgICAgIFByb3ZpZGVyQmluZGVyIHByb3ZpZGVyQmluZGVyID0gbmV3IFByb3ZpZGVyQmluZGVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBwcm92aWRlckJpbmRlci5iaW5kQ2xhc3NlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24oTXlQcm92aWRlci5jbGFzcykpOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgU2V0PE1lc3NhZ2VCb2R5V3JpdGVyPiBwcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0Q3VzdG9tUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxNeVByb3ZpZGVyPiBteVByb3ZpZGVycyA9IGluc3RhbmNlc09mVHlwZShNeVByb3ZpZGVyLmNsYXNzLCBwcm92aWRlcnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbXlQcm92aWRlcnMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcnNNYnJJbnN0YW5jZSgpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKGluaXRCaW5kZXJzKCkpOworICAgICAgICBQcm92aWRlckJpbmRlciBwcm92aWRlckJpbmRlciA9IG5ldyBQcm92aWRlckJpbmRlcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgcHJvdmlkZXJCaW5kZXIuYmluZEluc3RhbmNlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IE15UHJvdmlkZXIoKSkpOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgU2V0PE1lc3NhZ2VCb2R5UmVhZGVyPiBwcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0Q3VzdG9tUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIE1lc3NhZ2VCb2R5UmVhZGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGluc3RhbmNlc09mVHlwZShNeVByb3ZpZGVyLmNsYXNzLCBwcm92aWRlcnMpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJzTWJ3SW5zdGFuY2UoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihpbml0QmluZGVycygpKTsKKyAgICAgICAgUHJvdmlkZXJCaW5kZXIgcHJvdmlkZXJCaW5kZXIgPSBuZXcgUHJvdmlkZXJCaW5kZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIHByb3ZpZGVyQmluZGVyLmJpbmRJbnN0YW5jZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldyBNeVByb3ZpZGVyKCkpKTsKKworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIFNldDxNZXNzYWdlQm9keVdyaXRlcj4gcHJvdmlkZXJzID0gUHJvdmlkZXJzLmdldEN1c3RvbVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBNZXNzYWdlQm9keVdyaXRlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbnN0YW5jZXNPZlR5cGUoTXlQcm92aWRlci5jbGFzcywgcHJvdmlkZXJzKS5zaXplKCksIDEpOworICAgIH0KKworICAgIHByaXZhdGUgPFQ+IENvbGxlY3Rpb248VD4gaW5zdGFuY2VzT2ZUeXBlKGZpbmFsIENsYXNzPFQ+IGMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworCisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZpbHRlcigoamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTxPYmplY3Q+KSBvIC0+IG8uZ2V0Q2xhc3MoKSA9PSBjKQorICAgICAgICAgICAgICAgIC5tYXAoKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxPYmplY3QsIFQ+KSBjOjpjYXN0KQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUmVnaXN0cmF0aW9uKCkgeworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKworICAgICAgICBQcm92aWRlckJpbmRlciBwcm92aWRlckJpbmRlciA9IG5ldyBQcm92aWRlckJpbmRlcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgcHJvdmlkZXJCaW5kZXIuYmluZENsYXNzZXMoQ2hpbGQuY2xhc3MpOworICAgICAgICBwcm92aWRlckJpbmRlci5iaW5kQ2xhc3NlcyhOb3RGaWx0ZXJDaGlsZC5jbGFzcyk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKworICAgICAgICBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHJlcXVlc3RGaWx0ZXIgPSBnZXRSZXF1ZXN0RmlsdGVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHJlcXVlc3RGaWx0ZXIyID0gZ2V0UmVxdWVzdEZpbHRlcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcXVlc3RGaWx0ZXIsIHJlcXVlc3RGaWx0ZXIyKTsKKworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHJlc3BvbnNlRmlsdGVyID0gZ2V0UmVzcG9uc2VGaWx0ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHJlc3BvbnNlRmlsdGVyMiA9IGdldFJlc3BvbnNlRmlsdGVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlRmlsdGVyID09IHJlc3BvbnNlRmlsdGVyMik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZUZpbHRlciA9PSByZXF1ZXN0RmlsdGVyKTsKKworICAgICAgICAvLyBvbmx5IG9uZSBmaWx0ZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQKKyAgICAgICAgQ29sbGVjdGlvbjxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gZmlsdGVycyA9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEN1c3RvbVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBDb250YWluZXJSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBmaWx0ZXJzLnNpemUoKSk7CisKKyAgICAgICAgQ2hpbGQgY2hpbGQgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENoaWxkLmNsYXNzKTsKKyAgICAgICAgQ2hpbGQgY2hpbGQyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDaGlsZC5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjaGlsZCAhPSByZXNwb25zZUZpbHRlcik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjaGlsZCA9PSBjaGlsZDIpOworICAgIH0KKworICAgIHByaXZhdGUgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgZ2V0UmVzcG9uc2VGaWx0ZXIoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHJlc3BvbnNlRmlsdGVyID0KKyAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnRhaW5lclJlc3BvbnNlRmlsdGVyLmNsYXNzLCBDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDaGlsZC5jbGFzcywgcmVzcG9uc2VGaWx0ZXIuZ2V0Q2xhc3MoKSk7CisgICAgICAgIHJldHVybiByZXNwb25zZUZpbHRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgZ2V0UmVxdWVzdEZpbHRlcihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdEZpbHRlciByZXF1ZXN0RmlsdGVyID0KKyAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MsIEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENoaWxkLmNsYXNzLCByZXF1ZXN0RmlsdGVyLmdldENsYXNzKCkpOworICAgICAgICByZXR1cm4gcmVxdWVzdEZpbHRlcjsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgUGFyZW50SW50ZXJmYWNlIHsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ2hpbGRJbnRlcmZhY2UgZXh0ZW5kcyBDaGlsZFN1cGVySW50ZXJmYWNlIHsKKyAgICB9CisKKworICAgIGludGVyZmFjZSBTZWNvbmRDaGlsZEludGVyZmFjZSB7CisgICAgfQorCisgICAgaW50ZXJmYWNlIENoaWxkU3VwZXJJbnRlcmZhY2UgZXh0ZW5kcyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyZW50IGltcGxlbWVudHMgUGFyZW50SW50ZXJmYWNlLCBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoaWxkIGV4dGVuZHMgUGFyZW50IGltcGxlbWVudHMgQ2hpbGRJbnRlcmZhY2UsIFNlY29uZENoaWxkSW50ZXJmYWNlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vdEZpbHRlckNoaWxkIGltcGxlbWVudHMgUGFyZW50SW50ZXJmYWNlIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL1Rlc3RCaW5kZXIuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvVGVzdEJpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNjY3NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL1Rlc3RCaW5kZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnaW5nQmluZGVyczsKKworLyoqCisgKiBCaW5kZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFByb3ZpZGVycyhmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgaW5pdFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFByb3ZpZGVycyhmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSXRlcmFibGU8Q2xhc3M8Pz4+IHByb3ZpZGVyQ2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYWJsZTxPYmplY3Q+IHByb3ZpZGVySW5zdGFuY2VzKSB7CisgICAgICAgIGZpbmFsIFByb3ZpZGVyQmluZGVyIHByb3ZpZGVyQmluZGVyID0gbmV3IFByb3ZpZGVyQmluZGVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBwcm92aWRlckJpbmRlci5iaW5kQ2xhc3Nlcyhwcm92aWRlckNsYXNzZXMpOworICAgICAgICBwcm92aWRlckJpbmRlci5iaW5kSW5zdGFuY2VzKHByb3ZpZGVySW5zdGFuY2VzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGluc3RhbGwobmV3IE1lc3NhZ2luZ0JpbmRlcnMuTWVzc2FnZUJvZHlQcm92aWRlcnMobnVsbCwgUnVudGltZVR5cGUuU0VSVkVSKSk7CisKKyAgICAgICAgYmluZChuZXcgRXhjZXB0aW9uTWFwcGVyPFRocm93YWJsZT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFRocm93YWJsZSBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygtMSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9KS50byhFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvVGVzdENvbmZpZ0NvbmZpZ3VyYXRvci5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9UZXN0Q29uZmlnQ29uZmlndXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxN2NhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvVGVzdENvbmZpZ0NvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21tb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworCisvKioKKyAqIENvbmZpZ3VyYXRvciB3aGljaCBpbml0aWFsaXplcyBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgVGVzdENvbmZpZ0NvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIEJvb3RzdHJhcENvbmZpZ3VyYXRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICBib290c3RyYXBCYWcuc2V0Q29uZmlndXJhdGlvbihuZXcgQ29tbW9uQ29uZmlnKFJ1bnRpbWVUeXBlLlNFUlZFUiwgQ29tcG9uZW50QmFnLkVYQ0xVREVfRU1QVFkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwb3N0SW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvaW5qZWN0L1JlZmVyZW5jaW5nRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvaW5qZWN0L1JlZmVyZW5jaW5nRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWFmOTIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9pbmplY3QvUmVmZXJlbmNpbmdGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5SZWZlcmVuY2luZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKKy8qKgorICogUmVmZXJlbmNpbmcgZmFjdG9yeSB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZWZlcmVuY2luZ0ZhY3RvcnlUZXN0IGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9vIHsKKyAgICAgICAgZmluYWwgaW50IHZhbHVlOworCisgICAgICAgIHByaXZhdGUgRm9vKGludCB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmFsdWVJbmplY3RlZCB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBGb28gZm9vOworICAgICAgICBASW5qZWN0CisgICAgICAgIExpc3Q8SW50ZWdlcj4gaW50ZWdlcnM7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVmSW5qZWN0ZWQgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgUmVmPEZvbz4gZm9vOworICAgICAgICBASW5qZWN0CisgICAgICAgIFJlZjxMaXN0PEludGVnZXI+PiBpbnRlZ2VyczsKKyAgICAgICAgQEluamVjdAorICAgICAgICBSZWY8TGlzdDxTdHJpbmc+PiBzdHJpbmdzOworICAgIH0KKworICAgIC8vCisgICAgcHJpdmF0ZSBGb28gZXhwZWN0ZWRGb28gPSBudWxsOworICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBleHBlY3RlZEludGVnZXJzID0gbnVsbDsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBleHBlY3RlZFN0cmluZ3MgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGb29SZWZlcmVuY2luZ0ZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8Rm9vPiB7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIEZvb1JlZmVyZW5jaW5nRmFjdG9yeShQcm92aWRlcjxSZWY8Rm9vPj4gcmVmZXJlbmNlRmFjdG9yeSkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbmNlRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBMaXN0T2ZJbnRlZ2VyUmVmZXJlbmNpbmdGYWN0b3J5IGV4dGVuZHMgUmVmZXJlbmNpbmdGYWN0b3J5PExpc3Q8SW50ZWdlcj4+IHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgTGlzdE9mSW50ZWdlclJlZmVyZW5jaW5nRmFjdG9yeShQcm92aWRlcjxSZWY8TGlzdDxJbnRlZ2VyPj4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTGlzdE9mU3RyaW5nUmVmZXJlbmNpbmdGYWN0b3J5IGV4dGVuZHMgUmVmZXJlbmNpbmdGYWN0b3J5PExpc3Q8U3RyaW5nPj4geworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBMaXN0T2ZTdHJpbmdSZWZlcmVuY2luZ0ZhY3RvcnkoUHJvdmlkZXI8UmVmPExpc3Q8U3RyaW5nPj4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBiaW5kRmFjdG9yeShGb29SZWZlcmVuY2luZ0ZhY3RvcnkuY2xhc3MpLnRvKEZvby5jbGFzcyk7CisgICAgICAgIGJpbmRGYWN0b3J5KFJlZmVyZW5jaW5nRmFjdG9yeS5yZWZlcmVuY2VGYWN0b3J5KCkpLnRvKG5ldyBHZW5lcmljVHlwZTxSZWY8Rm9vPj4oKSB7fSkuaW4oU2luZ2xldG9uLmNsYXNzKTsKKworICAgICAgICBiaW5kRmFjdG9yeShMaXN0T2ZJbnRlZ2VyUmVmZXJlbmNpbmdGYWN0b3J5LmNsYXNzKS50byhuZXcgR2VuZXJpY1R5cGU8TGlzdDxJbnRlZ2VyPj4oKSB7fSk7CisgICAgICAgIGJpbmRGYWN0b3J5KFJlZmVyZW5jaW5nRmFjdG9yeS5yZWZlcmVuY2VGYWN0b3J5KCkpLnRvKG5ldyBHZW5lcmljVHlwZTxSZWY8TGlzdDxJbnRlZ2VyPj4+KCkgeworICAgICAgICB9KS5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgIGJpbmRGYWN0b3J5KExpc3RPZlN0cmluZ1JlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykudG8obmV3IEdlbmVyaWNUeXBlPExpc3Q8U3RyaW5nPj4oKSB7fSk7CisgICAgICAgIGJpbmRGYWN0b3J5KFJlZmVyZW5jaW5nRmFjdG9yeS5yZWZlcmVuY2VGYWN0b3J5KGV4cGVjdGVkU3RyaW5ncykpLnRvKG5ldyBHZW5lcmljVHlwZTxSZWY8TGlzdDxTdHJpbmc+Pj4oKSB7CisgICAgICAgIH0pLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmZXJlbmNlZCBiaW5kaW5nIHRlc3QuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJlbmNlZEJpbmRpbmcoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcih0aGlzKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworCisgICAgICAgIFJlZkluamVjdGVkIHJlZlZhbHVlcyA9IGluamVjdGlvbk1hbmFnZXIuY3JlYXRlQW5kSW5pdGlhbGl6ZShSZWZJbmplY3RlZC5jbGFzcyk7CisgICAgICAgIGV4cGVjdGVkRm9vID0gbmV3IEZvbygxMCk7CisgICAgICAgIHJlZlZhbHVlcy5mb28uc2V0KGV4cGVjdGVkRm9vKTsKKyAgICAgICAgZXhwZWN0ZWRJbnRlZ2VycyA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisgICAgICAgIHJlZlZhbHVlcy5pbnRlZ2Vycy5zZXQoZXhwZWN0ZWRJbnRlZ2Vycyk7CisgICAgICAgIGV4cGVjdGVkU3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICByZWZWYWx1ZXMuc3RyaW5ncy5zZXQoZXhwZWN0ZWRTdHJpbmdzKTsKKworICAgICAgICBWYWx1ZUluamVjdGVkIHVwZGF0ZWRWYWx1ZXMgPSBpbmplY3Rpb25NYW5hZ2VyLmNyZWF0ZUFuZEluaXRpYWxpemUoVmFsdWVJbmplY3RlZC5jbGFzcyk7CisgICAgICAgIGFzc2VydFNhbWUoZXhwZWN0ZWRGb28sIHVwZGF0ZWRWYWx1ZXMuZm9vKTsKKyAgICAgICAgYXNzZXJ0U2FtZShleHBlY3RlZEludGVnZXJzLCB1cGRhdGVkVmFsdWVzLmludGVnZXJzKTsKKyAgICAgICAgYXNzZXJ0U2FtZShleHBlY3RlZFN0cmluZ3MsIHVwZGF0ZWRWYWx1ZXMuc3RyaW5ncyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0FjY2VwdGFibGVNZWRpYVR5cGVTdHJpbmdSZXByZXNlbnRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9BY2NlcHRhYmxlTWVkaWFUeXBlU3RyaW5nUmVwcmVzZW50YXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxNDI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9BY2NlcHRhYmxlTWVkaWFUeXBlU3RyaW5nUmVwcmVzZW50YXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFjY2VwdGFibGVNZWRpYVR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlF1YWxpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisKKy8qKgorICogQWNjZXB0YWJsZSBtZWRpYSB0eXBlIHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEFjY2VwdGFibGVNZWRpYVR5cGVTdHJpbmdSZXByZXNlbnRhdGlvblRlc3QgeworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICAvLyBleHBlY3RlZCByZXN1bHQsIGFjY2VwdGFibGUgbWVkaWEgdHlwZQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBlbXB0eVBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBwYXJhbXMucHV0KCJteVBhcmFtIiwgIm15VmFsdWUiKTsKKworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXXsKKyAgICAgICAgICAgICAgICB7IiovKiIsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCIqIiwgIioiKX0sCisgICAgICAgICAgICAgICAgeyIqLyoiLCBuZXcgQWNjZXB0YWJsZU1lZGlhVHlwZSgiKiIsICIqIiwgUXVhbGl0eS5ERUZBVUxULCBlbXB0eVBhcmFtcyl9LAorICAgICAgICAgICAgICAgIHsiKi8qO3E9MC43NSIsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCIqIiwgIioiLCA3NTAsIGVtcHR5UGFyYW1zKX0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0L2h0bWwiLCBuZXcgQWNjZXB0YWJsZU1lZGlhVHlwZSgidGV4dCIsICJodG1sIiwgUXVhbGl0eS5ERUZBVUxULCBudWxsKX0sCisgICAgICAgICAgICAgICAgeyJ0ZXh0L2h0bWw7cT0wLjUiLCBuZXcgQWNjZXB0YWJsZU1lZGlhVHlwZSgidGV4dCIsICJodG1sIiwgNTAwLCBlbXB0eVBhcmFtcyl9LAorICAgICAgICAgICAgICAgIHsiaW1hZ2UvKjtteXBhcmFtPW15VmFsdWU7cT0wLjgiLCBuZXcgQWNjZXB0YWJsZU1lZGlhVHlwZSgiaW1hZ2UiLCAiKiIsIDgwMCwgcGFyYW1zKX0sCisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGV4cGVjdGVkVmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBBY2NlcHRhYmxlTWVkaWFUeXBlIHRlc3RlZFR5cGU7CisKKyAgICBwdWJsaWMgQWNjZXB0YWJsZU1lZGlhVHlwZVN0cmluZ1JlcHJlc2VudGF0aW9uVGVzdChmaW5hbCBTdHJpbmcgZXhwZWN0ZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY2NlcHRhYmxlTWVkaWFUeXBlIHRlc3RlZFR5cGUpIHsKKyAgICAgICAgdGhpcy5leHBlY3RlZFZhbHVlID0gZXhwZWN0ZWRWYWx1ZTsKKyAgICAgICAgdGhpcy50ZXN0ZWRUeXBlID0gdGVzdGVkVHlwZTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgTWVkaWFUeXBlUHJvdmlkZXIoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0ZXN0ZWRUeXBlLnRvU3RyaW5nKCkpOworICAgICAgICBwcm92aWRlci5mcm9tU3RyaW5nKHRlc3RlZFR5cGUudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0FjY2VwdGFibGVNZWRpYVR5cGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvQWNjZXB0YWJsZU1lZGlhVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThhOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0FjY2VwdGFibGVNZWRpYVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFjY2VwdGFibGVNZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIEFjY2VwdGFibGUgbWVkaWEgdHlwZSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQWNjZXB0YWJsZU1lZGlhVHlwZVRlc3QgeworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICAvLyBleHBlY3RlZCByZXN1bHQsIG1lZGlhIHR5cGUsIGFjY2VwdGFibGUgbWVkaWEgdHlwZQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdEJlZHMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICAgICAgICAgIHtCb29sZWFuLlRSVUUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIil9LAorICAgICAgICAgICAgICAgIHtCb29sZWFuLlRSVUUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIiwgMTAwMCwgbnVsbCl9LAorICAgICAgICAgICAgICAgIHtCb29sZWFuLkZBTFNFLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCBuZXcgQWNjZXB0YWJsZU1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAianNvbiIsIDUwMCwgbnVsbCl9LAorICAgICAgICAgICAgICAgIHtCb29sZWFuLkZBTFNFLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCBuZXcgQWNjZXB0YWJsZU1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAieG1sIil9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBleHBlY3RFcXVhbGl0eTsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBBY2NlcHRhYmxlTWVkaWFUeXBlIGFjY2VwdGFibGVNZWRpYVR5cGU7CisKKyAgICBwdWJsaWMgQWNjZXB0YWJsZU1lZGlhVHlwZVRlc3QoYm9vbGVhbiBleHBlY3RFcXVhbGl0eSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgQWNjZXB0YWJsZU1lZGlhVHlwZSBhY2NlcHRhYmxlTWVkaWFUeXBlKSB7CisgICAgICAgIHRoaXMuZXhwZWN0RXF1YWxpdHkgPSBleHBlY3RFcXVhbGl0eTsKKyAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSBtZWRpYVR5cGU7CisgICAgICAgIHRoaXMuYWNjZXB0YWJsZU1lZGlhVHlwZSA9IGFjY2VwdGFibGVNZWRpYVR5cGU7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChleHBlY3RFcXVhbGl0eSkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVHlwZXMgbm90IGVxdWFsLiIsIG1lZGlhVHlwZSwgYWNjZXB0YWJsZU1lZGlhVHlwZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUeXBlcyBub3QgZXF1YWwuIiwgYWNjZXB0YWJsZU1lZGlhVHlwZSwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkhhc2ggY29kZXMgbm90IGVxdWFsIGZvciAlcyBhbmQgJXMuIiwgbWVkaWFUeXBlLnRvU3RyaW5nKCksIGFjY2VwdGFibGVNZWRpYVR5cGUudG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5oYXNoQ29kZSgpLCBhY2NlcHRhYmxlTWVkaWFUeXBlLmhhc2hDb2RlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKFN0cmluZy5mb3JtYXQoIkZhbHNlIGVxdWFsaXR5IG9mICVzIGFuZCAlcyIsIG1lZGlhVHlwZS50b1N0cmluZygpLCBhY2NlcHRhYmxlTWVkaWFUeXBlLnRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICBhY2NlcHRhYmxlTWVkaWFUeXBlLmVxdWFscyhtZWRpYVR5cGUpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9Db21taXR0aW5nT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0NvbW1pdHRpbmdPdXRwdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2MTI3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9Db21taXR0aW5nT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5Db21taXR0aW5nT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21tb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0IHRoZSB7QGxpbmsgQ29tbWl0dGluZ091dHB1dFN0cmVhbX0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQ29tbWl0dGluZ091dHB1dFN0cmVhbVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFzc2VkIHsKKyAgICAgICAgYm9vbGVhbiBiOworCisgICAgICAgIHB1YmxpYyB2b2lkIHBhc3MoKSB7CisgICAgICAgICAgICBiID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4YWN0U2l6ZU9mQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFzc2VkIHBhc3NlZCA9IG5ldyBQYXNzZWQoKTsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDApOworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHNldHVwQnVmZmVyZWRTdHJlYW1Qcm92aWRlcihwYXNzZWQsIGJhb3MsIGNvcywgMyk7CisKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAxKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAyKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAzKTsKKyAgICAgICAgY2hlY2tOb3RZZXRDb21taXR0ZWQocGFzc2VkLCBiYW9zLCBjb3MpOworICAgICAgICBjb3MuY29tbWl0KCk7CisgICAgICAgIGNoZWNrKGJhb3MsIG5ldyBieXRlW117MSwgMiwgM30pOworICAgICAgICBhc3NlcnRUcnVlKHBhc3NlZC5iKTsKKyAgICAgICAgY29zLmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTm90WWV0Q29tbWl0dGVkKFBhc3NlZCBwYXNzZWQsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zLCBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcykgeworICAgICAgICBhc3NlcnRGYWxzZShwYXNzZWQuYik7CisgICAgICAgIGFzc2VydEZhbHNlKGNvcy5pc0NvbW1pdHRlZCgpKTsKKyAgICAgICAgY2hlY2soYmFvcywgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29tbWl0dGVkKFBhc3NlZCBwYXNzZWQsIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zKSB7CisgICAgICAgIGFzc2VydFRydWUocGFzc2VkLmIpOworICAgICAgICBhc3NlcnRUcnVlKGNvcy5pc0NvbW1pdHRlZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBCdWZmZXJlZFN0cmVhbVByb3ZpZGVyKGZpbmFsIFBhc3NlZCBwYXNzZWQsIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zLCBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleHBlY3RlZENvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgY29zLnNldFN0cmVhbVByb3ZpZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDb250ZW50TGVuZ3RoLCBjb250ZW50TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwYXNzZWQucGFzcygpOworICAgICAgICAgICAgICAgIHJldHVybiBiYW9zOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgY29zLmVuYWJsZUJ1ZmZlcmluZygzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBTdHJlYW1Qcm92aWRlcihmaW5hbCBQYXNzZWQgcGFzc2VkLCBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcywgQ29tbWl0dGluZ091dHB1dFN0cmVhbSBjb3MpIHsKKyAgICAgICAgY29zLnNldFN0cmVhbVByb3ZpZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKGludCBjb250ZW50TGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHBhc3NlZC5wYXNzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhhY3RTaXplT2ZCdWZmZXJCeUNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFzc2VkIHBhc3NlZCA9IG5ldyBQYXNzZWQoKTsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDApOworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHNldHVwQnVmZmVyZWRTdHJlYW1Qcm92aWRlcihwYXNzZWQsIGJhb3MsIGNvcywgMyk7CisKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAxKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAyKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAzKTsKKyAgICAgICAgY2hlY2tOb3RZZXRDb21taXR0ZWQocGFzc2VkLCBiYW9zLCBjb3MpOworICAgICAgICBjb3MuY2xvc2UoKTsKKyAgICAgICAgY2hlY2soYmFvcywgbmV3IGJ5dGVbXXsxLCAyLCAzfSk7CisgICAgICAgIGFzc2VydFRydWUocGFzc2VkLmIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExlc3NCeXRlc1RoYW5MaW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhc3NlZCBwYXNzZWQgPSBuZXcgUGFzc2VkKCk7CisgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwKTsKKyAgICAgICAgQ29tbWl0dGluZ091dHB1dFN0cmVhbSBjb3MgPSBuZXcgQ29tbWl0dGluZ091dHB1dFN0cmVhbSgpOworICAgICAgICBzZXR1cEJ1ZmZlcmVkU3RyZWFtUHJvdmlkZXIocGFzc2VkLCBiYW9zLCBjb3MsIDIpOworCisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgMSk7CisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgMik7CisgICAgICAgIGNoZWNrTm90WWV0Q29tbWl0dGVkKHBhc3NlZCwgYmFvcywgY29zKTsKKworICAgICAgICBjb3MuY29tbWl0KCk7CisKKyAgICAgICAgY2hlY2soYmFvcywgbmV3IGJ5dGVbXXsxLCAyfSk7CisgICAgICAgIGNvcy5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKHBhc3NlZC5iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0J5dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFzc2VkIHBhc3NlZCA9IG5ldyBQYXNzZWQoKTsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDApOworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHNldHVwQnVmZmVyZWRTdHJlYW1Qcm92aWRlcihwYXNzZWQsIGJhb3MsIGNvcywgMCk7CisKKyAgICAgICAgY2hlY2tOb3RZZXRDb21taXR0ZWQocGFzc2VkLCBiYW9zLCBjb3MpOworCisgICAgICAgIGNvcy5jb21taXQoKTsKKworICAgICAgICBjaGVjayhiYW9zLCBudWxsKTsKKyAgICAgICAgY29zLmNsb3NlKCk7CisgICAgICAgIGFzc2VydFRydWUocGFzc2VkLmIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlck92ZXJmbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFzc2VkIHBhc3NlZCA9IG5ldyBQYXNzZWQoKTsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDApOworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHNldHVwQnVmZmVyZWRTdHJlYW1Qcm92aWRlcihwYXNzZWQsIGJhb3MsIGNvcywgLTEpOworCisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgMSk7CisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgMik7CisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgMyk7CisgICAgICAgIGNoZWNrTm90WWV0Q29tbWl0dGVkKHBhc3NlZCwgYmFvcywgY29zKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSA0KTsKKyAgICAgICAgY2hlY2soYmFvcywgbmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSk7CisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgNSk7CisgICAgICAgIGNoZWNrKGJhb3MsIG5ldyBieXRlW117MSwgMiwgMywgNCwgNX0pOworCisgICAgICAgIGNvcy5jb21taXQoKTsKKworICAgICAgICBjaGVjayhiYW9zLCBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDV9KTsKKyAgICAgICAgY29zLmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90QnVmZmVyZWRPUygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhc3NlZCBwYXNzZWQgPSBuZXcgUGFzc2VkKCk7CisgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDAwKTsKKyAgICAgICAgQ29tbWl0dGluZ091dHB1dFN0cmVhbSBjb3MgPSBuZXcgQ29tbWl0dGluZ091dHB1dFN0cmVhbSgpOworICAgICAgICBzZXR1cFN0cmVhbVByb3ZpZGVyKHBhc3NlZCwgYmFvcywgY29zKTsKKworICAgICAgICBjaGVja05vdFlldENvbW1pdHRlZChwYXNzZWQsIGJhb3MsIGNvcyk7CisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgMSk7CisgICAgICAgIGNoZWNrQ29tbWl0dGVkKHBhc3NlZCwgY29zKTsKKyAgICAgICAgY2hlY2soYmFvcywgbmV3IGJ5dGVbXXsxfSk7CisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgMik7CisgICAgICAgIGNoZWNrQ29tbWl0dGVkKHBhc3NlZCwgY29zKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAzKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSA0KTsKKyAgICAgICAgY2hlY2soYmFvcywgbmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSk7CisgICAgICAgIGNvcy53cml0ZSgoYnl0ZSkgNSk7CisgICAgICAgIGNoZWNrKGJhb3MsIG5ldyBieXRlW117MSwgMiwgMywgNCwgNX0pOworCisgICAgICAgIGNvcy5jb21taXQoKTsKKyAgICAgICAgY2hlY2tDb21taXR0ZWQocGFzc2VkLCBjb3MpOworICAgICAgICBjaGVjayhiYW9zLCBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDV9KTsKKyAgICAgICAgY29zLmNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zLCBieXRlLi4uIGJ5dGVzKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhieXRlcyA9PSBudWxsID8gMCA6IGJ5dGVzLmxlbmd0aCwgYmFvcy5zaXplKCkpOworCisgICAgICAgIGlmIChieXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gYWN0dWFsQnl0ZXMgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ5dGVzW2ldLCBhY3R1YWxCeXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzV2l0aE1lc3NhZ2VDb250ZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSAyMDsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChDb21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiwgc2l6ZSk7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVUeXBlIHJ1bnRpbWUgPSBSdW50aW1lVHlwZS5DTElFTlQ7CisKKyAgICAgICAgY2hlY2tCdWZmZXJTaXplKHNpemUsIHByb3BlcnRpZXMsIHJ1bnRpbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNXaXRoTWVzc2FnZUNvbnRleHRWZXJ5QmlnQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSAyMDAwMDA7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJvcGVydGllcy5wdXQoQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIsIHNpemUpOworICAgICAgICBmaW5hbCBSdW50aW1lVHlwZSBydW50aW1lID0gUnVudGltZVR5cGUuQ0xJRU5UOworCisgICAgICAgIGNoZWNrQnVmZmVyU2l6ZShzaXplLCBwcm9wZXJ0aWVzLCBydW50aW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzV2l0aE1lc3NhZ2VDb250ZXh0TWlzc2luZ1NlcnZlclNwZWNpZmljKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSAyMjsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChDb21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiwgc2l6ZSk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KENvbW1vblByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSICsgIi5jbGllbnQiLCBzaXplICogMik7CisgICAgICAgIGNoZWNrQnVmZmVyU2l6ZShzaXplLCBwcm9wZXJ0aWVzLCBSdW50aW1lVHlwZS5TRVJWRVIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNXaXRoTWVzc2FnZUNvbnRleHRNaXNzaW5nU2VydmVyQXRBbGwoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IDIyOworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSLCBSdW50aW1lVHlwZS5DTElFTlQpLCBzaXplKTsKKyAgICAgICAgY2hlY2tCdWZmZXJTaXplKENvbW1pdHRpbmdPdXRwdXRTdHJlYW0uREVGQVVMVF9CVUZGRVJfU0laRSwgcHJvcGVydGllcywgUnVudGltZVR5cGUuU0VSVkVSKTsKKyAgICAgICAgY2hlY2tCdWZmZXJTaXplKHNpemUsIHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLkNMSUVOVCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc1dpdGhNZXNzYWdlQ29udGV4dENsaWVudE92ZXJyaWRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gMjI7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJvcGVydGllcy5wdXQoQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIsIHNpemUpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChQcm9wZXJ0aWVzSGVscGVyLmdldFByb3BlcnR5TmFtZUZvclJ1bnRpbWUoQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIsCisgICAgICAgICAgICAgICAgUnVudGltZVR5cGUuQ0xJRU5UKSwgc2l6ZSAqIDIpOworCisgICAgICAgIGNoZWNrQnVmZmVyU2l6ZShzaXplICogMiwgcHJvcGVydGllcywgUnVudGltZVR5cGUuQ0xJRU5UKTsKKyAgICAgICAgY2hlY2tCdWZmZXJTaXplKHNpemUsIHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLlNFUlZFUik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc1dpdGhNZXNzYWdlQ29udGV4dERlZmF1bHROb1Byb3BzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmaW5hbCBSdW50aW1lVHlwZSBydW50aW1lID0gUnVudGltZVR5cGUuQ0xJRU5UOworCisgICAgICAgIGNoZWNrQnVmZmVyU2l6ZShDb21taXR0aW5nT3V0cHV0U3RyZWFtLkRFRkFVTFRfQlVGRkVSX1NJWkUsIHByb3BlcnRpZXMsIHJ1bnRpbWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0J1ZmZlclNpemUoaW50IGV4cGVjdGVkU2l6ZSwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzLCBSdW50aW1lVHlwZSBydW50aW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IG91dGJvdW5kTWVzc2FnZUNvbnRleHQgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICBmaW5hbCBQYXNzZWQgcGFzc2VkID0gbmV3IFBhc3NlZCgpOworICAgICAgICBvdXRib3VuZE1lc3NhZ2VDb250ZXh0LnNldFN0cmVhbVByb3ZpZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSwgY29udGVudExlbmd0aCk7CisgICAgICAgICAgICAgICAgcGFzc2VkLnBhc3MoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIENvbW1vbkNvbmZpZyBjb25maWd1cmF0aW9uID0gbmV3IENvbW1vbkNvbmZpZyhydW50aW1lLCBDb21wb25lbnRCYWcuSU5DTFVERV9BTEwpOworICAgICAgICBjb25maWd1cmF0aW9uLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisgICAgICAgIG91dGJvdW5kTWVzc2FnZUNvbnRleHQuZW5hYmxlQnVmZmVyaW5nKGNvbmZpZ3VyYXRpb24pOworCisgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBvdXRib3VuZE1lc3NhZ2VDb250ZXh0LmdldEVudGl0eVN0cmVhbSgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgKGkgPCAxMDAwMDAwKSAmJiAoIXBhc3NlZC5iKTsgaSsrKSB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoKGJ5dGUpIDY1KTsKKyAgICAgICAgICAgIGlmIChpID49IGV4cGVjdGVkU2l6ZSArIDEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoImNvbW1pdHRlZCBhbHJlYWR5IHdpdGggYnl0ZSAjIiArIGksIHBhc3NlZC5iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUocGFzc2VkLmIpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlQnVmZmVyaW5nKCkgeworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGNvcy5lbmFibGVCdWZmZXJpbmcoNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVCdWZmZXJpbmdJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGNvcy5zZXRTdHJlYW1Qcm92aWRlcihuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oaW50IGNvbnRlbnRMZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBjb3Mud3JpdGUoJ2EnKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvcy5lbmFibGVCdWZmZXJpbmcoNTAwKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gYmVjYXVzZSBvZiBsYXRlIHNldHVwIG9mIGVuYWJsZUJ1ZmZlcmluZyB3aGVuIGJ5dGVzIGFyZSBhbHJlYWR5IHdyaXR0ZW4uIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRoaXMgaXMgb2sgLSBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93bjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIC8vIG9rIC0gc2hvdWxkIGJlIHRocm93biAoYnl0ZXMgYXJlIGFscmVhZHkgd3JpdHRlbikuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRTdHJhbVByb3ZpZGVySWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zID0gbmV3IENvbW1pdHRpbmdPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgY29zLmVuYWJsZUJ1ZmZlcmluZygxKTsKKyAgICAgICAgd3JpdGVBbmRDaGVja0lsbGVnYWxTdGF0ZShjb3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFN0cmFtUHJvdmlkZXJJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWl0dGluZ091dHB1dFN0cmVhbSBjb3MgPSBuZXcgQ29tbWl0dGluZ091dHB1dFN0cmVhbSgpOworICAgICAgICB3cml0ZUFuZENoZWNrSWxsZWdhbFN0YXRlKGNvcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQW5kQ2hlY2tJbGxlZ2FsU3RhdGUoQ29tbWl0dGluZ091dHB1dFN0cmVhbSBjb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb3Mud3JpdGUoJ2EnKTsKKyAgICAgICAgICAgIGNvcy53cml0ZSgnYScpOworICAgICAgICAgICAgY29zLndyaXRlKCdhJyk7CisgICAgICAgICAgICBjb3Mud3JpdGUoJ2EnKTsKKyAgICAgICAgICAgIGNvcy53cml0ZSgnYScpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBiZWNhdXNlIG9mIG1pc3Npbmcgc3RyZWFtIHByb3ZpZGVyIChieXRlcyBhcmUgYWxyZWFkeSB3cml0dGVuKS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGhpcyBpcyBvayAtIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgLy8gb2sgLSBzaG91bGQgYmUgdGhyb3duIChieXRlcyBhcmUgYWxyZWFkeSB3cml0dGVuKS4KKyAgICAgICAgfQorICAgIH0KKworfQorCisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0Nvb2tpZXNQYXJzZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvQ29va2llc1BhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2NlMjViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0Nvb2tpZXNQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5OZXdDb29raWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkNvb2tpZXNQYXJzZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQ29va2llc1BhcnNlclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkVFRSwgZGQgTU1NIHl5eXkgSEg6bW06c3Mgenp6IiwgTG9jYWxlLlVTKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhc2VJbnNlbnNpdGl2ZU5ld0Nvb2tpZVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdENhc2VJbnNlbnNpdGl2ZU5ld0Nvb2tpZVBhcmFtcygiZXhwaXJlcyIsICJtYXgtYWdlIiwgInBhdGgiLCAiZG9tYWluIiwgImNvbW1lbnQiLCAidmVyc2lvbiIsICJzZWN1cmUiLCAiaHR0cG9ubHkiKTsKKyAgICAgICAgX3Rlc3RDYXNlSW5zZW5zaXRpdmVOZXdDb29raWVQYXJhbXMoIkV4cGlyZXMiLCAiTWF4LUFnZSIsICJQYXRoIiwgIkRvbWFpbiIsICJDb21tZW50IiwgIlZlcnNpb24iLCAiU2VjdXJlIiwgIkh0dHBPbmx5Iik7CisgICAgICAgIF90ZXN0Q2FzZUluc2Vuc2l0aXZlTmV3Q29va2llUGFyYW1zKCJleFBpcmVzIiwgIm1heC1hR2UiLCAicGF0SCIsICJkb01BaW4iLCAiQ29tbWVudCIsICJ2RXJzaW9uIiwgInNlY3VSZSIsICJodHRQb25seSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdENhc2VJbnNlbnNpdGl2ZU5ld0Nvb2tpZVBhcmFtcyhmaW5hbCBTdHJpbmcgZXhwaXJlcywgZmluYWwgU3RyaW5nIG1heEFnZSwgZmluYWwgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkb21haW4sIGZpbmFsIFN0cmluZyBjb21tZW50LCBmaW5hbCBTdHJpbmcgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlY3VyZSwgZmluYWwgU3RyaW5nIGh0dHBPbmx5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gImZvbz1iYXI7IgorICAgICAgICAgICAgICAgICsgZXhwaXJlcyArICI9VHVlLCAxNSBKYW4gMjAxMyAyMTo0NzozOCBHTVQ7IgorICAgICAgICAgICAgICAgICsgbWF4QWdlICsgIj00MjsiCisgICAgICAgICAgICAgICAgKyBwYXRoICsgIj0vOyIKKyAgICAgICAgICAgICAgICArIGRvbWFpbiArICI9LmV4YW1wbGUuY29tOyIKKyAgICAgICAgICAgICAgICArIGNvbW1lbnQgKyAiPVRlc3Rpbmc7IgorICAgICAgICAgICAgICAgICsgdmVyc2lvbiArICI9MTsiCisgICAgICAgICAgICAgICAgKyBzZWN1cmUgKyAiOyIKKyAgICAgICAgICAgICAgICArIGh0dHBPbmx5OworCisgICAgICAgIGZpbmFsIE5ld0Nvb2tpZSBjb29raWUgPSBDb29raWVzUGFyc2VyLnBhcnNlTmV3Q29va2llKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjb29raWUuZ2V0TmFtZSgpLCBlcXVhbFRvKCJmb28iKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29va2llLmdldFZhbHVlKCksIGVxdWFsVG8oImJhciIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KGNvb2tpZS5nZXRFeHBpcnkoKSwgZXF1YWxUbyhkYXRlRm9ybWF0LnBhcnNlKCJUdWUsIDE1IEphbiAyMDEzIDIxOjQ3OjM4IEdNVCIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29va2llLmdldE1heEFnZSgpLCBlcXVhbFRvKDQyKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29va2llLmdldFBhdGgoKSwgZXF1YWxUbygiLyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb29raWUuZ2V0RG9tYWluKCksIGVxdWFsVG8oIi5leGFtcGxlLmNvbSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb29raWUuZ2V0Q29tbWVudCgpLCBlcXVhbFRvKCJUZXN0aW5nIikpOworICAgICAgICBhc3NlcnRUaGF0KGNvb2tpZS5nZXRWZXJzaW9uKCksIGVxdWFsVG8oMSkpOworICAgICAgICBhc3NlcnRUaGF0KGNvb2tpZS5pc1NlY3VyZSgpLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29va2llLmlzSHR0cE9ubHkoKSwgaXModHJ1ZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9IZWFkZXJVdGlsc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9IZWFkZXJVdGlsc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjEyZTFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0hlYWRlclV0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQWJzdHJhY3RNdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uVGVzdFJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICoge0BsaW5rIEhlYWRlclV0aWxzfSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkZXJVdGlsc1Rlc3QgeworCisgICAgcHVibGljIEhlYWRlclV0aWxzVGVzdCgpIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlLnNldEluc3RhbmNlKG5ldyBUZXN0UnVudGltZURlbGVnYXRlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUluYm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGluYm91bmQgPSBIZWFkZXJVdGlscy5jcmVhdGVJbmJvdW5kKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaW5ib3VuZCk7CisKKyAgICAgICAgLy8gVGVzdCBtdXRhYmlsaXR5LgorICAgICAgICBpbmJvdW5kLnB1dFNpbmdsZSgia2V5IiwgInZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBpbmJvdW5kLmdldEZpcnN0KCJrZXkiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGVtcHR5U3RyaW5ncyA9IEhlYWRlclV0aWxzLmVtcHR5KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZW1wdHlTdHJpbmdzKTsKKworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gZW1wdHlPYmplY3RzID0gSGVhZGVyVXRpbHMuZW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbXB0eU9iamVjdHMpOworCisgICAgICAgIC8vIFRlc3QgaW1tdXRhYmlsaXR5LgorICAgICAgICB0cnkgeworICAgICAgICAgICAgZW1wdHlTdHJpbmdzLnB1dFNpbmdsZSgia2V5IiwgInZhbHVlIik7CisgICAgICAgICAgICBmYWlsKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHBhc3NlZAorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbXB0eU9iamVjdHMucHV0U2luZ2xlKCJrZXkiLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gcGFzc2VkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPdXRib3VuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gb3V0Ym91bmQgPSBIZWFkZXJVdGlscy5jcmVhdGVPdXRib3VuZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKG91dGJvdW5kKTsKKworICAgICAgICAvLyBUZXN0IG11dGFiaWxpdHkuCisgICAgICAgIG91dGJvdW5kLnB1dFNpbmdsZSgia2V5IiwgInZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBvdXRib3VuZC5nZXRGaXJzdCgia2V5IikpOworCisgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgb3V0Ym91bmQucHV0U2luZ2xlKCJrZXkiLCB2YWx1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgb3V0Ym91bmQuZ2V0Rmlyc3QoImtleSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKEhlYWRlclV0aWxzLmFzU3RyaW5nKG51bGwsIG51bGwpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSAidmFsdWUiOworICAgICAgICBhc3NlcnRTYW1lKHZhbHVlLCBIZWFkZXJVdGlscy5hc1N0cmluZyh2YWx1ZSwgbnVsbCkpOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBuZXcgVVJJKCJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyh1cmkudG9BU0NJSVN0cmluZygpLCBIZWFkZXJVdGlscy5hc1N0cmluZyh1cmksIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1N0cmluZ0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChIZWFkZXJVdGlscy5hc1N0cmluZ0xpc3QobnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRUcnVlKEhlYWRlclV0aWxzLmFzU3RyaW5nTGlzdChudWxsLCBudWxsKS5pc0VtcHR5KCkpOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBuZXcgVVJJKCJ0ZXN0Iik7CisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiB2YWx1ZXMgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCkge3sKKyAgICAgICAgICAgIGFkZCgidmFsdWUiKTsKKyAgICAgICAgICAgIGFkZChudWxsKTsKKyAgICAgICAgICAgIGFkZCh1cmkpOworICAgICAgICB9fTsKKworICAgICAgICAvLyB0ZXN0IHN0cmluZyB2YWx1ZXMKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHN0cmluZ0xpc3QgPSBIZWFkZXJVdGlscy5hc1N0cmluZ0xpc3QodmFsdWVzLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoInZhbHVlIiwgIltudWxsXSIsIHVyaS50b0FTQ0lJU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nTGlzdCk7CisKKyAgICAgICAgLy8gdGVzdHMgbGl2ZSB2aWV3CisgICAgICAgIHZhbHVlcy5hZGQoInZhbHVlMiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgidmFsdWUiLCAiW251bGxdIiwgdXJpLnRvQVNDSUlTdHJpbmcoKSwgInZhbHVlMiIpLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nTGlzdCk7CisgICAgICAgIHZhbHVlcy5yZW1vdmUoMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJ2YWx1ZSIsIHVyaS50b0FTQ0lJU3RyaW5nKCksICJ2YWx1ZTIiKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0xpc3QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzU3RyaW5nSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKEhlYWRlclV0aWxzLmFzU3RyaW5nSGVhZGVycyhudWxsKSk7CisKKyAgICAgICAgZmluYWwgQWJzdHJhY3RNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycyA9IEhlYWRlclV0aWxzLmNyZWF0ZU91dGJvdW5kKCk7CisKKyAgICAgICAgaGVhZGVycy5wdXRTaW5nbGUoImsxIiwgInZhbHVlIik7CisgICAgICAgIGhlYWRlcnMuYWRkKCJrMSIsICJ2YWx1ZTIiKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gbmV3IFVSSSgidGVzdCIpOworICAgICAgICBoZWFkZXJzLnB1dFNpbmdsZSgiazIiLCB1cmkpOworCisgICAgICAgIGhlYWRlcnMucHV0U2luZ2xlKCJrMyIsICJ2YWx1ZTMiKTsKKworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyaW5nSGVhZGVycyA9IEhlYWRlclV0aWxzLmFzU3RyaW5nSGVhZGVycyhoZWFkZXJzKTsKKworICAgICAgICAvLyB0ZXN0IHN0cmluZyB2YWx1ZXMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoInZhbHVlIiwgInZhbHVlMiIpLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nSGVhZGVycy5nZXQoImsxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1cmkudG9BU0NJSVN0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0hlYWRlcnMuZ2V0KCJrMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInZhbHVlMyIpLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nSGVhZGVycy5nZXQoImszIikpOworCisgICAgICAgIC8vIHRlc3QgbGl2ZSB2aWV3CisgICAgICAgIGhlYWRlcnMuZ2V0KCJrMSIpLnJlbW92ZSgxKTsKKyAgICAgICAgaGVhZGVycy5hZGQoImsyIiwgInZhbHVlNCIpOworICAgICAgICBoZWFkZXJzLnJlbW92ZSgiazMiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidmFsdWUiKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0hlYWRlcnMuZ2V0KCJrMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QodXJpLnRvQVNDSUlTdHJpbmcoKSwgInZhbHVlNCIpLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nSGVhZGVycy5nZXQoImsyIikpOworICAgICAgICBhc3NlcnRGYWxzZShzdHJpbmdIZWFkZXJzLmNvbnRhaW5zS2V5KCJrMyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc0hlYWRlclN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROdWxsKEhlYWRlclV0aWxzLmFzSGVhZGVyU3RyaW5nKG51bGwsIG51bGwpKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gbmV3IFVSSSgidGVzdCIpOworICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gdmFsdWVzID0gQXJyYXlzLmFzTGlzdCgidmFsdWUiLCBudWxsLCB1cmkpOworCisgICAgICAgIC8vIHRlc3Qgc3RyaW5nIHZhbHVlcworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gSGVhZGVyVXRpbHMuYXNIZWFkZXJTdHJpbmcodmFsdWVzLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSxbbnVsbF0sIiArIHVyaS50b0FTQ0lJU3RyaW5nKCksIHJlc3VsdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0luYm91bmRNZXNzYWdlQ29udGV4dFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9JbmJvdW5kTWVzc2FnZUNvbnRleHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0NTUxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9JbmJvdW5kTWVzc2FnZUNvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRW50aXR5VGFnOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5Db29raWVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkluYm91bmRNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLlRlc3RSdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkluYm91bmRNZXNzYWdlQ29udGV4dH0gdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSW5ib3VuZE1lc3NhZ2VDb250ZXh0VGVzdCB7CisKKyAgICBwdWJsaWMgSW5ib3VuZE1lc3NhZ2VDb250ZXh0VGVzdCgpIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlLnNldEluc3RhbmNlKG5ldyBUZXN0UnVudGltZURlbGVnYXRlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEluYm91bmRNZXNzYWdlQ29udGV4dCBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgSXRlcmFibGU8UmVhZGVySW50ZXJjZXB0b3I+IGdldFJlYWRlckludGVyY2VwdG9ycygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9MZW5ndGgoKSB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgci5nZXRMZW5ndGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdENvb2tpZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuQ09PS0lFLCAib3Jlbz1jaG9jb2xhdGUiKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuQ09PS0lFLCAibmlsbGE9dmFuaWxsYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRSZXF1ZXN0Q29va2llcygpLnNpemUoKSwgMik7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXF1ZXN0Q29va2llcygpLmNvbnRhaW5zS2V5KCJvcmVvIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0UmVxdWVzdENvb2tpZXMoKS5jb250YWluc0tleSgibmlsbGEiKSk7CisgICAgICAgIENvb2tpZVByb3ZpZGVyIGNwID0gbmV3IENvb2tpZVByb3ZpZGVyKCk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXF1ZXN0Q29va2llcygpLmNvbnRhaW5zVmFsdWUoY3AuZnJvbVN0cmluZygib3Jlbz1jaG9jb2xhdGUiKSkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0UmVxdWVzdENvb2tpZXMoKS5jb250YWluc1ZhbHVlKGNwLmZyb21TdHJpbmcoIm5pbGxhPXZhbmlsbGEiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGUoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLkRBVEUsICJUdWUsIDI5IEphbiAyMDAyIDIyOjE0OjAyIC0wNTAwIik7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFLCBkZCBNTU0geXl5eSBISDptbTpzcyBaIiwgTG9jYWxlLkVOR0xJU0gpOworICAgICAgICBEYXRlIGRhdGUgPSBmLnBhcnNlKCJUdWUsIDI5IEphbiAyMDAyIDIyOjE0OjAyIC0wNTAwIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmdldERhdGUoKSwgZGF0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi94bWwsIHRleHQvcGxhaW4iKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBULCAiYXBwbGljYXRpb24vanNvbiIpOworICAgICAgICByLmhlYWRlcigiRk9PIiwgIiIpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFDQ0VQVCkuY29udGFpbnMoImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BQ0NFUFQpLmNvbnRhaW5zKCJ0ZXh0L3BsYWluIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFDQ0VQVCkuY29udGFpbnMoImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmdldEhlYWRlclN0cmluZygiRk9PIikubGVuZ3RoKCksIDApOworICAgICAgICBhc3NlcnROdWxsKHIuZ2V0SGVhZGVyU3RyaW5nKCJCQVIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyTWFwKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi94bWwsIHRleHQvcGxhaW4iKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBULCAiYXBwbGljYXRpb24vanNvbiIpOworICAgICAgICByLmhlYWRlcigiQWxsb3ciLCAiR0VULCBQVVQiKTsKKyAgICAgICAgci5oZWFkZXIoIkFsbG93IiwgIlBPU1QiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlcnMoKS5jb250YWluc0tleShIdHRwSGVhZGVycy5BQ0NFUFQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlcnMoKS5jb250YWluc0tleSgiQWxsb3ciKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRIZWFkZXJzKCkuZ2V0KEh0dHBIZWFkZXJzLkFDQ0VQVCkuY29udGFpbnMoImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRIZWFkZXJzKCkuZ2V0KCJBbGxvdyIpLmNvbnRhaW5zKCJQT1NUIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93ZWRNZXRob2RzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuaGVhZGVyKCJBbGxvdyIsICJHRVQsIFBVVCIpOworICAgICAgICByLmhlYWRlcigiQWxsb3ciLCAiUE9TVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgci5nZXRBbGxvd2VkTWV0aG9kcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBbGxvd2VkTWV0aG9kcygpLmNvbnRhaW5zKCJHRVQiKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBbGxvd2VkTWV0aG9kcygpLmNvbnRhaW5zKCJQVVQiKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBbGxvd2VkTWV0aG9kcygpLmNvbnRhaW5zKCJQT1NUIikpOworICAgICAgICBhc3NlcnRGYWxzZShyLmdldEFsbG93ZWRNZXRob2RzKCkuY29udGFpbnMoIkRFTEVURSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUNvb2tpZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuU0VUX0NPT0tJRSwgIm9yZW89Y2hvY29sYXRlIik7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLlNFVF9DT09LSUUsICJuaWxsYT12YW5pbGxhIik7CisgICAgICAgIGFzc2VydEVxdWFscygyLCByLmdldFJlc3BvbnNlQ29va2llcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXNwb25zZUNvb2tpZXMoKS5jb250YWluc0tleSgib3JlbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldFJlc3BvbnNlQ29va2llcygpLmNvbnRhaW5zS2V5KCJuaWxsYSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlUYWcoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuRVRBRywgIlwidGFnXCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVRhZy52YWx1ZU9mKCJcInRhZ1wiIiksIHIuZ2V0RW50aXR5VGFnKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhc3RNb2RpZmllZCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuTEFTVF9NT0RJRklFRCwgIlR1ZSwgMjkgSmFuIDIwMDIgMjI6MTQ6MDIgLTA1MDAiKTsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIFoiLCBMb2NhbGUuRU5HTElTSCk7CisgICAgICAgIERhdGUgZGF0ZSA9IGYucGFyc2UoIlR1ZSwgMjkgSmFuIDIwMDIgMjI6MTQ6MDIgLTA1MDAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGUsIHIuZ2V0TGFzdE1vZGlmaWVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLkxPQ0FUSU9OLCAiaHR0cDovL2V4YW1wbGUub3JnL2FwcCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcCIpLCByLmdldExvY2F0aW9uKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmtzKCkgeworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICBMaW5rIGxpbmsxID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIikucGFyYW0oInByb2R1Y2VzIiwgImFwcGxpY2F0aW9uL2pzb24iKS5wYXJhbSgibWV0aG9kIiwKKyAgICAgICAgICAgICAgICAiR0VUIikucmVsKCJzZWxmIikuYnVpbGQoKTsKKyAgICAgICAgTGluayBsaW5rMiA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMiIpLnBhcmFtKCJwcm9kdWNlcyIsICJhcHBsaWNhdGlvbi94bWwiKS5wYXJhbSgibWV0aG9kIiwKKyAgICAgICAgICAgICAgICAiUFVUIikucmVsKCJzZWxmIikuYnVpbGQoKTsKKyAgICAgICAgci5oZWFkZXIoIkxpbmsiLCBsaW5rMS50b1N0cmluZygpKTsKKyAgICAgICAgci5oZWFkZXIoIkxpbmsiLCBsaW5rMi50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0TGlua3MoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMSkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmtzV2l0aENvbW1hSW5VcmkoKSB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIExpbmsgbGluazEgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvZm9vLGJhciIpLnBhcmFtKCJwcm9kdWNlcyIsICJhcHBsaWNhdGlvbi9qc29uIikucGFyYW0oIm1ldGhvZCIsCisgICAgICAgICAgICAgICAgIkdFVCIpLnJlbCgic2VsZiIpLmJ1aWxkKCk7CisgICAgICAgIHIuaGVhZGVyKCJMaW5rIiwgbGluazEudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByLmdldExpbmtzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldExpbmtzKCkuY29udGFpbnMobGluazEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMaW5rc1dpdGhNdWx0aXBsZUxpbmtzSW5PbmVIZWFkZXJBbmRDb21tYUluVXJpKCkgeworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICBMaW5rIGxpbmsxID0gTGluay5mcm9tVXJpKCJodHRwczovL2V4YW1wbGUub3JnL29uZS9hcGkvZ3JvdXBzP2ZvbyxwYWdlPTIiKS5yZWwoIm5leHQiKS5idWlsZCgpOworICAgICAgICBMaW5rIGxpbmsyID0gTGluay5mcm9tVXJpKCJodHRwczovL2V4YW1wbGUub3JnL29uZS9hcGkvZ3JvdXBzP2JhcixwYWdlPTM5IikucmVsKCJsYXN0IikuYnVpbGQoKTsKKyAgICAgICAgci5oZWFkZXIoIkxpbmsiLCAiPGh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/Zm9vLHBhZ2U9Mj47IHJlbD1cIm5leHRcIiwgPGh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/YmFyLHBhZ2U9Mzk+OyByZWw9XCJsYXN0XCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0TGlua3MoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMSkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmtzV2l0aE11bHRpcGxlTGlua3NJbk9uZUhlYWRlcigpIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgTGluayBsaW5rMSA9IExpbmsuZnJvbVVyaSgiaHR0cHM6Ly9leGFtcGxlLm9yZy9vbmUvYXBpL2dyb3Vwcz9wYWdlPTIiKS5yZWwoIm5leHQiKS5idWlsZCgpOworICAgICAgICBMaW5rIGxpbmsyID0gTGluay5mcm9tVXJpKCJodHRwczovL2V4YW1wbGUub3JnL29uZS9hcGkvZ3JvdXBzP3BhZ2U9MzkiKS5yZWwoImxhc3QiKS5idWlsZCgpOworICAgICAgICByLmhlYWRlcigiTGluayIsICI8aHR0cHM6Ly9leGFtcGxlLm9yZy9vbmUvYXBpL2dyb3Vwcz9wYWdlPTI+OyByZWw9XCJuZXh0XCIsIDxodHRwczovL2V4YW1wbGUub3JnL29uZS9hcGkvZ3JvdXBzP3BhZ2U9Mzk+OyByZWw9XCJsYXN0XCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0TGlua3MoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMSkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmtzV2l0aE11bHRpcGxlTGlua3NJbk9uZUhlYWRlcldpdGhMdEluVmFsdWUoKSB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIExpbmsgbGluazEgPSBMaW5rLmZyb21VcmkoImh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/cGFnZT0yIikucmVsKCJuZXh0IikucGFyYW0oImZvbyIsICI8YmFyPiIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbGluazIgPSBMaW5rLmZyb21VcmkoImh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/cGFnZT0zOSIpLnJlbCgibGFzdCIpLnBhcmFtKCJiYXIiLCAiPDxmb28iKS5idWlsZCgpOworICAgICAgICByLmhlYWRlcigiTGluayIsICI8aHR0cHM6Ly9leGFtcGxlLm9yZy9vbmUvYXBpL2dyb3Vwcz9wYWdlPTI+OyByZWw9XCJuZXh0XCI7IGZvbz1cIjxiYXI+XCIsIDxodHRwczovL2V4YW1wbGUub3JnL29uZS9hcGkvZ3JvdXBzP3BhZ2U9Mzk+OyByZWw9XCJsYXN0XCI7IGJhcj1cIjw8Zm9vXCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0TGlua3MoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMSkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmsoKSB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIExpbmsgbGluazEgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24vanNvbiIpLnBhcmFtKCJtZXRob2QiLAorICAgICAgICAgICAgICAgICJHRVQiKS5yZWwoInNlbGYiKS5idWlsZCgpOworICAgICAgICBMaW5rIGxpbmsyID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsyIikucGFyYW0oInByb2R1Y2VzIiwgImFwcGxpY2F0aW9uL3htbCIpLnBhcmFtKCJtZXRob2QiLAorICAgICAgICAgICAgICAgICJQVVQiKS5yZWwoInVwZGF0ZSIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbGluazMgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazIiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24veG1sIikucGFyYW0oIm1ldGhvZCIsCisgICAgICAgICAgICAgICAgIlBPU1QiKS5yZWwoInVwZGF0ZSIpLmJ1aWxkKCk7CisgICAgICAgIHIuaGVhZGVyKCJMaW5rIiwgbGluazEudG9TdHJpbmcoKSk7CisgICAgICAgIHIuaGVhZGVyKCJMaW5rIiwgbGluazIudG9TdHJpbmcoKSk7CisgICAgICAgIHIuaGVhZGVyKCJMaW5rIiwgbGluazMudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rKCJzZWxmIikuZXF1YWxzKGxpbmsxKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rKCJ1cGRhdGUiKS5lcXVhbHMobGluazIpIHx8IHIuZ2V0TGluaygidXBkYXRlIikuZXF1YWxzKGxpbmszKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsb3dlZE1ldGhvZHMoKSB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLkFMTE9XLCAiYSxCLENjQyxkRGQiKTsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYWxsb3dlZE1ldGhvZHMgPSByLmdldEFsbG93ZWRNZXRob2RzKCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBhbGxvd2VkTWV0aG9kcy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93ZWRNZXRob2RzLmNvbnRhaW5zKCJBIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93ZWRNZXRob2RzLmNvbnRhaW5zKCJCIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93ZWRNZXRob2RzLmNvbnRhaW5zKCJDQ0MiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3dlZE1ldGhvZHMuY29udGFpbnMoIkRERCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvSmVyc2V5TGlua1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9KZXJzZXlMaW5rVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjVkZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvSmVyc2V5TGlua1Rlc3QuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uVGVzdFJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIGZvciBMaW5rVGVzdCBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIFNhbnRpYWdvIFBlcmljYXMtR2VlcnRzZW4gKFNhbnRpYWdvLlBlcmljYXNHZWVydHNlbiBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5TGlua1Rlc3QgeworCisgICAgQFBhdGgoIi9teXJlc291cmNlIikKKyAgICBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHNlbGYoKSB7CisgICAgICAgICAgICByZXR1cm4gIm15c2VsZiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZyBub3RTZWxmKCkgeworICAgICAgICAgICAgcmV0dXJuICI8eG1sPm5vdFNlbGY8L3htbD4iOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZS5zZXRJbnN0YW5jZShuZXcgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSgpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VXJpKCkgeworICAgICAgICBVUkkgdSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKTsKKyAgICAgICAgTGluayBsMSA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpLnBhcmFtKCJmb28xIiwgImJhcjEiKS5wYXJhbSgiZm9vMiIsICJiYXIyIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLmdldFVyaSgpLCB1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLmdldFVyaUJ1aWxkZXIoKS5idWlsZCgpLCB1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICAgICAgTGluayBsaW5rID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIikucmVsKCJzZWxmIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT47IHJlbD1cInNlbGZcIiIsIGxpbmsudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0dGVycygpIHsKKyAgICAgICAgTGluayBsaW5rID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIikucmVsKCJzZWxmIikudHlwZSgidGV4dC9wbGFpbiIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIiksIGxpbmsuZ2V0VXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNlbGYiLCBsaW5rLmdldFJlbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGxpbmsuZ2V0VGl0bGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIGxpbmsuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGxpbmsuZ2V0UGFyYW1zKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIEpFUlNFWS0xMzc4IGZpeC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGJ1aWxkUmVsYXRpdmVMaW5rVGVzdCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImFhJTIwYmIiKSwgTGluay5mcm9tVXJpKCJhYSBiYiIpLmJ1aWxkKCkuZ2V0VXJpKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMzg3OiBJQUUgZXhwZWN0ZWQgb24gdW5yZXNvbHZlZCBVUkkgdGVtcGxhdGUgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5rQnVpbGRlcldpdGhVbnJlc29sdmVkVGVtcGxhdGVzKCkgeworICAgICAgICBMaW5rLkJ1aWxkZXIgbGlua0J1aWxkZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaW5rQnVpbGRlciA9IExpbmsuZnJvbVVyaSgic2NoZW1lOi8vYXV0aG9yaXR5L3t4MX0ve3gyfS97eDN9Iik7CisgICAgICAgICAgICBsaW5rQnVpbGRlci5idWlsZCgicCIpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHRocm93biBmcm9tIExpbmsuQnVpbGRlciB3aGVuIHRoZXJlIGFyZSB1bnJlc29sdmVkIHRlbXBsYXRlcy4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAvLyBleGNlcHRpb24gZXhwZWN0ZWQsIG1vdmUgb24uLi4KKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbGlua0J1aWxkZXIgPSBMaW5rLmZyb21VcmkoInNjaGVtZTovL2F1dGhvcml0eS97eDF9L3t4Mn0ve3gzfSIpOworICAgICAgICAgICAgbGlua0J1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyBleHBlY3RlZCB0byBiZSB0aHJvd24gZnJvbSBMaW5rLkJ1aWxkZXIgd2hlbiB0aGVyZSBhcmUgdW5yZXNvbHZlZCB0ZW1wbGF0ZXMuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgLy8gZXhjZXB0aW9uIGV4cGVjdGVkLCBtb3ZlIG9uLi4uCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvTGlua1Byb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0xpbmtQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjhmM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0xpbmtQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uVGVzdFJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBmb3IgTGlua1Byb3ZpZGVyIGNsYXNzLgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28gUGVyaWNhcy1HZWVydHNlbiAoU2FudGlhZ28uUGVyaWNhc0dlZXJ0c2VuIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMaW5rUHJvdmlkZXJUZXN0IHsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobmV3IFRlc3RSdW50aW1lRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlLnNldEluc3RhbmNlKG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2YoKSB7CisgICAgICAgIGZpbmFsIExpbmsgbDEgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKS5idWlsZCgpOworICAgICAgICBMaW5rIGwyID0gTGluay52YWx1ZU9mKCI8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT4iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgICAgIGwyID0gTGluay52YWx1ZU9mKCIgPGh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazE+Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhsMSwgbDIpOworICAgICAgICBsMiA9IExpbmsudmFsdWVPZigiIDxodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxPiAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZkV4Y2VwdGlvbnMoKSB7CisgICAgICAgIGludCBuT2ZFeGNlcHRpb25zID0gMDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmsudmFsdWVPZigiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG5PZkV4Y2VwdGlvbnMrKzsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTGluay52YWx1ZU9mKCI8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbk9mRXhjZXB0aW9ucysrOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaW5rLnZhbHVlT2YoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG5PZkV4Y2VwdGlvbnMrKzsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMobk9mRXhjZXB0aW9ucywgMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZlBhcmFtcygpIHsKKyAgICAgICAgZmluYWwgTGluayBsMSA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpLnBhcmFtKCJmb28xIiwgImJhcjEiKS5wYXJhbSgiZm9vMiIsICJiYXIyIikuYnVpbGQoKTsKKyAgICAgICAgTGluayBsMiA9IExpbmsudmFsdWVPZigiPGh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazE+OyBmb28xPVwiYmFyMVwiOyBmb28yID0gXCJiYXIyXCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgICAgIGwyID0gTGluay52YWx1ZU9mKCI8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT47IGZvbzI9XCJiYXIyXCI7IGZvbzE9IFwiYmFyMVwiIik7CisgICAgICAgIGFzc2VydEVxdWFscyhsMSwgbDIpOworICAgICAgICBsMiA9IExpbmsudmFsdWVPZigiPGh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazE+OyAgICAgIGZvbzE9XCJiYXIxXCI7ICAgICBmb28yPVwiYmFyMlwiIik7CisgICAgICAgIGFzc2VydEVxdWFscyhsMSwgbDIpOworICAgICAgICBsMiA9IExpbmsudmFsdWVPZigiPCBodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxICAgPjsgICAgICBmb28xPVwiYmFyMVwiOyAgICAgZm9vMj1cImJhcjJcIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEsIGwyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXAoKSB7CisgICAgICAgIGZpbmFsIExpbmsgbDEgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKS5wYXJhbSgiZm9vMSIsICJiYXIxIikucGFyYW0oImZvbzIiLCAiYmFyMiIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhsMSwgTGluay52YWx1ZU9mKGwxLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgZmluYWwgTGluayBsMiA9IExpbmsudmFsdWVPZigiPGh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazE+OyBmb28xPVwiYmFyMVwiOyBmb28yID0gXCJiYXIyXCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dERvdWJsZVF1b3RlcygpIHsKKyAgICAgICAgZmluYWwgTGluayBsMSA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpLnBhcmFtKCJmb28xIiwgImJhcjEiKS5wYXJhbSgiZm9vMiIsICJiYXIyIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBMaW5rLnZhbHVlT2YobDEudG9TdHJpbmcoKSkpOworICAgICAgICBmaW5hbCBMaW5rIGwyID0gTGluay52YWx1ZU9mKCI8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT47IGZvbzE9YmFyMTsgZm9vMiA9IGJhcjIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL01hdGNoaW5nRW50aXR5VGFnVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL01hdGNoaW5nRW50aXR5VGFnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDQ1N2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvTWF0Y2hpbmdFbnRpdHlUYWdUZXN0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRW50aXR5VGFnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwSGVhZGVyUmVhZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWF0Y2hpbmdFbnRpdHlUYWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICoge0BsaW5rIE1hdGNoaW5nRW50aXR5VGFnfSB1bml0IHRlc3RzIHBvcnRlZCBmcm9tIEplcnNleSAxLnguCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNYXRjaGluZ0VudGl0eVRhZ1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5VGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiXCIxXCIiOworICAgICAgICBTZXQ8TWF0Y2hpbmdFbnRpdHlUYWc+IHMgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRNYXRjaGluZ0VudGl0eVRhZyhoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBzLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKG5ldyBFbnRpdHlUYWcoIjEiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRW50aXR5VGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiXCIxXCIsIFcvXCIyXCIsIFwiM1wiIjsKKyAgICAgICAgU2V0PE1hdGNoaW5nRW50aXR5VGFnPiBzID0gSHR0cEhlYWRlclJlYWRlci5yZWFkTWF0Y2hpbmdFbnRpdHlUYWcoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcy5zaXplKCkpOworCisgICAgICAgIGFzc2VydFRydWUocy5jb250YWlucyhuZXcgRW50aXR5VGFnKCIxIikpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMobmV3IEVudGl0eVRhZygiMiIsIHRydWUpKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKG5ldyBFbnRpdHlUYWcoIjMiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFueU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiKiI7CisgICAgICAgIFNldDxNYXRjaGluZ0VudGl0eVRhZz4gcyA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZE1hdGNoaW5nRW50aXR5VGFnKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChzLnNpemUoKSwgaXMoZXF1YWxUbygwKSkpOworICAgICAgICBhc3NlcnRUaGF0KE1hdGNoaW5nRW50aXR5VGFnLkFOWV9NQVRDSCwgaXMocykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0xMjc4LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZEVudGl0eVRhZygpIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICIxXCIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSHR0cEhlYWRlclJlYWRlci5yZWFkTWF0Y2hpbmdFbnRpdHlUYWcoaGVhZGVyKTsKKyAgICAgICAgICAgIGZhaWwoIlBhcnNlRXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHBlLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoaGVhZGVyKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvTWVkaWFUeXBlc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9NZWRpYVR5cGVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZGNkODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvTWVkaWFUeXBlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwSGVhZGVyUmVhZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBNZWRpYVR5cGVzIHV0aWxpdHkgbWV0aG9kIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWxjZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVR5cGVzVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBlbXB0eUxpc3QgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgTWVkaWFUeXBlcy5jb252ZXJ0VG9TdHJpbmcoZW1wdHlMaXN0KSk7CisKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJcInRleHQvcGxhaW5cIiIsIE1lZGlhVHlwZXMuY29udmVydFRvU3RyaW5nKENvbGxlY3Rpb25zLnNpbmdsZXRvbihNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlwidGV4dC9wbGFpblwiLCBcImFwcGxpY2F0aW9uL2pzb25cIiIsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlcy5jb252ZXJ0VG9TdHJpbmcoQXJyYXlzLmFzTGlzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJcInRleHQvcGxhaW5cIiwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIFwidGV4dC9odG1sXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZXMuY29udmVydFRvU3RyaW5nKEFycmF5cy5hc0xpc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9zdFNwZWNpZmljKCkgeworCisgICAgICAgIE1lZGlhVHlwZSBtMTsKKyAgICAgICAgTWVkaWFUeXBlIG0yOworCisgICAgICAgIC8qIHdpbGRjYXJkIHR5cGUgKi8KKyAgICAgICAgbTEgPSBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRTsKKworICAgICAgICAvLyB3aWxkY2FyZCB0eXBlICMxIC0gY29uY3JldGUgdHlwZSB3aW5zCisgICAgICAgIG0yID0gbmV3IE1lZGlhVHlwZSgiZm9vIiwgImJhciIpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMSwgbTIsIG0yKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTIsIG0xLCBtMik7CisKKyAgICAgICAgLy8gd2lsZGNhcmQgdHlwZSAjMiAtIHdpbGRjYXJkIHN1YnR5cGUgd2lucworICAgICAgICBtMiA9IG5ldyBNZWRpYVR5cGUoImZvbyIsICIqIik7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0xLCBtMiwgbTIpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMiwgbTEsIG0yKTsKKworICAgICAgICAvLyB3aWxkY2FyZCB0eXBlICMzIC0gZmlyc3QgcGFyYW1ldGVyIHdpbnMKKyAgICAgICAgbTIgPSBuZXcgTWVkaWFUeXBlKCIqIiwgIioiKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTEsIG0yLCBtMSk7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0yLCBtMSwgbTIpOworCisgICAgICAgIC8qIHdpbGRjYXJkIHN1YnR5cGUgKi8KKyAgICAgICAgbTEgPSBuZXcgTWVkaWFUeXBlKCJtb28iLCAiKiIpOworCisgICAgICAgIC8vIHdpbGRjYXJkIHN1YnR5cGUgIzEgLSBjb25jcmV0ZSB0eXBlIHdpbnMKKyAgICAgICAgbTIgPSBuZXcgTWVkaWFUeXBlKCJmb28iLCAiYmFyIik7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0xLCBtMiwgbTIpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMiwgbTEsIG0yKTsKKworICAgICAgICAvLyB3aWxkY2FyZCBzdWJ0eXBlICMyIC0gZmlyc3QgcGFyYW1ldGVyIGluIG1ldGhvZCB3aW5zCisgICAgICAgIG0yID0gbmV3IE1lZGlhVHlwZSgiZm9vIiwgIioiKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTEsIG0yLCBtMSk7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0yLCBtMSwgbTIpOworCisgICAgICAgIC8qIGNvbmNyZXRlIHR5cGVzICovCisgICAgICAgIC8vIGNvbmNyZXRlIHR5cGVzIC0gZmlyc3QgcGFyYW1ldGVyIGluIG1ldGhvZCB3aW5zCisgICAgICAgIG0xID0gbmV3IE1lZGlhVHlwZSgibW9vIiwgImJvbyIpOworICAgICAgICBtMiA9IG5ldyBNZWRpYVR5cGUoImZvbyIsICJiYXIiKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTEsIG0yLCBtMSk7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0yLCBtMSwgbTIpOworCisgICAgICAgIC8qIGNvbmNyZXRlIHR5cGUgd2l0aCBwYXJhbWV0ZXJzICovCisgICAgICAgIG0xID0gbmV3IE1lZGlhVHlwZSgiZm9vIiwgImJhciIsIGFzTWFwKCJwMT12MTtwMj12MiIpKTsKKworICAgICAgICAvLyBjb25jcmV0ZSB0eXBlIHdpdGggcGFyYW1ldGVycyAjMSAtIHdpbGRjYXJkIHR5cGUgbG9vc2VzCisgICAgICAgIG0yID0gTWVkaWFUeXBlLldJTERDQVJEX1RZUEU7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0xLCBtMiwgbTEpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMiwgbTEsIG0xKTsKKworICAgICAgICAvLyBjb25jcmV0ZSB0eXBlIHdpdGggcGFyYW1ldGVycyAjMiAtIHdpbGRjYXJkIHN1YnR5cGUgbG9vc2VzCisgICAgICAgIG0yID0gbmV3IE1lZGlhVHlwZSgiZm9vIiwgIioiKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTEsIG0yLCBtMSk7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0yLCBtMSwgbTEpOworCisgICAgICAgIC8vIGNvbmNyZXRlIHR5cGUgd2l0aCBwYXJhbWV0ZXJzICMzIC0gY29uY3JldGUgcGFyYW1ldGVyLWxlc3MgdHlwZSBsb29zZXMKKyAgICAgICAgbTIgPSBuZXcgTWVkaWFUeXBlKCJmb28iLCAiYmF6Iik7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0xLCBtMiwgbTEpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMiwgbTEsIG0xKTsKKworICAgICAgICAvLyBjb25jcmV0ZSB0eXBlIHdpdGggcGFyYW1ldGVycyAjNCAtIHR5cGUgd2l0aCBsZXNzIHBhcmFtZXRlcnMgdHlwZSBsb29zZXMKKyAgICAgICAgbTIgPSBuZXcgTWVkaWFUeXBlKCJmb28iLCAiYmF6IiwgYXNNYXAoImExPWIxIikpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMSwgbTIsIG0xKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTIsIG0xLCBtMSk7CisKKyAgICAgICAgLy8gYm90aCBjb25jcmV0ZSB0eXBlcyB3aXRoIHBhcmFtZXRlcnMgIzUgLSBmaXJzdCBwYXJhbWV0ZXIgaW4gbWV0aG9kIHdpbnMKKyAgICAgICAgbTIgPSBuZXcgTWVkaWFUeXBlKCJmb28iLCAiYmF6IiwgYXNNYXAoImExPWIxO2EyPWIyIikpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMSwgbTIsIG0xKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTIsIG0xLCBtMik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfdGVzdE1vc3RTcGVjaWZpYyhNZWRpYVR5cGUgbTEsIE1lZGlhVHlwZSBtMiwgTWVkaWFUeXBlIHJlc3VsdCkgeworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIG1lZGlhIHR5cGUgc2VsZWN0ZWQgdG8gYmUgbW9zdCBzcGVjaWZpYy4iLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZXMubW9zdFNwZWNpZmljKG0xLCBtMiksIGlzKHJlc3VsdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBtYXAgZnJvbSBIVFRQIGhlYWRlciBwYXJhbWV0ZXIgc3RyaW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEhUVFAgaGVhZGVyIHBhcmFtZXRlcnMgc3RyaW5nLgorICAgICAqIEByZXR1cm4gSFRUUCBoZWFkZXIgcGFyYW1ldGVycyBtYXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFzTWFwKFN0cmluZyBwYXJhbWV0ZXJzKSB7CisgICAgICAgIEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyID0gSHR0cEhlYWRlclJlYWRlci5uZXdJbnN0YW5jZSgiOyIgKyBwYXJhbWV0ZXJzKTsKKworICAgICAgICBpZiAocmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkUGFyYW1ldGVycyhyZWFkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL091dGJvdW5kSmF4cnNSZXNwb25zZUJ1aWxkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRKYXhyc1Jlc3BvbnNlQnVpbGRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY4NjkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL091dGJvdW5kSmF4cnNSZXNwb25zZUJ1aWxkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRKYXhyc1Jlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLlRlc3RSdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogSmF4cnNSZXNwb25zZVZpZXdUZXN0IGNsYXNzLgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28gUGVyaWNhcy1HZWVydHNlbiAoc2FudGlhZ28ucGVyaWNhc2dlZXJ0c2VuIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRib3VuZEpheHJzUmVzcG9uc2VCdWlsZGVyVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGVzdCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlQnVpbGRlclRlc3QoKSB7CisgICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZS5zZXRJbnN0YW5jZShuZXcgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG1lZGlhIHR5cGUgaGVhZGVyIHNldHRpbmcsIHJldHJpZXZhbC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGUoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSBuZXcgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLkJ1aWxkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSwgTWVkaWFUeXBlLlRFWFRfSFRNTCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuTk9fQ09OVEVOVCwgci5nZXRTdGF0dXNJbmZvKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLCByLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc3N1ZTEyOTdGaXgoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IE91dGJvdW5kSmF4cnNSZXNwb25zZS5CdWlsZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCkpCisgICAgICAgICAgICAgICAgLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuT0spCisgICAgICAgICAgICAgICAgLmVudGl0eSgiMTIzNDU2Nzg5MCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIGludCBsZW4gPSByZXNwb25zZS5nZXRMZW5ndGgoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBsZW4pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9PdXRib3VuZEpheHJzUmVzcG9uc2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRKYXhyc1Jlc3BvbnNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzI0MWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRKYXhyc1Jlc3BvbnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRKYXhyc1Jlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLlRlc3RSdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBPdXRib3VuZEpheHJzUmVzcG9uc2UgdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0SW5wdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlJbnB1dFN0cmVhbSB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzUmVhZDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VkOworCisgICAgICAgIHByaXZhdGUgVGVzdElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgc3VwZXIoInRlc3QiLmdldEJ5dGVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVhZCA9IHN1cGVyLnJlYWQoKTsKKyAgICAgICAgICAgIGlzUmVhZCA9IHJlYWQgPT0gLTE7CisgICAgICAgICAgICByZXR1cm4gcmVhZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVhZCA9IHN1cGVyLnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaXNSZWFkID0gcmVhZCA9PSAtMTsKKyAgICAgICAgICAgIHJldHVybiByZWFkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIGludCByZWFkID0gc3VwZXIucmVhZChiKTsKKyAgICAgICAgICAgIGlzUmVhZCA9IHJlYWQgPT0gLTE7CisgICAgICAgICAgICByZXR1cm4gcmVhZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlciBURVNUX1BST1ZJREVSCisgICAgICAgICAgICA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oaW50IGNvbnRlbnRMZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHJiOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRlc3QgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIE91dGJvdW5kSmF4cnNSZXNwb25zZVRlc3QoKSB7CisgICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZS5zZXRJbnN0YW5jZShuZXcgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSgpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHJiID0gbmV3IE91dGJvdW5kSmF4cnNSZXNwb25zZS5CdWlsZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCkpLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuT0spOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCBvZiBlbXB0eSBlbnRpdHkgYnVmZmVyaW5nLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlckVtcHR5RW50aXR5KCkgeworICAgICAgICBmaW5hbCBPdXRib3VuZEpheHJzUmVzcG9uc2UgciA9IE91dGJvdW5kSmF4cnNSZXNwb25zZS5mcm9tKHJiLmJ1aWxkKCkpOworICAgICAgICByLmdldENvbnRleHQoKS5zZXRTdHJlYW1Qcm92aWRlcihURVNUX1BST1ZJREVSKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiQnVmZmVyIGVudGl0eSBzaG91bGQgcmV0dXJuICdmYWxzZScgaWYgbm8gZW50aXR5LiIsIHIuYnVmZmVyRW50aXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2Ygbm9uLXN0cmVhbSBlbnRpdHkgYnVmZmVyaW5nLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlck5vblN0cmVhbUVudGl0eSgpIHsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIHIgPSBPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyYi5lbnRpdHkobmV3IE9iamVjdCgpKS5idWlsZCgpKTsKKyAgICAgICAgci5nZXRDb250ZXh0KCkuc2V0U3RyZWFtUHJvdmlkZXIoVEVTVF9QUk9WSURFUik7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkJ1ZmZlciBlbnRpdHkgc2hvdWxkIHJldHVybiAnZmFsc2UnIGZvciBub24tc3RyZWFtIGVudGl0eS4iLCByLmJ1ZmZlckVudGl0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIHN0cmVhbSBlbnRpdHkgYnVmZmVyaW5nLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlclN0cmVhbUVudGl0eSgpIHsKKyAgICAgICAgVGVzdElucHV0U3RyZWFtIHRpcyA9IG5ldyBUZXN0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIHIgPSBPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyYi5lbnRpdHkodGlzKS5idWlsZCgpKTsKKyAgICAgICAgci5nZXRDb250ZXh0KCkuc2V0U3RyZWFtUHJvdmlkZXIoVEVTVF9QUk9WSURFUik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQnVmZmVyIGVudGl0eSBzaG91bGQgcmV0dXJuICd0cnVlJyBmb3Igc3RyZWFtIGVudGl0eS4iLCByLmJ1ZmZlckVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2Vjb25kIGNhbGwgdG8gYnVmZmVyIGVudGl0eSBzaG91bGQgcmV0dXJuICd0cnVlJyBmb3Igc3RyZWFtIGVudGl0eS4iLCByLmJ1ZmZlckVudGl0eSgpKTsgLy8gc2Vjb25kIGNhbGwKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQnVmZmVyZWQgc3RyZWFtIGhhcyBub3QgYmVlbiBmdWxseSByZWFkLiIsIHRpcy5pc1JlYWQpOworICAgICAgICBhc3NlcnRUcnVlKCJCdWZmZXJlZCBzdHJlYW0gaGFzIG5vdCBiZWVuIGNsb3NlZCBhZnRlciBidWZmZXJpbmcuIiwgdGlzLmlzQ2xvc2VkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGNsb3NpbmcgcmVzcG9uc2Ugd2l0aCBlbXB0eSBlbnRpdHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VFbXB0eUVudGl0eSgpIHsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIHIgPSBPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyYi5idWlsZCgpKTsKKyAgICAgICAgci5nZXRDb250ZXh0KCkuc2V0U3RyZWFtUHJvdmlkZXIoVEVTVF9QUk9WSURFUik7CisKKyAgICAgICAgci5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGJ1ZmZlcmluZyBlbnRpdHkgb24gY2xvc2VkIHJlc3BvbnNlLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIG9rCisgICAgICAgIH0KKyAgICAgICAgci5jbG9zZSgpOyAvLyBzZWNvbmQgY2FsbCBzaG91bGQgcGFzcworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgY2xvc2luZyByZXNwb25zZSB3aXRoIG5vbi1zdHJlYW0gZW50aXR5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlTm9uU3RyZWFtRW50aXR5KCkgeworICAgICAgICBmaW5hbCBPdXRib3VuZEpheHJzUmVzcG9uc2UgciA9IE91dGJvdW5kSmF4cnNSZXNwb25zZS5mcm9tKHJiLmVudGl0eShuZXcgT2JqZWN0KCkpLmJ1aWxkKCkpOworICAgICAgICByLmdldENvbnRleHQoKS5zZXRTdHJlYW1Qcm92aWRlcihURVNUX1BST1ZJREVSKTsKKworICAgICAgICByLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLmJ1ZmZlckVudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gYnVmZmVyaW5nIGVudGl0eSBvbiBjbG9zZWQgcmVzcG9uc2UuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorICAgICAgICByLmNsb3NlKCk7IC8vIHNlY29uZCBjYWxsIHNob3VsZCBwYXNzCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiBjbG9zaW5nIHJlc3BvbnNlIHdpdGggc3RyZWFtIGVudGl0eS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVN0cmVhbUVudGl0eSgpIHsKKyAgICAgICAgVGVzdElucHV0U3RyZWFtIHRpcyA9IG5ldyBUZXN0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIHIgPSBPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyYi5lbnRpdHkodGlzKS5idWlsZCgpKTsKKyAgICAgICAgci5nZXRDb250ZXh0KCkuc2V0U3RyZWFtUHJvdmlkZXIoVEVTVF9QUk9WSURFUik7CisKKyAgICAgICAgci5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGJ1ZmZlcmluZyBlbnRpdHkgb24gY2xvc2VkIHJlc3BvbnNlLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIG9rCisgICAgICAgIH0KKyAgICAgICAgci5jbG9zZSgpOyAvLyBzZWNvbmQgY2FsbCBzaG91bGQgcGFzcworCisgICAgICAgIGFzc2VydEZhbHNlKCJVbmJ1ZmZlcmVkIGNsb3NlZCByZXNwb25zZSBzdHJlYW0gZW50aXR5IHNob3VsZCBub3QgYmUgcmVhZC4iLCB0aXMuaXNSZWFkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2xvc2VkIHJlc3BvbnNlIHN0cmVhbSBlbnRpdHkgc2hvdWxkIGhhdmUgYmVlbiBjbG9zZWQuIiwgdGlzLmlzQ2xvc2VkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGNsb3NpbmcgcmVzcG9uc2Ugd2l0aCBlbXB0eSBlbnRpdHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VFbXB0eUVudGl0eU5vU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgIGZpbmFsIE91dGJvdW5kSmF4cnNSZXNwb25zZSByID0gT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLmZyb20ocmIuYnVpbGQoKSk7CisgICAgICAgIHIuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIuYnVmZmVyRW50aXR5KCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiBidWZmZXJpbmcgZW50aXR5IG9uIGNsb3NlZCByZXNwb25zZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBvaworICAgICAgICB9CisgICAgICAgIHIuY2xvc2UoKTsgLy8gc2Vjb25kIGNhbGwgc2hvdWxkIHBhc3MKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGNsb3NpbmcgcmVzcG9uc2Ugd2l0aCBub24tc3RyZWFtIGVudGl0eS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZU5vblN0cmVhbUVudGl0eU5vU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgIGZpbmFsIE91dGJvdW5kSmF4cnNSZXNwb25zZSByID0gT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLmZyb20ocmIuZW50aXR5KG5ldyBPYmplY3QoKSkuYnVpbGQoKSk7CisgICAgICAgIHIuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIuYnVmZmVyRW50aXR5KCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiBidWZmZXJpbmcgZW50aXR5IG9uIGNsb3NlZCByZXNwb25zZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBvaworICAgICAgICB9CisgICAgICAgIHIuY2xvc2UoKTsgLy8gc2Vjb25kIGNhbGwgc2hvdWxkIHBhc3MKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGNsb3NpbmcgcmVzcG9uc2Ugd2l0aCBzdHJlYW0gZW50aXR5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlU3RyZWFtRW50aXR5Tm9TdHJlYW1Qcm92aWRlcigpIHsKKyAgICAgICAgVGVzdElucHV0U3RyZWFtIHRpcyA9IG5ldyBUZXN0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIHIgPSBPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyYi5lbnRpdHkodGlzKS5idWlsZCgpKTsKKyAgICAgICAgci5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGJ1ZmZlcmluZyBlbnRpdHkgb24gY2xvc2VkIHJlc3BvbnNlLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIG9rCisgICAgICAgIH0KKyAgICAgICAgci5jbG9zZSgpOyAvLyBzZWNvbmQgY2FsbCBzaG91bGQgcGFzcworCisgICAgICAgIGFzc2VydEZhbHNlKCJVbmJ1ZmZlcmVkIGNsb3NlZCByZXNwb25zZSBzdHJlYW0gZW50aXR5IHNob3VsZCBub3QgYmUgcmVhZC4iLCB0aXMuaXNSZWFkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2xvc2VkIHJlc3BvbnNlIHN0cmVhbSBlbnRpdHkgc2hvdWxkIGhhdmUgYmVlbiBjbG9zZWQuIiwgdGlzLmlzQ2xvc2VkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9PdXRib3VuZE1lc3NhZ2VDb250ZXh0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL091dGJvdW5kTWVzc2FnZUNvbnRleHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMmEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9PdXRib3VuZE1lc3NhZ2VDb250ZXh0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRW50aXR5VGFnOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkNvb2tpZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLlRlc3RSdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiB7QGxpbmsgT3V0Ym91bmRNZXNzYWdlQ29udGV4dH0gdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgT3V0Ym91bmRNZXNzYWdlQ29udGV4dFRlc3QgeworCisgICAgcHVibGljIE91dGJvdW5kTWVzc2FnZUNvbnRleHRUZXN0KCkgeworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobmV3IFRlc3RSdW50aW1lRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0YWJsZU1lZGlhVHlwZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQUNDRVBULCAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3BsYWluIik7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi9qc29uIik7CisKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGFjY2VwdGFibGVNZWRpYVR5cGVzID0gci5nZXRBY2NlcHRhYmxlTWVkaWFUeXBlcygpOworCisgICAgICAgIGFzc2VydFRoYXQoYWNjZXB0YWJsZU1lZGlhVHlwZXMuc2l6ZSgpLCBlcXVhbFRvKDMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhY2NlcHRhYmxlTWVkaWFUeXBlcywKKyAgICAgICAgICAgICAgICBjb250YWlucyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRhYmxlTGFuZ3VhZ2VzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgciA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5BQ0NFUFRfTEFOR1VBR0UsICJlbi1nYjtxPTAuOCwgZW47cT0wLjciKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgImRlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmdldEFjY2VwdGFibGVMYW5ndWFnZXMoKS5zaXplKCksIDMpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0QWNjZXB0YWJsZUxhbmd1YWdlcygpLmNvbnRhaW5zKExvY2FsZS5VSykpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0QWNjZXB0YWJsZUxhbmd1YWdlcygpLmNvbnRhaW5zKExvY2FsZS5FTkdMSVNIKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBY2NlcHRhYmxlTGFuZ3VhZ2VzKCkuY29udGFpbnMoTG9jYWxlLkdFUk1BTikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RDb29raWVzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgciA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5DT09LSUUsICJvcmVvPWNob2NvbGF0ZSIpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQ09PS0lFLCAibmlsbGE9dmFuaWxsYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRSZXF1ZXN0Q29va2llcygpLnNpemUoKSwgMik7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXF1ZXN0Q29va2llcygpLmNvbnRhaW5zS2V5KCJvcmVvIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0UmVxdWVzdENvb2tpZXMoKS5jb250YWluc0tleSgibmlsbGEiKSk7CisgICAgICAgIENvb2tpZVByb3ZpZGVyIGNwID0gbmV3IENvb2tpZVByb3ZpZGVyKCk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXF1ZXN0Q29va2llcygpLmNvbnRhaW5zVmFsdWUoY3AuZnJvbVN0cmluZygib3Jlbz1jaG9jb2xhdGUiKSkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0UmVxdWVzdENvb2tpZXMoKS5jb250YWluc1ZhbHVlKGNwLmZyb21TdHJpbmcoIm5pbGxhPXZhbmlsbGEiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGUoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgciA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5EQVRFLCAiVHVlLCAyOSBKYW4gMjAwMiAyMjoxNDowMiAtMDUwMCIpOworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRSwgZGQgTU1NIHl5eXkgSEg6bW06c3MgWiIsIExvY2FsZS5FTkdMSVNIKTsKKyAgICAgICAgRGF0ZSBkYXRlID0gZi5wYXJzZSgiVHVlLCAyOSBKYW4gMjAwMiAyMjoxNDowMiAtMDUwMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXREYXRlKCksIGRhdGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlcigpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVCwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC9wbGFpbiIpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQUNDRVBULCAiYXBwbGljYXRpb24vanNvbiIpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkZPTyIsICIiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BQ0NFUFQpLmNvbnRhaW5zKCJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUNDRVBUKS5jb250YWlucygidGV4dC9wbGFpbiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BQ0NFUFQpLmNvbnRhaW5zKCJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRIZWFkZXJTdHJpbmcoIkZPTyIpLmxlbmd0aCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyLmdldEhlYWRlclN0cmluZygiQkFSIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlck1hcCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVCwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC9wbGFpbiIpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQUNDRVBULCAiYXBwbGljYXRpb24vanNvbiIpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkFsbG93IiwgIkdFVCwgUFVUIik7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZCgiQWxsb3ciLCAiUE9TVCIpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJzLkFDQ0VQVCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KCJBbGxvdyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlcnMoKS5nZXQoSHR0cEhlYWRlcnMuQUNDRVBUKS5jb250YWlucygiYXBwbGljYXRpb24vanNvbiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlcnMoKS5nZXQoIkFsbG93IikuY29udGFpbnMoIlBPU1QiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dlZE1ldGhvZHMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKCJBbGxvdyIsICJHRVQsIFBVVCIpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkFsbG93IiwgIlBPU1QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHIuZ2V0QWxsb3dlZE1ldGhvZHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0QWxsb3dlZE1ldGhvZHMoKS5jb250YWlucygiR0VUIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0QWxsb3dlZE1ldGhvZHMoKS5jb250YWlucygiUFVUIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0QWxsb3dlZE1ldGhvZHMoKS5jb250YWlucygiUE9TVCIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoci5nZXRBbGxvd2VkTWV0aG9kcygpLmNvbnRhaW5zKCJERUxFVEUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VDb29raWVzKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgciA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5TRVRfQ09PS0lFLCAib3Jlbz1jaG9jb2xhdGUiKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLlNFVF9DT09LSUUsICJuaWxsYT12YW5pbGxhIik7CisgICAgICAgIGFzc2VydEVxdWFscygyLCByLmdldFJlc3BvbnNlQ29va2llcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXNwb25zZUNvb2tpZXMoKS5jb250YWluc0tleSgib3JlbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldFJlc3BvbnNlQ29va2llcygpLmNvbnRhaW5zS2V5KCJuaWxsYSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlUYWcoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkVUQUcsICJcInRhZ1wiIik7CisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlUYWcudmFsdWVPZigiXCJ0YWdcIiIpLCByLmdldEVudGl0eVRhZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXN0TW9kaWZpZWQoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgciA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5MQVNUX01PRElGSUVELCAiVHVlLCAyOSBKYW4gMjAwMiAyMjoxNDowMiAtMDUwMCIpOworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRSwgZGQgTU1NIHl5eXkgSEg6bW06c3MgWiIsIExvY2FsZS5FTkdMSVNIKTsKKyAgICAgICAgRGF0ZSBkYXRlID0gZi5wYXJzZSgiVHVlLCAyOSBKYW4gMjAwMiAyMjoxNDowMiAtMDUwMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZSwgci5nZXRMYXN0TW9kaWZpZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb24oKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkxPQ0FUSU9OLCAiaHR0cDovL2V4YW1wbGUub3JnL2FwcCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcCIpLCByLmdldExvY2F0aW9uKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmtzKCkgeworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICBMaW5rIGxpbmsxID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIikucGFyYW0oInByb2R1Y2VzIiwgImFwcGxpY2F0aW9uL2pzb24iKS5wYXJhbSgibWV0aG9kIiwgIkdFVCIpLnJlbCgic2VsZiIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbGluazIgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazIiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24veG1sIikucGFyYW0oIm1ldGhvZCIsICJQVVQiKS5yZWwoInNlbGYiKS5idWlsZCgpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkxpbmsiLCBsaW5rMS50b1N0cmluZygpKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKCJMaW5rIiwgbGluazIudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCByLmdldExpbmtzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldExpbmtzKCkuY29udGFpbnMobGluazEpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldExpbmtzKCkuY29udGFpbnMobGluazIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMaW5rKCkgeworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICBMaW5rIGxpbmsxID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIikucGFyYW0oInByb2R1Y2VzIiwgImFwcGxpY2F0aW9uL2pzb24iKS5wYXJhbSgibWV0aG9kIiwgIkdFVCIpLnJlbCgic2VsZiIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbGluazIgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazIiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24veG1sIikucGFyYW0oIm1ldGhvZCIsICJQVVQiKS5yZWwoInVwZGF0ZSIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbGluazMgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazIiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24veG1sIikucGFyYW0oIm1ldGhvZCIsICJQT1NUIikucmVsKCJ1cGRhdGUiKS5idWlsZCgpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkxpbmsiLCBsaW5rMS50b1N0cmluZygpKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKCJMaW5rIiwgbGluazIudG9TdHJpbmcoKSk7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZCgiTGluayIsIGxpbmszLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGluaygic2VsZiIpLmVxdWFscyhsaW5rMSkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGluaygidXBkYXRlIikuZXF1YWxzKGxpbmsyKSB8fCByLmdldExpbmsoInVwZGF0ZSIpLmVxdWFscyhsaW5rMykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExlbmd0aCgpIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKCJDb250ZW50LUxlbmd0aCIsIDUwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwLCByLmdldExlbmd0aExvbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoX3Rvb0xvbmdGb3JJbnQoKSB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgciA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIGxvbmcgbGVuZ3RoID0gSW50ZWdlci5NQVhfVkFMVUUgKyA1TDsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKCJDb250ZW50LUxlbmd0aCIsIGxlbmd0aCk7CisKKworICAgICAgICBhc3NlcnRFcXVhbHMobGVuZ3RoLCByLmdldExlbmd0aExvbmcoKSk7CisKKyAgICAgICAgLy8gdmFsdWUgaXMgbm90IGEgdmFsaWQgaW50ZWdlciAtPiBQcm9jZXNzaW5nRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIuZ2V0TGVuZ3RoKCk7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmFpbCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9RdWFsaXR5U291cmNlTWVkaWFUeXBlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL1F1YWxpdHlTb3VyY2VNZWRpYVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5YmM2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9RdWFsaXR5U291cmNlTWVkaWFUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5RdWFsaXR5U291cmNlTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBRdWFsaXR5IHNvdXJjZSBtZWRpYSB0eXBlIHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBRdWFsaXR5U291cmNlTWVkaWFUeXBlVGVzdCB7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIC8vIGV4cGVjdGVkIHJlc3VsdCwgbWVkaWEgdHlwZSwgcXVhbGl0eSBzb3VyY2UgbWVkaWEgdHlwZQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdEJlZHMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICAgICAgICAgIHtCb29sZWFuLlRSVUUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG5ldyBRdWFsaXR5U291cmNlTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIil9LAorICAgICAgICAgICAgICAgIHtCb29sZWFuLlRSVUUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG5ldyBRdWFsaXR5U291cmNlTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIiwgMTAwMCwgbnVsbCl9LAorICAgICAgICAgICAgICAgIHtCb29sZWFuLkZBTFNFLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCBuZXcgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAianNvbiIsIDUwMCwgbnVsbCl9LAorICAgICAgICAgICAgICAgIHtCb29sZWFuLkZBTFNFLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCBuZXcgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAieG1sIil9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBleHBlY3RFcXVhbGl0eTsKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBRdWFsaXR5U291cmNlTWVkaWFUeXBlIHFzTWVkaWFUeXBlOworCisgICAgcHVibGljIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGVUZXN0KGJvb2xlYW4gZXhwZWN0RXF1YWxpdHksIE1lZGlhVHlwZSBtZWRpYVR5cGUsIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUgcXNNZWRpYVR5cGUpIHsKKyAgICAgICAgdGhpcy5leHBlY3RFcXVhbGl0eSA9IGV4cGVjdEVxdWFsaXR5OworICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsKKyAgICAgICAgdGhpcy5xc01lZGlhVHlwZSA9IHFzTWVkaWFUeXBlOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoZXhwZWN0RXF1YWxpdHkpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlR5cGVzIG5vdCBlcXVhbC4iLCBtZWRpYVR5cGUsIHFzTWVkaWFUeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlR5cGVzIG5vdCBlcXVhbC4iLCBxc01lZGlhVHlwZSwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkhhc2ggY29kZXMgbm90IGVxdWFsIGZvciAlcyBhbmQgJXMuIiwgbWVkaWFUeXBlLnRvU3RyaW5nKCksIHFzTWVkaWFUeXBlLnRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuaGFzaENvZGUoKSwgcXNNZWRpYVR5cGUuaGFzaENvZGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoU3RyaW5nLmZvcm1hdCgiRmFsc2UgZXF1YWxpdHkgb2YgJXMgYW5kICVzIiwgbWVkaWFUeXBlLnRvU3RyaW5nKCksIHFzTWVkaWFUeXBlLnRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICBxc01lZGlhVHlwZS5lcXVhbHMobWVkaWFUeXBlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21vZGVsL2ludGVybmFsL0NvbW1vbkNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbW9kZWwvaW50ZXJuYWwvQ29tbW9uQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NmYyOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21vZGVsL2ludGVybmFsL0NvbW1vbkNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDEwMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5tb2RlbC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5IazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuQ29udHJhY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21tb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLk1hbmFnZWRPYmplY3RzRmluYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZENvbXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBjYXNlcyBmb3Ige0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbn0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDb21tb25Db25maWdUZXN0IHsKKworICAgIHByaXZhdGUgQ29tbW9uQ29uZmlnIGNvbmZpZzsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcgPSBuZXcgQ29tbW9uQ29uZmlnKG51bGwsIENvbXBvbmVudEJhZy5JTkNMVURFX0FMTCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJmb28iLCAiYmFyIik7CisgICAgICAgICAgICBmYWlsKCJSZXR1cm5lZCBwcm9wZXJ0aWVzIGNvbGxlY3Rpb24gc2hvdWxkIGJlIGltbXV0YWJsZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE9LLgorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcgPSBjb25maWcucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKSk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dCgiaGVsbG8iLCAid29ybGQiKTsKKyAgICAgICAgY29uZmlnID0gY29uZmlnLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid29ybGQiLCBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJoZWxsbyIpKTsKKworICAgICAgICBwcm9wZXJ0aWVzLnB1dCgib25lIiwgInR3byIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJvbmUiKSk7CisKKyAgICAgICAgY29uZmlnID0gY29uZmlnLnNldFByb3BlcnRpZXMobmV3IEhhc2hNYXA8PigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoImZvbyIpKTsKKworICAgICAgICBjb25maWcucHJvcGVydHkoImhlbGxvIiwgIndvcmxkIik7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eSgiZm9vIiwgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbmNvbmZpZ3VyYWJsZUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGxleEVtcHR5UHJvdmlkZXIgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciwgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgRXhjZXB0aW9uTWFwcGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKGZpbmFsIFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlIGV4dGVuZHMgQ29tcGxleEVtcHR5UHJvdmlkZXIgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVdpdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIGZpbmFsIEVtcHR5RmVhdHVyZSBlbXB0eUZlYXR1cmUgPSBuZXcgRW1wdHlGZWF0dXJlKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihlbXB0eUZlYXR1cmUpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MsIEV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ29tbW9uQ29uZmlnIG90aGVyID0gbmV3IENvbW1vbkNvbmZpZyhudWxsLCBDb21wb25lbnRCYWcuSU5DTFVERV9BTEwpOworICAgICAgICBvdGhlci5wcm9wZXJ0eSgiZm9vIiwgImJheiIpOworICAgICAgICBvdGhlci5yZWdpc3RlcihVbmNvbmZpZ3VyYWJsZUZlYXR1cmUuY2xhc3MpOworICAgICAgICBvdGhlci5yZWdpc3RlcihDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcywgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiYmF6Iiwgb3RoZXIuZ2V0UHJvcGVydHkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG90aGVyLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgb3RoZXIuZ2V0Q2xhc3NlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBvdGhlci5nZXRJbnN0YW5jZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgb3RoZXIuZ2V0Q29udHJhY3RzKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG90aGVyLmdldENvbnRyYWN0cyhDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcykuY29udGFpbnNLZXkoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvdGhlci5nZXRDb250cmFjdHMoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpLmNvbnRhaW5zS2V5KENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKworICAgICAgICBvdGhlci5sb2FkRnJvbShjb25maWcpOworCisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgb3RoZXIuZ2V0UHJvcGVydHkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG90aGVyLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb3RoZXIuZ2V0Q2xhc3NlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBvdGhlci5nZXRJbnN0YW5jZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb3RoZXIuZ2V0Q29udHJhY3RzKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKS5zaXplKCkpOworICAgICAgICBhc3NlcnRTYW1lKEV4Y2VwdGlvbk1hcHBlci5jbGFzcywgb3RoZXIuZ2V0Q29udHJhY3RzKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKS5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmVhdHVyZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRW1wdHlGZWF0dXJlIGVtcHR5RmVhdHVyZSA9IG5ldyBFbXB0eUZlYXR1cmUoKTsKKyAgICAgICAgZmluYWwgVW5jb25maWd1cmFibGVGZWF0dXJlIHVuY29uZmlndXJhYmxlRmVhdHVyZSA9IG5ldyBVbmNvbmZpZ3VyYWJsZUZlYXR1cmUoKTsKKyAgICAgICAgZmluYWwgQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlIHByb3ZpZGVyRmVhdHVyZSA9IG5ldyBDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUoKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIoZW1wdHlGZWF0dXJlKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHVuY29uZmlndXJhYmxlRmVhdHVyZSk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckZlYXR1cmUsIFJlYWRlckludGVyY2VwdG9yLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChlbXB0eUZlYXR1cmUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQodW5jb25maWd1cmFibGVGZWF0dXJlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKHByb3ZpZGVyRmVhdHVyZSkpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoZW1wdHlGZWF0dXJlKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQodW5jb25maWd1cmFibGVGZWF0dXJlKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQocHJvdmlkZXJGZWF0dXJlKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTE2MzguCisgICAgcHVibGljIHZvaWQgdGVzdEdldE5vbkV4aXN0ZW50UHJvdmlkZXJDb250cmFjdHNBU0VtcHR5TWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDb250cmFjdHMoQ29tbW9uQ29uZmlnVGVzdC5jbGFzcykuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0Q29sbGVjdGlvbnNDb21tb24oIkdldFByb3ZpZGVyQ2xhc3NlcyIsIGNvbmZpZy5nZXRDbGFzc2VzKCksIEVtcHR5RmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbXBsZXhFbXB0eVByb3ZpZGVyRmVhdHVyZS5jbGFzcywKKyAgICAgICAgICAgICAgICBXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29uZmlnLmdldENsYXNzZXMoKS5zaXplKCkpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihFbXB0eUZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gcHJvdmlkZXJDbGFzc2VzID0gY29uZmlnLmdldENsYXNzZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHByb3ZpZGVyQ2xhc3Nlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVyQ2xhc3Nlcy5jb250YWlucyhDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnN0YW5jZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RDb2xsZWN0aW9uc0NvbW1vbigiR2V0UHJvdmlkZXJJbnN0YW5jZXMiLCBjb25maWcuZ2V0SW5zdGFuY2VzKCksIG5ldyBFbXB0eUZlYXR1cmUoKSk7CisKKyAgICAgICAgZmluYWwgQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlIHByb3ZpZGVyRmVhdHVyZTEgPSBuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckZlYXR1cmUxLCBXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb25maWcuZ2V0SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0SW5zdGFuY2VzKCkuY29udGFpbnMocHJvdmlkZXJGZWF0dXJlMSkpOworCisgICAgICAgIGZpbmFsIEVtcHR5RmVhdHVyZSBlbXB0eUZlYXR1cmUgPSBuZXcgRW1wdHlGZWF0dXJlKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihlbXB0eUZlYXR1cmUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29uZmlnLmdldEluc3RhbmNlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldEluc3RhbmNlcygpLmNvbnRhaW5zKGVtcHR5RmVhdHVyZSkpOworCisgICAgICAgIGZpbmFsIENvbXBsZXhFbXB0eVByb3ZpZGVyRmVhdHVyZSBwcm92aWRlckZlYXR1cmUyID0gbmV3IENvbXBsZXhFbXB0eVByb3ZpZGVyRmVhdHVyZSgpOworICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXJGZWF0dXJlMiwgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29uZmlnLmdldEluc3RhbmNlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5jb250YWlucyhwcm92aWRlckZlYXR1cmUyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoY2xhenopOworICAgICAgICAgICAgZmFpbCgiQ2Fubm90IHJlZ2lzdGVyIG51bGwuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSy4KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBjb250cmFjdFByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29tcG9uZW50QmFnKCkuZ2V0TW9kZWwoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IGNvbnRyYWN0UHJvdmlkZXIuZ2V0Q29udHJhY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNvbnRyYWN0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVySW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbm5vdCByZWdpc3RlciBudWxsLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gT0suCisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb21wbGV4RW1wdHlQcm92aWRlcltdIGNlcHMgPSBuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXJbMl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBjZXBzW2ldID0gbmV3IENvbXBsZXhFbXB0eVByb3ZpZGVyKCk7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoY2Vwc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIGNvbnRyYWN0UHJvdmlkZXIgPQorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRNb2RlbChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzID0gY29udHJhY3RQcm92aWRlci5nZXRDb250cmFjdHMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29udHJhY3RzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoRXhjZXB0aW9uTWFwcGVyLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChjZXBzWzBdKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoY2Vwc1sxXSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyQ2xhc3NJbnN0YW5jZUNsYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbXBsZXhFbXB0eVByb3ZpZGVyIGNvbXBsZXhFbXB0eVByb3ZpZGVyID0gbmV3IENvbXBsZXhFbXB0eVByb3ZpZGVyKCk7CisKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGNvbXBsZXhFbXB0eVByb3ZpZGVyKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDbGFzc2VzKCkuY29udGFpbnMoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldEluc3RhbmNlcygpLmNvbnRhaW5zKGNvbXBsZXhFbXB0eVByb3ZpZGVyKSk7CisKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBjb250cmFjdFByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29tcG9uZW50QmFnKCkuZ2V0TW9kZWwoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IGNvbnRyYWN0UHJvdmlkZXIuZ2V0Q29udHJhY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNvbnRyYWN0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyQ2xhc3NCaW5naW5nUHJpb3JpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGNsYXp6LCBQcmlvcml0aWVzLlVTRVIpOworICAgICAgICAgICAgZmFpbCgiQ2Fubm90IHJlZ2lzdGVyIG51bGwuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSy4KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgaW50IHByaW9yaXR5IDogbmV3IGludFtde1ByaW9yaXRpZXMuVVNFUiwgUHJpb3JpdGllcy5BVVRIRU5USUNBVElPTn0pIHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcywgcHJpb3JpdHkpOworCisgICAgICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIGNvbnRyYWN0UHJvdmlkZXIgPQorICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29tcG9uZW50QmFnKCkuZ2V0TW9kZWwoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjb250cmFjdHMgPSBjb250cmFjdFByb3ZpZGVyLmdldENvbnRyYWN0cygpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29udHJhY3RzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoRXhjZXB0aW9uTWFwcGVyLmNsYXNzKSk7CisKKyAgICAgICAgICAgIC8vIEFsbCBwcmlvcml0aWVzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcmlvcml0aWVzLlVTRVIsIGNvbnRyYWN0UHJvdmlkZXIuZ2V0UHJpb3JpdHkoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcmlvcml0aWVzLlVTRVIsIGNvbnRyYWN0UHJvdmlkZXIuZ2V0UHJpb3JpdHkoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByaW9yaXRpZXMuVVNFUiwgY29udHJhY3RQcm92aWRlci5nZXRQcmlvcml0eShFeGNlcHRpb25NYXBwZXIuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVySW5zdGFuY2VCaW5naW5nUHJpb3JpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihudWxsLCBQcmlvcml0aWVzLlVTRVIpOworICAgICAgICAgICAgZmFpbCgiQ2Fubm90IHJlZ2lzdGVyIG51bGwuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSy4KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENsYXNzPENvbXBsZXhFbXB0eVByb3ZpZGVyPiBwcm92aWRlckNsYXNzID0gQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3M7CisKKyAgICAgICAgZm9yIChmaW5hbCBpbnQgcHJpb3JpdHkgOiBuZXcgaW50W117UHJpb3JpdGllcy5VU0VSLCBQcmlvcml0aWVzLkFVVEhFTlRJQ0FUSU9OfSkgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyQ2xhc3MsIHByaW9yaXR5KTsKKworICAgICAgICAgICAgZmluYWwgQ29tbW9uQ29uZmlnIGNvbW1vbkNvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgICAgIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3RQcm92aWRlciA9CisgICAgICAgICAgICAgICAgICAgIGNvbW1vbkNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRNb2RlbChwcm92aWRlckNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzID0gY29udHJhY3RQcm92aWRlci5nZXRDb250cmFjdHMoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNvbnRyYWN0cy5zaXplKCkpOyAvLyBGZWF0dXJlIGlzIG5vdCB0aGVyZS4KKyAgICAgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhFeGNlcHRpb25NYXBwZXIuY2xhc3MpKTsKKworICAgICAgICAgICAgLy8gQWxsIHByaW9yaXRpZXMgYXJlIHRoZSBzYW1lLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByaW9yaXRpZXMuVVNFUiwgY29udHJhY3RQcm92aWRlci5nZXRQcmlvcml0eShSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByaW9yaXRpZXMuVVNFUiwgY29udHJhY3RQcm92aWRlci5nZXRQcmlvcml0eShDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUHJpb3JpdGllcy5VU0VSLCBjb250cmFjdFByb3ZpZGVyLmdldFByaW9yaXR5KEV4Y2VwdGlvbk1hcHBlci5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJDbGFzc0luc3RhbmNlQmluZGluZ1ByaW9yaXR5Q2xhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29tcGxleEVtcHR5UHJvdmlkZXIgY29tcGxleEVtcHR5UHJvdmlkZXIgPSBuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXIoKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MsIFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT04pOworICAgICAgICBjb25maWcucmVnaXN0ZXIoY29tcGxleEVtcHR5UHJvdmlkZXIsIFByaW9yaXRpZXMuVVNFUik7CisKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDbGFzc2VzKCkuY29udGFpbnMoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldEluc3RhbmNlcygpLmNvbnRhaW5zKGNvbXBsZXhFbXB0eVByb3ZpZGVyKSk7CisKKyAgICAgICAgZmluYWwgQ29tcG9uZW50QmFnIGNvbXBvbmVudEJhZyA9IGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKTsKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBjb250cmFjdFByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICBjb21wb25lbnRCYWcuZ2V0TW9kZWwoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IGNvbnRyYWN0UHJvdmlkZXIuZ2V0Q29udHJhY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNvbnRyYWN0cy5zaXplKCkpOyAvLyBGZWF0dXJlIGlzIG5vdCB0aGVyZS4KKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhFeGNlcHRpb25NYXBwZXIuY2xhc3MpKTsKKworICAgICAgICAvLyBBbGwgcHJpb3JpdGllcyBhcmUgdGhlIHNhbWUuCisgICAgICAgIGFzc2VydEVxdWFscyhQcmlvcml0aWVzLkFVVEhFTlRJQ0FUSU9OLCBjb250cmFjdFByb3ZpZGVyLmdldFByaW9yaXR5KFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQcmlvcml0aWVzLkFVVEhFTlRJQ0FUSU9OLCBjb250cmFjdFByb3ZpZGVyLmdldFByaW9yaXR5KENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT04sIGNvbnRyYWN0UHJvdmlkZXIuZ2V0UHJpb3JpdHkoRXhjZXB0aW9uTWFwcGVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJDbGFzc0NvbnRyYWN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoY2xhenosIFJlYWRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbm5vdCByZWdpc3RlciBudWxsLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gT0suCisgICAgICAgIH0KKworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MsIFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBjb250cmFjdFByb3ZpZGVyID0gY29uZmlnLmdldENvbXBvbmVudEJhZygpLmdldE1vZGVsKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjb250cmFjdHMgPSBjb250cmFjdFByb3ZpZGVyLmdldENvbnRyYWN0cygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29udHJhY3RzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MgKyAiIGlzIG5vdCByZWdpc3RlcmVkLiIsIGNvbnRyYWN0cy5jb250YWlucyhSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MgKyAiIGlzIG5vdCByZWdpc3RlcmVkLiIsIGNvbnRyYWN0cy5jb250YWlucyhDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFdyaXRlckludGVyY2VwdG9yLmNsYXNzICsgIiBzaG91bGQgbm90IGJlIHJlZ2lzdGVyZWQuIiwgY29udHJhY3RzLmNvbnRhaW5zKFdyaXRlckludGVyY2VwdG9yLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0SW5zdGFuY2VzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q2xhc3NlcygpLmNvbnRhaW5zKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJJbnN0YW5jZXNDb250cmFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihudWxsLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJDYW5ub3QgcmVnaXN0ZXIgbnVsbC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE9LLgorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29tcGxleEVtcHR5UHJvdmlkZXIgY29tcGxleEVtcHR5UHJvdmlkZXIgPSBuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXIoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGNvbXBsZXhFbXB0eVByb3ZpZGVyLAorICAgICAgICAgICAgICAgIFJlYWRlckludGVyY2VwdG9yLmNsYXNzLCBDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzLCBXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3RQcm92aWRlciA9IGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRNb2RlbChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzID0gY29udHJhY3RQcm92aWRlci5nZXRDb250cmFjdHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvbnRyYWN0cy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKFJlYWRlckludGVyY2VwdG9yLmNsYXNzICsgIiBpcyBub3QgcmVnaXN0ZXJlZC4iLCBjb250cmFjdHMuY29udGFpbnMoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzICsgIiBpcyBub3QgcmVnaXN0ZXJlZC4iLCBjb250cmFjdHMuY29udGFpbnMoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyArICIgc2hvdWxkIG5vdCBiZSByZWdpc3RlcmVkLiIsIGNvbnRyYWN0cy5jb250YWlucyhXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldEluc3RhbmNlcygpLmNvbnRhaW5zKGNvbXBsZXhFbXB0eVByb3ZpZGVyKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENsYXNzZXMoKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyQ2xhc3NDb250cmFjdHNGZWF0dXJlTm90SW52b2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlLmNsYXNzLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKENvbXBsZXhFbXB0eVByb3ZpZGVyRmVhdHVyZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVySW5zdGFuY2VzQ29udHJhY3RzRmVhdHVyZU5vdEludm9rZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlIGZlYXR1cmUgPSBuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihmZWF0dXJlLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKENvbXBsZXhFbXB0eVByb3ZpZGVyRmVhdHVyZS5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChmZWF0dXJlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJDbGFzc051bGxDb250cmFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzLCAoQ2xhc3MpIG51bGwpOworCisgICAgICAgIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3RQcm92aWRlciA9CisgICAgICAgICAgICAgICAgY29uZmlnLmdldENvbXBvbmVudEJhZygpLmdldE1vZGVsKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjb250cmFjdHMgPSBjb250cmFjdFByb3ZpZGVyLmdldENvbnRyYWN0cygpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBjb250cmFjdHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3Rlckluc3RhbmNlTnVsbENvbnRyYWN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IENvbXBsZXhFbXB0eVByb3ZpZGVyKCksIChDbGFzcykgbnVsbCk7CisKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBjb250cmFjdFByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29tcG9uZW50QmFnKCkuZ2V0TW9kZWwoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IGNvbnRyYWN0UHJvdmlkZXIuZ2V0Q29udHJhY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvbnRyYWN0cy5zaXplKCkpOworICAgIH0KKworICAgIC8vIFJlcHJvZHVjZXIgSkVSU0VZLTE2MzcKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3Rlck51bGxPckVtcHR5Q29udHJhY3RzKCkgeworICAgICAgICBmaW5hbCBDb21wbGV4RW1wdHlQcm92aWRlciBwcm92aWRlciA9IG5ldyBDb21wbGV4RW1wdHlQcm92aWRlcigpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcywgIChDbGFzczw/PltdKSBudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXIsICAoQ2xhc3M8Pz5bXSkgbnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKHByb3ZpZGVyKSk7CisKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzLCAgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXIsICBuZXcgQ2xhc3NbMF0pOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChwcm92aWRlcikpOworICAgIH0KKworICAgIEBQcmlvcml0eSgzMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb3dQcmlvcml0eVByb3ZpZGVyIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IsIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDIwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1pZFByaW9yaXR5UHJvdmlkZXIgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciwgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMTAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGlnaFByaW9yaXR5UHJvdmlkZXIgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciwgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlck9yZGVyTWFudWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNaWRQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCA1MDApOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG93UHJpb3JpdHlQcm92aWRlci5jbGFzcywgMjApOworICAgICAgICBjb25maWcucmVnaXN0ZXIoSGlnaFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIDE1MCk7CisKKyAgICAgICAgUHJvdmlkZXJCaW5kZXIuYmluZFByb3ZpZGVycyhjb25maWcuZ2V0Q29tcG9uZW50QmFnKCksIGluamVjdGlvbk1hbmFnZXIpOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgZmluYWwgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IGFsbFByb3ZpZGVycyA9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgbmV3IFJhbmtlZENvbXBhcmF0b3I8PigpKTsKKworICAgICAgICBmaW5hbCBJdGVyYXRvcjxXcml0ZXJJbnRlcmNlcHRvcj4gaXRlcmF0b3IgPSBhbGxQcm92aWRlcnMuaXRlcmF0b3IoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTG93UHJpb3JpdHlQcm92aWRlci5jbGFzcywgaXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGlnaFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pZFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlck9yZGVyU2VtaUF1dG9tYXRpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIoTWlkUHJpb3JpdHlQcm92aWRlci5jbGFzcywgNTApOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG93UHJpb3JpdHlQcm92aWRlci5jbGFzcywgMjAwMCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihIaWdoUHJpb3JpdHlQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgUHJvdmlkZXJCaW5kZXIuYmluZFByb3ZpZGVycyhjb25maWcuZ2V0Q29tcG9uZW50QmFnKCksIGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIEl0ZXJhYmxlPFdyaXRlckludGVyY2VwdG9yPiBhbGxQcm92aWRlcnMgPQorICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRBbGxQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsIG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oKSk7CisKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8V3JpdGVySW50ZXJjZXB0b3I+IGl0ZXJhdG9yID0gYWxsUHJvdmlkZXJzLml0ZXJhdG9yKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pZFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhpZ2hQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCBpdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb3dQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCBpdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJPcmRlckF1dG9tYXRpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE1pZFByaW9yaXR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG93UHJpb3JpdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihIaWdoUHJpb3JpdHlQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgUHJvdmlkZXJCaW5kZXIuYmluZFByb3ZpZGVycyhjb25maWcuZ2V0Q29tcG9uZW50QmFnKCksIGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisKKyAgICAgICAgZmluYWwgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IGFsbFByb3ZpZGVycyA9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgbmV3IFJhbmtlZENvbXBhcmF0b3I8PigpKTsKKworICAgICAgICBmaW5hbCBJdGVyYXRvcjxXcml0ZXJJbnRlcmNlcHRvcj4gaXRlcmF0b3IgPSBhbGxQcm92aWRlcnMuaXRlcmF0b3IoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSGlnaFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pZFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvd1ByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlck9yZGVyRGlmRm9yQ29udHJhY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzID0gbmV3IElkZW50aXR5SGFzaE1hcDw+KCk7CisKKyAgICAgICAgY29udHJhY3RzLnB1dChXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgQ29udHJhY3RQcm92aWRlci5OT19QUklPUklUWSk7CisgICAgICAgIGNvbnRyYWN0cy5wdXQoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIDIwMDApOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTWlkUHJpb3JpdHlQcm92aWRlci5jbGFzcywgY29udHJhY3RzKTsKKyAgICAgICAgY29udHJhY3RzLmNsZWFyKCk7CisKKyAgICAgICAgY29udHJhY3RzLnB1dChXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgQ29udHJhY3RQcm92aWRlci5OT19QUklPUklUWSk7CisgICAgICAgIGNvbnRyYWN0cy5wdXQoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIDEwMDApOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG93UHJpb3JpdHlQcm92aWRlci5jbGFzcywgY29udHJhY3RzKTsKKyAgICAgICAgY29udHJhY3RzLmNsZWFyKCk7CisKKyAgICAgICAgY29udHJhY3RzLnB1dChXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgQ29udHJhY3RQcm92aWRlci5OT19QUklPUklUWSk7CisgICAgICAgIGNvbnRyYWN0cy5wdXQoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIDMwMDApOworICAgICAgICBjb25maWcucmVnaXN0ZXIoSGlnaFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGNvbnRyYWN0cyk7CisgICAgICAgIGNvbnRyYWN0cy5jbGVhcigpOworCisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBQcm92aWRlckJpbmRlci5iaW5kUHJvdmlkZXJzKGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKSwgaW5qZWN0aW9uTWFuYWdlcik7CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBmaW5hbCBJdGVyYWJsZTxXcml0ZXJJbnRlcmNlcHRvcj4gd3JpdGVySW50ZXJjZXB0b3JzID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0QWxsUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIFdyaXRlckludGVyY2VwdG9yLmNsYXNzLCBuZXcgUmFua2VkQ29tcGFyYXRvcjw+KCkpOworCisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFdyaXRlckludGVyY2VwdG9yPiB3cml0ZXJJdGVyYXRvciA9IHdyaXRlckludGVyY2VwdG9ycy5pdGVyYXRvcigpOworCisgICAgICAgIGFzc2VydEVxdWFscyhIaWdoUHJpb3JpdHlQcm92aWRlci5jbGFzcywgd3JpdGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWlkUHJpb3JpdHlQcm92aWRlci5jbGFzcywgd3JpdGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG93UHJpb3JpdHlQcm92aWRlci5jbGFzcywgd3JpdGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSh3cml0ZXJJdGVyYXRvci5oYXNOZXh0KCkpOworCisgICAgICAgIGZpbmFsIEl0ZXJhYmxlPFJlYWRlckludGVyY2VwdG9yPiByZWFkZXJJbnRlcmNlcHRvcnMgPQorICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRBbGxQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oKSk7CisKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8UmVhZGVySW50ZXJjZXB0b3I+IHJlYWRlckl0ZXJhdG9yID0gcmVhZGVySW50ZXJjZXB0b3JzLml0ZXJhdG9yKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvd1ByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIHJlYWRlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pZFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIHJlYWRlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhpZ2hQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCByZWFkZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlYWRlckl0ZXJhdG9yLmhhc05leHQoKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIDxUPiB2b2lkIF90ZXN0Q29sbGVjdGlvbnNDb21tb24oZmluYWwgU3RyaW5nIHRlc3ROYW1lLCBmaW5hbCBDb2xsZWN0aW9uPFQ+IGNvbGxlY3Rpb24sIGZpbmFsIFQgZWxlbWVudCkKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIE5vdCBudWxsLgorICAgICAgICBhc3NlcnROb3ROdWxsKHRlc3ROYW1lICsgIiAtIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgbnVsbC4iLCBjb2xsZWN0aW9uKTsKKworICAgICAgICAvLyBJbW11dGFiaWxpdHkuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKKyAgICAgICAgICAgIGZhaWwodGVzdE5hbWUgKyAiIC0gcmV0dXJuZWQgY29sbGVjdGlvbiBzaG91bGQgYmUgaW1tdXRhYmxlLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gT0suCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbVJlYWRlckEgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbVJlYWRlckIgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNpbXBsZUZlYXR1cmVBIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGluaXRCOworCisgICAgICAgIHB1YmxpYyBTaW1wbGVGZWF0dXJlQSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaW1wbGVGZWF0dXJlQShmaW5hbCBib29sZWFuIGluaXRCKSB7CisgICAgICAgICAgICB0aGlzLmluaXRCID0gaW5pdEI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGluaXRCID8gQ3VzdG9tUmVhZGVyQi5jbGFzcyA6IEN1c3RvbVJlYWRlckEuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNpbXBsZUZlYXR1cmVCIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDdXN0b21SZWFkZXJCLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnN0YW5jZUZlYXR1cmVBIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGluaXRCOworCisgICAgICAgIHB1YmxpYyBJbnN0YW5jZUZlYXR1cmVBKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEluc3RhbmNlRmVhdHVyZUEoZmluYWwgYm9vbGVhbiBpbml0QikgeworICAgICAgICAgICAgdGhpcy5pbml0QiA9IGluaXRCOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihpbml0QiA/IG5ldyBDdXN0b21SZWFkZXJCKCkgOiBuZXcgQ3VzdG9tUmVhZGVyQSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21wbGV4RmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29uZmlnKSB7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoU2ltcGxlRmVhdHVyZUEuY2xhc3MpOworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKFNpbXBsZUZlYXR1cmVCLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWN1cnNpdmVGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgQ3VzdG9tUmVhZGVyQSgpKTsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihSZWN1cnNpdmVGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWN1cnNpdmVJbnN0YW5jZUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBDdXN0b21SZWFkZXJBKCkpOworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBSZWN1cnNpdmVJbnN0YW5jZUZlYXR1cmUoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZUZlYXR1cmVIaWVyYXJjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbXBsZXhGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgZmluYWxpemVyID0gbmV3IE1hbmFnZWRPYmplY3RzRmluYWxpemVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBjb25maWcuY29uZmlndXJlTWV0YVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBmaW5hbGl6ZXIpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQoQ29tcGxleEZlYXR1cmUuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKEN1c3RvbVJlYWRlckEuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChDdXN0b21SZWFkZXJCLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJlRmVhdHVyZVJlY3Vyc2l2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucmVnaXN0ZXIoUmVjdXJzaXZlRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIgPSBuZXcgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNvbmZpZy5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGZpbmFsaXplcik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChSZWN1cnNpdmVGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb25maWcuZ2V0SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShDdXN0b21SZWFkZXJBLmNsYXNzLCBjb25maWcuZ2V0SW5zdGFuY2VzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJlRmVhdHVyZUluc3RhbmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTaW1wbGVGZWF0dXJlQSBmMSA9IG5ldyBTaW1wbGVGZWF0dXJlQSgpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoZjEpOworICAgICAgICBmaW5hbCBTaW1wbGVGZWF0dXJlQSBmMiA9IG5ldyBTaW1wbGVGZWF0dXJlQSh0cnVlKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGYyKTsKKworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgZmluYWxpemVyID0gbmV3IE1hbmFnZWRPYmplY3RzRmluYWxpemVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBjb25maWcuY29uZmlndXJlTWV0YVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBmaW5hbGl6ZXIpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQoZjEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQoZjIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKEN1c3RvbVJlYWRlckEuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQ3VzdG9tUmVhZGVyQi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZUZlYXR1cmVJbnN0YW5jZXNQcm92aWRlckluc3RhbmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnN0YW5jZUZlYXR1cmVBIGYxID0gbmV3IEluc3RhbmNlRmVhdHVyZUEoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGYxKTsKKyAgICAgICAgZmluYWwgSW5zdGFuY2VGZWF0dXJlQSBmMiA9IG5ldyBJbnN0YW5jZUZlYXR1cmVBKHRydWUpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoZjIpOworCisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIgPSBuZXcgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNvbmZpZy5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGZpbmFsaXplcik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChmMSkpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChmMikpOworCisgICAgICAgIGZpbmFsIFNldDxPYmplY3Q+IHByb3ZpZGVySW5zdGFuY2VzID0gY29uZmlnLmdldEluc3RhbmNlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcHJvdmlkZXJJbnN0YW5jZXMuc2l6ZSgpKTsKKworICAgICAgICBmaW5hbCBTZXQ8T2JqZWN0PiBwdXJlUHJvdmlkZXJJbnN0YW5jZXMgPQorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRJbnN0YW5jZXMoQ29tcG9uZW50QmFnLmV4Y2x1ZGVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHB1cmVQcm92aWRlckluc3RhbmNlcy5zaXplKCkpOworCisgICAgICAgIGludCBhID0gMDsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBpbnN0YW5jZSA6IHB1cmVQcm92aWRlckluc3RhbmNlcykgeworICAgICAgICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgQ3VzdG9tUmVhZGVyQSkgeworICAgICAgICAgICAgICAgIGErKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygxLCBhKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZUZlYXR1cmVJbnN0YW5jZVJlY3Vyc2l2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IFJlY3Vyc2l2ZUluc3RhbmNlRmVhdHVyZSgpKTsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIGZpbmFsaXplciA9IG5ldyBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgY29uZmlnLmNvbmZpZ3VyZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgZmluYWxpemVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvbmZpZy5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5zaXplKCkpOworICAgICAgICBmaW5hbCBTZXQ8T2JqZWN0PiBwdXJlUHJvdmlkZXJzID0KKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29tcG9uZW50QmFnKCkuZ2V0SW5zdGFuY2VzKENvbXBvbmVudEJhZy5leGNsdWRlTWV0YVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBwdXJlUHJvdmlkZXJzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFNhbWUoQ3VzdG9tUmVhZGVyQS5jbGFzcywgcHVyZVByb3ZpZGVycy5pdGVyYXRvcigpLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDb250cmFjdCB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXJ2aWNlIGltcGxlbWVudHMgQ29udHJhY3QgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udHJhY3RCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoU2VydmljZS5jbGFzcykudG8oQ29udHJhY3QuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cmFjdEJpbmRlckZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IENvbnRyYWN0QmluZGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5kZXJDb25maWd1cmluZ0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbnRyYWN0QmluZGVyRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIgPSBuZXcgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNvbmZpZy5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGZpbmFsaXplcik7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc0VuYWJsZWQoQ29udHJhY3RCaW5kZXJGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb25maWcuZ2V0SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShDb250cmFjdEJpbmRlci5jbGFzcywgY29uZmlnLmdldEluc3RhbmNlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldENsYXNzKCkpOworCisgICAgICAgIGZpbmFsIENvbnRyYWN0IHNlcnZpY2UgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnRyYWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzZXJ2aWNlKTsKKyAgICAgICAgYXNzZXJ0U2FtZShTZXJ2aWNlLmNsYXNzLCBzZXJ2aWNlLmdldENsYXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5qZWN0TWUgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5qZWN0SW50b0ZlYXR1cmVJbnN0YW5jZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBJbmplY3RNZSBpbmplY3RNZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucHJvcGVydHkoImluc3RhbmNlLWluamVjdGVkIiwgaW5qZWN0TWUgIT0gbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5qZWN0SW50b0ZlYXR1cmVDbGFzcyBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBJbmplY3RNZSBpbmplY3RNZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucHJvcGVydHkoImNsYXNzLWluamVjdGVkIiwgaW5qZWN0TWUgIT0gbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmluZEluamVjdE1lSW5GZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kKG5ldyBJbmplY3RNZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluamVjdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIoSW5qZWN0SW50b0ZlYXR1cmVDbGFzcy5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEluamVjdEludG9GZWF0dXJlSW5zdGFuY2UoKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmluZChuZXcgSW5qZWN0TWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgZmluYWxpemVyID0gbmV3IE1hbmFnZWRPYmplY3RzRmluYWxpemVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBjb25maWcuY29uZmlndXJlTWV0YVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBmaW5hbGl6ZXIpOworCisgICAgICAgIGFzc2VydFRoYXQoIkZlYXR1cmUgaW5zdGFuY2Ugbm90IGluamVjdGVkIiwgY29uZmlnLmdldFByb3BlcnR5KCJpbnN0YW5jZS1pbmplY3RlZCIpLnRvU3RyaW5nKCksIGlzKCJ0cnVlIikpOworICAgICAgICBhc3NlcnRUaGF0KCJGZWF0dXJlIGNsYXNzIG5vdCBpbmplY3RlZCIsIGNvbmZpZy5nZXRQcm9wZXJ0eSgiY2xhc3MtaW5qZWN0ZWQiKS50b1N0cmluZygpLCBpcygidHJ1ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluamVjdGlvbnNCaW5kSW5GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgQmluZEluamVjdE1lSW5GZWF0dXJlKCkpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoSW5qZWN0SW50b0ZlYXR1cmVDbGFzcy5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgSW5qZWN0SW50b0ZlYXR1cmVJbnN0YW5jZSgpKTsKKworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgZmluYWxpemVyID0gbmV3IE1hbmFnZWRPYmplY3RzRmluYWxpemVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBjb25maWcuY29uZmlndXJlTWV0YVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBmaW5hbGl6ZXIpOworCisgICAgICAgIGFzc2VydFRoYXQoIkZlYXR1cmUgaW5zdGFuY2Ugbm90IGluamVjdGVkIiwgY29uZmlnLmdldFByb3BlcnR5KCJpbnN0YW5jZS1pbmplY3RlZCIpLnRvU3RyaW5nKCksIGlzKCJ0cnVlIikpOworICAgICAgICBhc3NlcnRUaGF0KCJGZWF0dXJlIGNsYXNzIG5vdCBpbmplY3RlZCIsIGNvbmZpZy5nZXRQcm9wZXJ0eSgiY2xhc3MtaW5qZWN0ZWQiKS50b1N0cmluZygpLCBpcygidHJ1ZSIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vcHJvY2Vzcy9pbnRlcm5hbC9FeGVjdXRvclByb3ZpZGVyc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vcHJvY2Vzcy9pbnRlcm5hbC9FeGVjdXRvclByb3ZpZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2ZkNTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wcm9jZXNzL2ludGVybmFsL0V4ZWN1dG9yUHJvdmlkZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ucHJvY2Vzcy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9kdWNlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLkV4ZWN1dG9yUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGVjdXRvclNlcnZpY2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5UaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlcjsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBFeGVjdXRvclByb3ZpZGVycyB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjdXRvclByb3ZpZGVyc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gc2NoZWR1bGVyIGluamVjdGlvbiBxdWFsaWZpZXIuCisgICAgICovCisgICAgQFF1YWxpZmllcgorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEN1c3RvbVNjaGVkdWxlciB7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gc2NoZWR1bGVyIHByb3ZpZGVyLgorICAgICAqLworICAgIEBDdXN0b21TY2hlZHVsZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbVNjaGVkdWxlclByb3ZpZGVyIGV4dGVuZHMgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNjaGVkdWxlZCB0aHJlYWQgcG9vbCBleGVjdXRvciBwcm92aWRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXN0b21TY2hlZHVsZXJQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKCJjdXN0b20tc2NoZWR1bGVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gbmFtZWQgc2NoZWR1bGVyIHByb3ZpZGVyLgorICAgICAqLworICAgIEBOYW1lZCgiY3VzdG9tLXNjaGVkdWxlciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21OYW1lZFNjaGVkdWxlclByb3ZpZGVyIGV4dGVuZHMgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNjaGVkdWxlZCB0aHJlYWQgcG9vbCBleGVjdXRvciBwcm92aWRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDdXN0b21OYW1lZFNjaGVkdWxlclByb3ZpZGVyKCkgeworICAgICAgICAgICAgc3VwZXIoImN1c3RvbS1uYW1lZC1zY2hlZHVsZXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSBleGVjdXRvciBpbmplY3Rpb24gcXVhbGlmaWVyLgorICAgICAqLworICAgIEBRdWFsaWZpZXIKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBDdXN0b21FeGVjdXRvciB7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gZXhlY3V0b3IgcHJvdmlkZXIuCisgICAgICovCisgICAgQEN1c3RvbUV4ZWN1dG9yCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21FeGVjdXRvclByb3ZpZGVyIGV4dGVuZHMgVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRocmVhZCBwb29sIGV4ZWN1dG9yIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzdXBlcigiY3VzdG9tLWV4ZWN1dG9yIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gbmFtZWQgZXhlY3V0b3IgcHJvdmlkZXIuCisgICAgICovCisgICAgQE5hbWVkKCJjdXN0b20tZXhlY3V0b3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tTmFtZWRFeGVjdXRvclByb3ZpZGVyIGV4dGVuZHMgVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRocmVhZCBwb29sIGV4ZWN1dG9yIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1c3RvbU5hbWVkRXhlY3V0b3JQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKCJjdXN0b20tbmFtZWQtZXhlY3V0b3IiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdGFzayB0byByZXRyaWV2ZSB0aGUgY3VycmVudCB0aHJlYWQgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1cnJlbnRUaHJlYWROYW1lUmV0cmlldmVyVGFzayBpbXBsZW1lbnRzIFByb2R1Y2VyPFN0cmluZz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNhbGwoKSB7CisgICAgICAgICAgICByZXR1cm4gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllciBvZiBwcmUtZGVzdHJveSBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZURlc3Ryb3lOb3RpZmllciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhd2FpdChmaW5hbCBsb25nIHRpbWVvdXQsIGZpbmFsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbGF0Y2guYXdhaXQodGltZW91dCwgdW5pdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmplY3RhYmxlIGV4ZWN1dG9yIGNsaWVudCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdGVkRXhlY3V0b3JDbGllbnQgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBQcmVEZXN0cm95Tm90aWZpZXIgcHJlRGVzdHJveU5vdGlmaWVyOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQEN1c3RvbUV4ZWN1dG9yCisgICAgICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbUV4ZWN1dG9yOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQE5hbWVkKCJjdXN0b20tZXhlY3V0b3IiKQorICAgICAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBjdXN0b21OYW1lZEV4ZWN1dG9yOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQEN1c3RvbVNjaGVkdWxlcgorICAgICAgICBwcml2YXRlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBjdXN0b21TY2hlZHVsZXI7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBAQ3VzdG9tU2NoZWR1bGVyCisgICAgICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbVNjaGVkdWxlckFzRXhlY3V0b3I7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBATmFtZWQoImN1c3RvbS1zY2hlZHVsZXIiKQorICAgICAgICBwcml2YXRlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBjdXN0b21OYW1lZFNjaGVkdWxlcjsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIEBOYW1lZCgiY3VzdG9tLXNjaGVkdWxlciIpCisgICAgICAgIHByaXZhdGUgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbU5hbWVkU2NoZWR1bGVyQXNFeGVjdXRvcjsKKworICAgIH0KKworICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworCisKKworICAgICAgICBiaW5kKEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIuY2xhc3MpLnRvKEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICBiaW5kKEN1c3RvbU5hbWVkRXhlY3V0b3JQcm92aWRlci5jbGFzcykudG8oRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGJpbmQoQ3VzdG9tU2NoZWR1bGVyUHJvdmlkZXIuY2xhc3MpLnRvKFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICBiaW5kKEN1c3RvbU5hbWVkU2NoZWR1bGVyUHJvdmlkZXIuY2xhc3MpLnRvKFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICBiaW5kQXNDb250cmFjdChQcmVEZXN0cm95Tm90aWZpZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0LXVwIHRoZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIodGhpcyk7CisgICAgICAgIEV4ZWN1dG9yUHJvdmlkZXJzLnJlZ2lzdGVyRXhlY3V0b3JCaW5kaW5ncyhpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZXhlY3V0b3IgYW5kIHNjaGVkdWxlciBpbmplY3Rpb24gYXMgd2VsbCBhcyB0aGUgcHJvcGVyIHNodXRkb3duIHdoZW4gaW5qZWN0aW9uIG1hbmFnZXIgaXMgY2xvc2VkLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0b3JJbmplY3Rpb25BbmRSZWxlYXNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5qZWN0ZWRFeGVjdXRvckNsaWVudCBleGVjdXRvckNsaWVudCA9IEluamVjdGlvbnMuZ2V0T3JDcmVhdGUoaW5qZWN0aW9uTWFuYWdlciwgSW5qZWN0ZWRFeGVjdXRvckNsaWVudC5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChleGVjdXRvckNsaWVudC5jdXN0b21FeGVjdXRvciwgTWF0Y2hlcnMubm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbU5hbWVkRXhlY3V0b3IsIE1hdGNoZXJzLm5vdE51bGxWYWx1ZSgpKTsKKworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbVNjaGVkdWxlciwgTWF0Y2hlcnMubm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbU5hbWVkU2NoZWR1bGVyLCBNYXRjaGVycy5ub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tU2NoZWR1bGVyQXNFeGVjdXRvciwgTWF0Y2hlcnMubm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbU5hbWVkU2NoZWR1bGVyQXNFeGVjdXRvciwgTWF0Y2hlcnMubm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIEN1cnJlbnRUaHJlYWROYW1lUmV0cmlldmVyVGFzayBuYW1lUmV0cmlldmVyVGFzayA9IG5ldyBDdXJyZW50VGhyZWFkTmFtZVJldHJpZXZlclRhc2soKTsKKworICAgICAgICAvLyBUZXN0IGF1dGhlbnRpY2l0eSBvZiBpbmplY3RlZCBleGVjdXRvcnMKKyAgICAgICAgYXNzZXJ0VGhhdChleGVjdXRvckNsaWVudC5jdXN0b21FeGVjdXRvci5zdWJtaXQobmFtZVJldHJpZXZlclRhc2spLmdldCgpLAorICAgICAgICAgICAgICAgIE1hdGNoZXJzLnN0YXJ0c1dpdGgoImN1c3RvbS1leGVjdXRvci0iKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tTmFtZWRFeGVjdXRvci5zdWJtaXQobmFtZVJldHJpZXZlclRhc2spLmdldCgpLAorICAgICAgICAgICAgICAgIE1hdGNoZXJzLnN0YXJ0c1dpdGgoImN1c3RvbS1uYW1lZC1leGVjdXRvci0iKSk7CisKKyAgICAgICAgLy8gVGVzdCBhdXRoZW50aWNpdHkgb2YgaW5qZWN0ZWQgc2NoZWR1bGVycworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbVNjaGVkdWxlci5zdWJtaXQobmFtZVJldHJpZXZlclRhc2spLmdldCgpLAorICAgICAgICAgICAgICAgIE1hdGNoZXJzLnN0YXJ0c1dpdGgoImN1c3RvbS1zY2hlZHVsZXItIikpOworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbU5hbWVkU2NoZWR1bGVyLnN1Ym1pdChuYW1lUmV0cmlldmVyVGFzaykuZ2V0KCksCisgICAgICAgICAgICAgICAgTWF0Y2hlcnMuc3RhcnRzV2l0aCgiY3VzdG9tLW5hbWVkLXNjaGVkdWxlci0iKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tU2NoZWR1bGVyQXNFeGVjdXRvci5zdWJtaXQobmFtZVJldHJpZXZlclRhc2spLmdldCgpLAorICAgICAgICAgICAgICAgIE1hdGNoZXJzLnN0YXJ0c1dpdGgoImN1c3RvbS1zY2hlZHVsZXItIikpOworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbU5hbWVkU2NoZWR1bGVyQXNFeGVjdXRvci5zdWJtaXQobmFtZVJldHJpZXZlclRhc2spLmdldCgpLAorICAgICAgICAgICAgICAgIE1hdGNoZXJzLnN0YXJ0c1dpdGgoImN1c3RvbS1uYW1lZC1zY2hlZHVsZXItIikpOworCisgICAgICAgIC8vIFRlc3QgcHJvcGVyIGV4ZWN1dG9yIHNodXRkb3duIHdoZW4gbG9jYXRvciBpcyBzaHV0IGRvd24uCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXYWl0aW5nIGZvciBwcmUtZGVzdHJveSB0aW1lZCBvdXQuIiwKKyAgICAgICAgICAgICAgICBleGVjdXRvckNsaWVudC5wcmVEZXN0cm95Tm90aWZpZXIuYXdhaXQoMywgVGltZVVuaXQuU0VDT05EUyksIE1hdGNoZXJzLmlzKHRydWUpKTsKKworICAgICAgICB0ZXN0U2h1dERvd24oImN1c3RvbUV4ZWN1dG9yIiwgZXhlY3V0b3JDbGllbnQuY3VzdG9tRXhlY3V0b3IpOworICAgICAgICB0ZXN0U2h1dERvd24oImN1c3RvbU5hbWVkRXhlY3V0b3IiLCBleGVjdXRvckNsaWVudC5jdXN0b21OYW1lZEV4ZWN1dG9yKTsKKyAgICAgICAgdGVzdFNodXREb3duKCJjdXN0b21TY2hlZHVsZXIiLCBleGVjdXRvckNsaWVudC5jdXN0b21TY2hlZHVsZXIpOworICAgICAgICB0ZXN0U2h1dERvd24oImN1c3RvbU5hbWVkU2NoZWR1bGVyIiwgZXhlY3V0b3JDbGllbnQuY3VzdG9tTmFtZWRTY2hlZHVsZXIpOworICAgICAgICB0ZXN0U2h1dERvd24oImN1c3RvbVNjaGVkdWxlckFzRXhlY3V0b3IiLCBleGVjdXRvckNsaWVudC5jdXN0b21TY2hlZHVsZXJBc0V4ZWN1dG9yKTsKKyAgICAgICAgdGVzdFNodXREb3duKCJjdXN0b21OYW1lZFNjaGVkdWxlckFzRXhlY3V0b3IiLCBleGVjdXRvckNsaWVudC5jdXN0b21OYW1lZFNjaGVkdWxlckFzRXhlY3V0b3IpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U2h1dERvd24oU3RyaW5nIG5hbWUsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUobmFtZSArICIgbm90IHNodXRkb3duIiwgZXhlY3V0b3JTZXJ2aWNlLmlzU2h1dGRvd24oKSk7CisgICAgICAgIGFzc2VydFRydWUobmFtZSArICIgbm90IHRlcm1pbmF0ZWQiLCBleGVjdXRvclNlcnZpY2UuaXNUZXJtaW5hdGVkKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wcm9jZXNzL2ludGVybmFsL1JlcXVlc3RTY29wZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vcHJvY2Vzcy9pbnRlcm5hbC9SZXF1ZXN0U2NvcGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhMjNlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vcHJvY2Vzcy9pbnRlcm5hbC9SZXF1ZXN0U2NvcGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5wcm9jZXNzLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsyUmVxdWVzdFNjb3BlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Gb3JlaWduRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlSGFuZGxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5BYnN0cmFjdEFjdGl2ZURlc2NyaXB0b3I7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3Qgb2YgdGhlIHtAbGluayBSZXF1ZXN0U2NvcGUgcmVxdWVzdCBzY29wZX0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY29wZVdpdGhDcmVhdGVkSW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGUgPSBuZXcgSGsyUmVxdWVzdFNjb3BlKCk7CisgICAgICAgIGFzc2VydE51bGwocmVxdWVzdFNjb3BlLnN1c3BlbmRDdXJyZW50KCkpOworICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgY29udGV4dCA9IChIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UpIHJlcXVlc3RTY29wZS5jcmVhdGVDb250ZXh0KCk7CisgICAgICAgIEZvcmVpZ25EZXNjcmlwdG9yIGluaGFiID0gRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChuZXcgVGVzdFByb3ZpZGVyKCJhIikpOworICAgICAgICBjb250ZXh0LnB1dChpbmhhYiwgIjEiKTsKKyAgICAgICAgcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUoY29udGV4dCwgKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgY29udGV4dC5nZXQoaW5oYWIpKTsKKyAgICAgICAgICAgIGNvbnRleHQucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgY29udGV4dC5nZXQoaW5oYWIpKTsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydE51bGwoY29udGV4dC5nZXQoaW5oYWIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY29wZVJlbGVhc2VJbnNpZGVTY29wZSgpIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSA9IG5ldyBIazJSZXF1ZXN0U2NvcGUoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKSk7CisgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnN0YW5jZSA9IChIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UpIHJlcXVlc3RTY29wZS5jcmVhdGVDb250ZXh0KCk7CisgICAgICAgIEZvcmVpZ25EZXNjcmlwdG9yIGluaGFiID0gRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChuZXcgVGVzdFByb3ZpZGVyKCJhIikpOworICAgICAgICBpbnN0YW5jZS5wdXQoaW5oYWIsICIxIik7CisgICAgICAgIHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKGluc3RhbmNlLCAoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgaW50ZXJuYWxJbnN0YW5jZSA9IChIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UpIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGludGVybmFsSW5zdGFuY2UsIGluc3RhbmNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlLmdldChpbmhhYikpOworICAgICAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICBhc3NlcnROdWxsKGluc3RhbmNlLmdldChpbmhhYikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjb3BlV2l0aEltcGxpY2l0SW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSA9IG5ldyBIazJSZXF1ZXN0U2NvcGUoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKSk7CisgICAgICAgIEZvcmVpZ25EZXNjcmlwdG9yIGluaGFiID0gRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChuZXcgVGVzdFByb3ZpZGVyKCJhIikpOworICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgaW5zdGFuY2UgPSByZXF1ZXN0U2NvcGUucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgaW50ZXJuYWxJbnN0YW5jZSA9IChIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UpIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChpbnRlcm5hbEluc3RhbmNlLmdldChpbmhhYikpOworICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZS5wdXQoaW5oYWIsICIxIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnRlcm5hbEluc3RhbmNlLmdldChpbmhhYikpOworICAgICAgICAgICAgcmV0dXJuIGludGVybmFsSW5zdGFuY2U7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICBhc3NlcnROdWxsKGluc3RhbmNlLmdldChpbmhhYikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjb3BlV2l0aFR3b0ludGVybmFsVGFza3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSA9IG5ldyBIazJSZXF1ZXN0U2NvcGUoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKSk7CisgICAgICAgIEZvcmVpZ25EZXNjcmlwdG9yIGluaGFiID0gRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChuZXcgVGVzdFByb3ZpZGVyKCJhIikpOworICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgaW5zdGFuY2UgPSByZXF1ZXN0U2NvcGUucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgaW50ZXJuYWxJbnN0YW5jZSA9IChIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UpIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworCisgICAgICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgYW5vdGhlckluc3RhbmNlID0gcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUoKCkgLT4geworICAgICAgICAgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBjdXJyZW50SW5zdGFuY2UgPSAoSGsyUmVxdWVzdFNjb3BlLkluc3RhbmNlKSByZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCFjdXJyZW50SW5zdGFuY2UuZXF1YWxzKGludGVybmFsSW5zdGFuY2UpKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50SW5zdGFuY2UucHV0KGluaGFiLCAiMSIpOworICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50SW5zdGFuY2U7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIWFub3RoZXJJbnN0YW5jZS5lcXVhbHMoaW50ZXJuYWxJbnN0YW5jZSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgYW5vdGhlckluc3RhbmNlLmdldChpbmhhYikpOworICAgICAgICAgICAgYW5vdGhlckluc3RhbmNlLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoYW5vdGhlckluc3RhbmNlLmdldChpbmhhYikpOworCisgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZTsKKyAgICAgICAgfSk7CisgICAgICAgIGluc3RhbmNlLnJlbGVhc2UoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUdldEluc3RhbmNlQ2FsbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSA9IG5ldyBIazJSZXF1ZXN0U2NvcGUoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKSk7CisgICAgICAgIEZvcmVpZ25EZXNjcmlwdG9yIGluaGFiID0gRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChuZXcgVGVzdFByb3ZpZGVyKCJhIikpOworICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgaW5zdGFuY2UgPSByZXF1ZXN0U2NvcGUucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICBmaW5hbCBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgaW50ZXJuYWxJbnN0YW5jZSA9IChIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UpIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZS5wdXQoaW5oYWIsICIxIik7CisgICAgICAgICAgICByZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKTsKKyAgICAgICAgICAgIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgcmVxdWVzdFNjb3BlLnN1c3BlbmRDdXJyZW50KCk7CisgICAgICAgICAgICByZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbEluc3RhbmNlOworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgIGluc3RhbmNlLnJlbGVhc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgIGluc3RhbmNlLnJlbGVhc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgIGluc3RhbmNlLnJlbGVhc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgIGluc3RhbmNlLnJlbGVhc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgIGluc3RhbmNlLnJlbGVhc2UoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlcXVlc3Qgc2NvcGUgaW5oYWJpdGFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RQcm92aWRlciBleHRlbmRzIEFic3RyYWN0QWN0aXZlRGVzY3JpcHRvcjxTdHJpbmc+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKKworICAgICAgICBwdWJsaWMgVGVzdFByb3ZpZGVyKGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFR5cGUgZ2V0SW1wbGVtZW50YXRpb25UeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEltcGxlbWVudGF0aW9uQ2xhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZShmaW5hbCBTZXJ2aWNlSGFuZGxlPD8+IHJvb3QpIHsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vdXJpL2ludGVybmFsL0plcnNleVVyaUJ1aWxkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL3VyaS9pbnRlcm5hbC9KZXJzZXlVcmlCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODMwMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL3VyaS9pbnRlcm5hbC9KZXJzZXlVcmlCdWlsZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLnVyaS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlBhdGhTZWdtZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlDb21wb25lbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLmludGVybmFsLkplcnNleVVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVXJpIGJ1aWxkZXIgaW1wbGVtZW50YXRpb24gdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFZldGxlIExlaW5vbmVuLVJvZWltICh2ZXRsZSBhdCByb2VpbS5uZXQpCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlVcmlCdWlsZGVyVGVzdCB7CisKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlclRlc3QoKSB7CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI1MzcKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEtlZXBUcmFpbGluZ1NsYXNoKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9leGFtcGxlLmNvbS9hdXRoZW50aWNhdGlvbnM7ZW1haWw9am9lQGpvZS5jb20vIik7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgodXJsLmdldFBhdGgoKSkucmVwbGFjZU1hdHJpeChudWxsKTsKKworICAgICAgICBmaW5hbCBVUkkgcmVzdWx0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hdXRoZW50aWNhdGlvbnMvIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNTM3CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZW1vdmVBbGxJbmNsdWRpbmdTZW1pY29sb24oKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cDovL2V4YW1wbGUuY29tL2F1dGhlbnRpY2F0aW9ucztlbWFpbD1qb2VAam9lLmNvbSIpOworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKHVybC5nZXRQYXRoKCkpLnJlcGxhY2VNYXRyaXgobnVsbCk7CisKKyAgICAgICAgZmluYWwgVVJJIHJlc3VsdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYXV0aGVudGljYXRpb25zIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNTM3CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRMZWF2ZVVSSVVudG91Y2hlZCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBidWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiL2FwcGxlcztvcmRlcj1yYW5kb207Y29sb3I9Ymx1ZS8yMDA2IikucmVwbGFjZU1hdHJpeChudWxsKTsKKyAgICAgICAgZmluYWwgVVJJIHJlc3VsdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYXBwbGVzO29yZGVyPXJhbmRvbTtjb2xvcj1ibHVlLzIwMDYiLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI1MzcKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZExlYXZlVVJJVW50b3VjaGVkQW5kS2VlcFNsYXNoKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCIvYXBwbGVzO29yZGVyPXJhbmRvbTtjb2xvcj1ibHVlLzIwMDYvIikucmVwbGFjZU1hdHJpeChudWxsKTsKKyAgICAgICAgZmluYWwgVVJJIHJlc3VsdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYXBwbGVzO29yZGVyPXJhbmRvbTtjb2xvcj1ibHVlLzIwMDYvIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNTM3CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRPbmx5UmVtb3ZlTWF0cml4SW5GaW5hbFNlZ21lbnQoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi9hcHBsZXM7b3JkZXI9cmFuZG9tO2NvbG9yPWJsdWUvMjAwNi9iYXI7em90PWJheiIpLnJlcGxhY2VNYXRyaXgobnVsbCk7CisgICAgICAgIGZpbmFsIFVSSSByZXN1bHQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxlcztvcmRlcj1yYW5kb207Y29sb3I9Ymx1ZS8yMDA2L2JhciIsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjUzNworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkT25seVJlbW92ZU1hdHJpeEluRmluYWxTZWdtZW50QW5kS2VlcFNsYXNoKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCIvYXBwbGVzO29yZGVyPXJhbmRvbTtjb2xvcj1ibHVlLzIwMDYvYmFyO3pvdD1iYXovIikucmVwbGFjZU1hdHJpeChudWxsKTsKKyAgICAgICAgZmluYWwgVVJJIHJlc3VsdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYXBwbGVzO29yZGVyPXJhbmRvbTtjb2xvcj1ibHVlLzIwMDYvYmFyLyIsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjAzNgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VOb25Bc2NpaVF1ZXJ5UGFyYW0oKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cDovL2V4YW1wbGUuY29tL2dldE15TmFtZT9uw6ltZT10Iik7CisgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9IHVybC5nZXRRdWVyeSgpOworCisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgodXJsLmdldFBhdGgoKSkuc2NoZW1lKHVybC5nZXRQcm90b2NvbCgpKS5ob3N0KHVybC5nZXRIb3N0KCkpCisgICAgICAgICAgICAgICAgLnBvcnQodXJsLmdldFBvcnQoKSkKKyAgICAgICAgICAgICAgICAucmVwbGFjZVF1ZXJ5KHF1ZXJ5KS5mcmFnbWVudCh1cmwuZ2V0UmVmKCkpOworCisgICAgICAgIC8vIFJlcGxhY2UgUXVlcnlQYXJhbS4KKyAgICAgICAgZmluYWwgU3RyaW5nIHBhcm1OYW1lID0gIm7DqW1lIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gInZhbHVlIjsKKworICAgICAgICBidWlsZGVyLnJlcGxhY2VRdWVyeVBhcmFtKHBhcm1OYW1lLCB2YWx1ZSk7CisKKyAgICAgICAgZmluYWwgVVJJIHJlc3VsdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgVVJJIGV4cGVjdGVkID0gbmV3IFVSSSgiaHR0cDovL2V4YW1wbGUuY29tL2dldE15TmFtZT9uw6ltZT12YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQudG9BU0NJSVN0cmluZygpLCByZXN1bHQudG9BU0NJSVN0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIC8vIFNlZSBKQVhfUlNfU1BFQy0yNDUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjaW5nVXNlckluZm8oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB1c2VySW5mbyA9ICJmb286Zm9vIjsKKworICAgICAgICBVUkkgdXJpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9mb28yOmZvbzJAbG9jYWxob3N0OjgwODAiKS51c2VySW5mbyh1c2VySW5mbykuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJJbmZvLCB1cmkuZ2V0UmF3VXNlckluZm8oKSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS51c2VySW5mbyh1c2VySW5mbykuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXJJbmZvLCB1cmkuZ2V0UmF3VXNlckluZm8oKSk7CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE4MDAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVVyaVN0cmluZygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSgiIik7CisgICAgICAgIEplcnNleVVyaUJ1aWxkZXIgdWIgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgibmV3czpjb21wLmxhbmcuamF2YSIpLnVyaSh1cmkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5ld3M6IiwgdWIudG9UZW1wbGF0ZSgpKTsKKyAgICAgICAgLy8gbm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBVUkkgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIFJGQyAzOTg2LAorICAgICAgICAvLyBpdCBpcyBub3QgcG9zc2libGUgdG8gY3JlYXRlIGEgamF2YS5uZXQuVVJJIGZyb20gdGhpcyBidWlsZGVyIGlmIFNTUCBpcyBlbXB0eQorCisgICAgICAgIHViID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIm5ld3M6Y29tcC5sYW5nLmphdmEiKS51cmkoIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5ld3M6IiwgdWIudG9UZW1wbGF0ZSgpKTsKKyAgICAgICAgLy8gbm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBVUkkgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIFJGQyAzOTg2LAorICAgICAgICAvLyBpdCBpcyBub3QgcG9zc2libGUgdG8gY3JlYXRlIGEgamF2YS5uZXQuVVJJIGZyb20gdGhpcyBidWlsZGVyIGlmIFNTUCBpcyBlbXB0eQorICAgIH0KKworICAgIC8vIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNzUzCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpQnVpbGRlclNob3VsZExlYXZlUmVsYXRpdmVQYXRoUmVsYXRpdmUoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IEplcnNleVVyaUJ1aWxkZXIuZnJvbVBhdGgoIiIpOworICAgICAgICBidWlsZGVyLnNjaGVtZSgiaHR0cCIpOworICAgICAgICBidWlsZGVyLnJlcGxhY2VQYXRoKCJwYXRoIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOnBhdGgiLCBidWlsZGVyLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9UZW1wbGF0ZSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBKZXJzZXlVcmlCdWlsZGVyIHViID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkobmV3IFVSSSgiaHR0cDovL2V4YW1wbGVzLmplcnNleS5qYXZhLm5ldC8iKSkudXNlckluZm8oIntUMX0iKQorICAgICAgICAgICAgICAgIC5wYXRoKCJ7VDJ9Iikuc2VnbWVudCgie1QzfSIpLnF1ZXJ5UGFyYW0oImEiLCAie1Q0fSIsICJ2MSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImIiLCAidjIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8ve1QxfUBleGFtcGxlcy5qZXJzZXkuamF2YS5uZXQve1QyfS97VDN9P2E9e1Q0fSZhPXYxJmI9djIiLCB1Yi50b1RlbXBsYXRlKCkpOworCisgICAgICAgIHViLnF1ZXJ5UGFyYW0oImEiLCAidjMiKS5xdWVyeVBhcmFtKCJjIiwgInY0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3tUMX1AZXhhbXBsZXMuamVyc2V5LmphdmEubmV0L3tUMn0ve1QzfT9hPXtUNH0mYT12MSZiPXYyJmE9djMmYz12NCIsIHViLnRvVGVtcGxhdGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFRlbXBsYXRlVmFsdWVFbmNvZGluZygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVzdWx0OworICAgICAgICByZXN1bHQgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShuZXcgVVJJKCJodHRwOi8vZXhhbXBsZXMuamVyc2V5LmphdmEubmV0LyIpKS51c2VySW5mbygiYS9iIikucGF0aCgiYS9iIikKKyAgICAgICAgICAgICAgICAuc2VnbWVudCgiYS9iIikuYnVpbGQoKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9hJTJGYkBleGFtcGxlcy5qZXJzZXkuamF2YS5uZXQvYS9iL2ElMkZiIiwgcmVzdWx0KTsKKworICAgICAgICByZXN1bHQgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShuZXcgVVJJKCJodHRwOi8vZXhhbXBsZXMuamVyc2V5LmphdmEubmV0LyIpKS51c2VySW5mbygie1QxfSIpLnBhdGgoIntUMn0iKQorICAgICAgICAgICAgICAgIC5zZWdtZW50KCJ7VDN9IikuYnVpbGQoImEvYiIsICJhL2IiLCAiYS9iIikudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vYSUyRmJAZXhhbXBsZXMuamVyc2V5LmphdmEubmV0L2ElMkZiL2ElMkZiIiwgcmVzdWx0KTsKKworICAgICAgICByZXN1bHQgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShuZXcgVVJJKCJodHRwOi8vZXhhbXBsZXMuamVyc2V5LmphdmEubmV0LyIpKS51c2VySW5mbygie1QxfSIpLnBhdGgoIntUMn0iKQorICAgICAgICAgICAgICAgIC5zZWdtZW50KCJ7VDN9IikuYnVpbGQobmV3IE9iamVjdFtdIHsiYS9iIiwgImEvYiIsICJhL2IifSwgZmFsc2UpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2ElMkZiQGV4YW1wbGVzLmplcnNleS5qYXZhLm5ldC9hL2IvYS9iIiwgcmVzdWx0KTsKKworICAgICAgICByZXN1bHQgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShuZXcgVVJJKCJodHRwOi8vZXhhbXBsZXMuamVyc2V5LmphdmEubmV0LyIpKS51c2VySW5mbygie1QxfSIpLnBhdGgoIntUMn0iKQorICAgICAgICAgICAgICAgIC5zZWdtZW50KCJ7VDJ9IikuYnVpbGQoImFAYiIsICJhQGIiKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9hJTQwYkBleGFtcGxlcy5qZXJzZXkuamF2YS5uZXQvYUBiL2FAYiIsIHJlc3VsdCk7CisKKyAgICAgICAgcmVzdWx0ID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkobmV3IFVSSSgiaHR0cDovL2V4YW1wbGVzLmplcnNleS5qYXZhLm5ldC8iKSkudXNlckluZm8oIntUfSIpLnBhdGgoIntUfSIpCisgICAgICAgICAgICAgICAgLnNlZ21lbnQoIntUfSIpLmJ1aWxkKCJhQGIiKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9hJTQwYkBleGFtcGxlcy5qZXJzZXkuamF2YS5uZXQvYUBiL2FAYiIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU1hdHJpeFBhcmFtV2l0aE51bGwoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkubWF0cml4UGFyYW0oIm1hdHJpeCIsICJwYXJhbTEiLCAicGFyYW0yIik7CisgICAgICAgIGJ1aWxkZXIucmVwbGFjZU1hdHJpeFBhcmFtKCJtYXRyaXgiLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoYnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCksICIiKTsKKyAgICB9CisKKyAgICAvLyBmb3IgY29tcGxldGVuZXNzIChhZGRlZCBhbG9uZyB3aXRoIHJlZ3Jlc3Npb24gdGVzdHMgZm9yIEpFUlNFWS0xMTE0KQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkTm9TbGFzaFVyaSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBidWlsZGVyID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAvdGVzdCIsIGJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEpFUlNFWS0xMTE0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGcm9tTWFwTm9TbGFzaEluVXJpKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKSkucGF0aCgidGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC90ZXN0IiwgYnVpbGRlci5idWlsZEZyb21NYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTExMTQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZEZyb21BcnJheU5vU2xhc2hJblVyaSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBidWlsZGVyID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAvdGVzdCIsIGJ1aWxkZXIuYnVpbGQoInRlc3RpbmciKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTnVsbE1hdHJpeFBhcmFtKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEplcnNleVVyaUJ1aWxkZXIoKS5yZXBsYWNlTWF0cml4UGFyYW0obnVsbCwgInBhcmFtIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYnV0IGdvdCAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gYnV0IG5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duLiIpOworICAgIH0KKworICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTEwODEKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUXVlcnlQYXJhbSgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkucGF0aCgiaHR0cDovL2xvY2FsaG9zdC8iKS5yZXBsYWNlUXVlcnlQYXJhbSgiZm9vIiwgInRlc3QiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3QvP2Zvbz10ZXN0IiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTEwODEKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUXVlcnlQYXJhbUFuZENsb25lKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS5wYXRoKCJodHRwOi8vbG9jYWxob3N0LyIpLnJlcGxhY2VRdWVyeVBhcmFtKCJmb28iLCAidGVzdCIpLmNsb25lKCkuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0Lz9mb289dGVzdCIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyByZWdyZXNzaW9uIHRlc3QgZm9yIEpFUlNFWS0xMzQxCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlRdWVyeVBhcmFtVmFsdWUoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnBhdGgoImh0dHA6Ly9sb2NhbGhvc3QvIikucXVlcnlQYXJhbSgidGVzdCIsICIiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3QvP3Rlc3Q9IiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTE0NTcKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTc3BWaWFTdHJpbmdVcmlUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmdbXSBvcmlnVXJpcyA9IG5ldyBTdHJpbmdbXSB7Im5ld3M6Y29tcC5sYW5nLmphdmEiLCAidGVsOisxLTgxNi01NTUtMTIxMiJ9OworICAgICAgICBmaW5hbCBVUklbXSByZXBsYWNlVXJpcyA9IG5ldyBVUklbXSB7bmV3IFVSSShudWxsLCAibmV3cy5sYW5nLmphdmEiLCBudWxsKSwgbmV3IFVSSShudWxsLCAiKzEtODY2LTU1NS0xMjEyIiwgbnVsbCl9OworICAgICAgICBmaW5hbCBTdHJpbmdbXSByZXN1bHRzID0gbmV3IFN0cmluZ1tdIHsibmV3czpuZXdzLmxhbmcuamF2YSIsICJ0ZWw6KzEtODY2LTU1NS0xMjEyIn07CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBvcmlnVXJpcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHRzW2ldLAorICAgICAgICAgICAgICAgICAgICBVcmlCdWlsZGVyLmZyb21VcmkobmV3IFVSSShvcmlnVXJpc1tpXSkpLnVyaShyZXBsYWNlVXJpc1tpXS50b0FTQ0lJU3RyaW5nKCkpLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VVcmlTdHJpbmdBZnRlckNoYW5naW5nT3BhcXVlU2NoZW1lVG9IdHRwKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvdGVzdCIsCisgICAgICAgICAgICAgICAgVXJpQnVpbGRlci5mcm9tVXJpKCJ0ZWw6KzEtODE2LTU1NS0xMjEyIikuc2NoZW1lKCJodHRwIikudXJpKCIvL3d3dy57aG9zdH0ub3JnIikucGF0aCgidGVzdCIpLmJ1aWxkKCJleGFtcGxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlCdWlsZGVyVGVtcGxhdGVzU2ltcGxlKCkgeworICAgICAgICB0ZXN0VXJpKCJhOi9wYXRoIik7CisgICAgICAgIHRlc3RVcmkoImE6L3AiKTsKKyAgICAgICAgdGVzdFVyaSgiYTovcGF0aC94L3kveiIpOworICAgICAgICB0ZXN0VXJpKCJhOi9wYXRoL3g/cT0xMiNmcmFnbWVudCIpOworICAgICAgICB0ZXN0VXJpKCJhOi9wP3EjZiIpOworICAgICAgICB0ZXN0VXJpKCJhOi8vaG9zdCIpOworICAgICAgICB0ZXN0VXJpKCJhOi8vaG9zdDo1NTU1L2EvYiIpOworICAgICAgICB0ZXN0VXJpKCJhOi8vaDo1L2EvYiIpOworICAgICAgICB0ZXN0VXJpKCJhOi91c2VyQGhvc3Q6MTIzNDUiKTsgICAgICAgICAvL3VzZXJAaG9zdDoxMjM0NSBpcyBub3QgYXV0aG9yaXR5IGJ1dCBwYXRoCisgICAgICAgIHRlc3RVcmkoImE6L3VzZXJAaG9zdDoxMjM0NS9hL2IvYyIpOworICAgICAgICB0ZXN0VXJpKCJhOi91c2VyQGhvc3Q6MTIzNDUvYS9iL2M/YWFhJmJiYiNjY2MiKTsKKyAgICAgICAgdGVzdFVyaSgiYTovdXNlckBob3N0LmhoaC5kZGQuYzoxMjM0NS9hL2IvYz9hYWEmYmJiI2NjYyIpOworICAgICAgICB0ZXN0VXJpKCIvYSIpOworICAgICAgICB0ZXN0VXJpKCIvYS8uLi8uLi9iL2MvZCIpOworICAgICAgICB0ZXN0VXJpKCIvL2xvY2FsaG9zdDo4MC9hL2IiKTsKKyAgICAgICAgdGVzdFVyaSgiLy9sOjgvYS9iIik7CisgICAgICAgIHRlc3RVcmkoImEvYiIpOworICAgICAgICB0ZXN0VXJpKCJhIik7CisgICAgICAgIHRlc3RVcmkoIi4uLy4uL3MiKTsKKyAgICAgICAgdGVzdFVyaSgibWFpbHRvOnRlc3RAdGVzdC5jb20iKTsKKyAgICAgICAgdGVzdFVyaSgiaHR0cDovL29yYWNAbGU6Y29AbToxMjM0L2EvYi9jY2M/YSNmciIpOworICAgICAgICB0ZXN0VXJpKCJodHRwOi8vWzo6RkZGRjoxMjkuMTQ0LjUyLjM4XToxMjM0L2EvYi9jY2M/YSNmciIpOworICAgICAgICB0ZXN0VXJpKCJodHRwOi8vW0ZFREM6QkE5ODo3NjU0OjMyMTA6RkVEQzpCQTk4Ojc2NTQ6MzIxMF06MTIzNC9hL2IvY2NjP2EjZnIiKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZQorICAgIHB1YmxpYyB2b2lkIGZhaWxpbmdUZXN0cygpIHsKKyAgICAgICAgdGVzdFVyaSgiYTovLyNmcmFnbWVudCIpOyAvLyBmYWlscyBpbiBKZXJzZXlVcmlCdWlsZGVyCisgICAgICAgIHRlc3RVcmkoImE6Ly8/cXVlcnkiKTsKKworICAgICAgICAvLyBmYWlsczogb3BhcXVlIHVyaXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgVXJpVGVtcGxhdGUKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJ7c2NoZW1lfTovL3ttYWlsdG99IikuYnVpbGQoIm1haWx0byIsICJlbWFpbEB0ZXN0LnR0dCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1haWx0bzplbWFpbEB0ZXN0LnR0dCIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlCdWlsZGVyVGVtcGxhdGVzKCkgeworICAgICAgICBVUkkgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC97cGF0aH0iKS5idWlsZCgiYS9iL2MiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYSUyRmIlMkZjIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJ7c2NoZW1lfTovL3tob3N0fSIpLmJ1aWxkKCJodHRwIiwgImxvY2FsaG9zdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3QiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoImh0dHA6Ly97aG9zdH06ODA4MC97cGF0aH0iKS5idWlsZCgibCIsICJhL2IvYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sOjgwODAvYSUyRmIlMkZjIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJ7c2NoZW1lfTovL3tob3N0fTp7cG9ydH0ve3BhdGh9IikuYnVpbGQoInMiLCAiaCIsIG5ldyBJbnRlZ2VyKDEpLCAiYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInM6Ly9oOjEvYSIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICB2YWx1ZXMucHV0KCJzY2hlbWUiLCAicyIpOworICAgICAgICB2YWx1ZXMucHV0KCJob3N0IiwgImgiKTsKKyAgICAgICAgdmFsdWVzLnB1dCgicG9ydCIsIDEpOworICAgICAgICB2YWx1ZXMucHV0KCJwYXRoIiwgInAvcCIpOworICAgICAgICB2YWx1ZXMucHV0KCJxdWVyeSIsICJxIik7CisgICAgICAgIHZhbHVlcy5wdXQoImZyYWdtZW50IiwgImYiKTsKKworICAgICAgICB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgie3NjaGVtZX06Ly97aG9zdH06e3BvcnR9L3twYXRofT97cXVlcnl9I3tmcmFnbWVudH0iKS5idWlsZEZyb21NYXAodmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzOi8vaDoxL3AlMkZwP3EjZiIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgie3NjaGVtZX06Ly97aG9zdH06e3BvcnR9L3twYXRofS97cGF0aDJ9IikuYnVpbGQoInMiLCAiaCIsIG5ldyBJbnRlZ2VyKDEpLCAiYSIsICJiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiczovL2g6MS9hL2IiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIntzY2hlbWV9Oi8ve2hvc3R9Ontwb3J0fS97cGF0aH0ve3BhdGgyfSIpLmJ1aWxkKCJzIiwgImgiLCBuZXcgSW50ZWdlcigxKSwgImEiLCAiYiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInM6Ly9oOjEvYS9iIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCIvL3tob3N0fTp7cG9ydH0ve3BhdGh9L3twYXRoMn0iKS5idWlsZCgiaCIsIG5ldyBJbnRlZ2VyKDEpLCAiYSIsICJiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiLy9oOjEvYS9iIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCIve2F9L3thfS97Yn0iKS5idWlsZCgiYSIsICJiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiL2EvYS9iIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCIve2F9L3thfS97Yn0/e3F1ZXJ5UGFyYW19IikuYnVpbGQoImEiLCAiYiIsICJxdWVyeSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hL2EvYj9xdWVyeSIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICAvLyBwYXJ0aWFsIHRlbXBsYXRlcworICAgICAgICB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgiL3thfXh4L3thfS97Yn0/e3F1ZXJ5UGFyYW19IikuYnVpbGQoImEiLCAiYiIsICJxdWVyeSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9heHgvYS9iP3F1ZXJ5IiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJteXtzY2hlbWV9Oi8vbXl7aG9zdH06MXtwb3J0fS9teXtwYXRofS9teXtwYXRoMn0iKQorICAgICAgICAgICAgICAgIC5idWlsZCgicyIsICJoIiwgbmV3IEludGVnZXIoMSksICJhIiwgImIvYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm15czovL215aDoxMS9teWEvbXliJTJGYyIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgibXl7c2NoZW1lfXBvc3Q6Ly9teXtob3N0fXBvc3Q6NXtwb3J0fTkvbXl7cGF0aH1wb3N0L215e3BhdGgyfXBvc3QiKQorICAgICAgICAgICAgICAgIC5idWlsZCgicyIsICJoIiwgbmV3IEludGVnZXIoMSksICJhIiwgImIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteXNwb3N0Oi8vbXlocG9zdDo1MTkvbXlhcG9zdC9teWJwb3N0IiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUJ1aWxkZXJUZW1wbGF0ZXNOb3RFbmNvZGVkU2xhc2goKSB7CisgICAgICAgIFVSSSB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3twYXRofSIpLmJ1aWxkKG5ldyBPYmplY3RbXSB7ImEvYi9jIn0sIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoImh0dHA6Ly97aG9zdH06ODA4MC97cGF0aH0iKS5idWlsZChuZXcgT2JqZWN0W10geyJsIiwgImEvYi9jIn0sIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vbDo4MDgwL2EvYi9jIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIHZhbHVlcy5wdXQoInNjaGVtZSIsICJzIik7CisgICAgICAgIHZhbHVlcy5wdXQoImhvc3QiLCAiaCIpOworICAgICAgICB2YWx1ZXMucHV0KCJwb3J0IiwgMSk7CisgICAgICAgIHZhbHVlcy5wdXQoInBhdGgiLCAicC9wIik7CisgICAgICAgIHZhbHVlcy5wdXQoInF1ZXJ5IiwgInEiKTsKKyAgICAgICAgdmFsdWVzLnB1dCgiZnJhZ21lbnQiLCAiZiIpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJ7c2NoZW1lfTovL3tob3N0fTp7cG9ydH0ve3BhdGh9P3txdWVyeX0je2ZyYWdtZW50fSIpLmJ1aWxkRnJvbU1hcCh2YWx1ZXMsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzOi8vaDoxL3AvcD9xI2YiLCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RVcmkoZmluYWwgU3RyaW5nIGlucHV0KSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShpbnB1dCkuY2xvbmUoKS5idWlsZCgpOworCisgICAgICAgIGZpbmFsIFVSSSBvcmlnaW5hbFVyaSA9IFVSSS5jcmVhdGUoaW5wdXQpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxVcmkuZ2V0U2NoZW1lKCksIHVyaS5nZXRTY2hlbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFVyaS5nZXRIb3N0KCksIHVyaS5nZXRIb3N0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxVcmkuZ2V0UG9ydCgpLCB1cmkuZ2V0UG9ydCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsVXJpLmdldFVzZXJJbmZvKCksIHVyaS5nZXRVc2VySW5mbygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsVXJpLmdldFBhdGgoKSwgdXJpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFVyaS5nZXRRdWVyeSgpLCB1cmkuZ2V0UXVlcnkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFVyaS5nZXRGcmFnbWVudCgpLCB1cmkuZ2V0RnJhZ21lbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFVyaS5nZXRSYXdTY2hlbWVTcGVjaWZpY1BhcnQoKSwgdXJpLmdldFJhd1NjaGVtZVNwZWNpZmljUGFydCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsVXJpLmlzQWJzb2x1dGUoKSwgdXJpLmlzQWJzb2x1dGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbnB1dCwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcGFxdWVVcmkoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoIm1haWx0bzphQGIiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJtYWlsdG86YUBiIiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9wYXF1ZVVyaVJlcGxhY2VTY2hlbWVTcGVjaWZpY1BhcnQoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoIm1haWx0bzphQGIiKS5zY2hlbWVTcGVjaWZpY1BhcnQoImNAZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm1haWx0bzpjQGQiLCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlUmVwbGFjZVVyaSgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgibWFpbHRvOmFAYiIpLnVyaShVUkkuY3JlYXRlKCJjQGQiKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibWFpbHRvOmNAZCIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlU2NoZW1lKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5zY2hlbWUoImh0dHBzIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cHM6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnNjaGVtZShudWxsKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIvL2xvY2FsaG9zdDo4MDgwL2EvYi9jIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikuc2NoZW1lKG51bGwpLmhvc3QobnVsbCkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiLy86ODA4MC9hL2IvYyIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnNjaGVtZShudWxsKS5ob3N0KG51bGwpLnBvcnQoLTEpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIi9hL2IvYyIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlU2NoZW1lU3BlY2lmaWNQYXJ0KCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5zY2hlbWVTcGVjaWZpY1BhcnQoIi8vbG9jYWxob3N0OjgwODAvYS9iL2MvZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jL2QiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQXV0aG9yaXR5VXJpKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8veF95L2EvYi9jIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8veF95L2EvYi9jIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU5hbWVBdXRob3JpdHlVcmlXaXRoSG9zdCgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL3hfeS5jb20vYS9iL2MiKS5ob3N0KCJ4eS5jb20iKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly94eS5jb20vYS9iL2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTmFtZUF1dGhvcml0eVVyaVdpdGhTU1AoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly94X3kuY29tL2EvYi9jIikuc2NoZW1lU3BlY2lmaWNQYXJ0KCIvL3h5LmNvbS9hL2IvYyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL3h5LmNvbS9hL2IvYyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL3hfeS5jb20vYS9iL2MiKS5zY2hlbWVTcGVjaWZpY1BhcnQoIi8vdl93LmNvbS9hL2IvYyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL3Zfdy5jb20vYS9iL2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlVXNlckluZm8oKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9ib2JAbG9jYWxob3N0OjgwODAvYS9iL2MiKS51c2VySW5mbygic3VlIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vc3VlQGxvY2FsaG9zdDo4MDgwL2EvYi9jIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUhvc3QoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLmhvc3QoImEuY29tIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vYS5jb206ODA4MC9hL2IvYyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikuaG9zdCgiWzo6RkZGRjoxMjkuMTQ0LjUyLjM4XSIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL1s6OkZGRkY6MTI5LjE0NC41Mi4zOF06ODA4MC9hL2IvYyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VQb3J0KCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5wb3J0KDkwOTApLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo5MDkwL2EvYi9jIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5wb3J0KC0xKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3QvYS9iL2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUGF0aCgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucmVwbGFjZVBhdGgoIi94L3kveiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3gveS96IiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVBhdGhOdWxsKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5yZXBsYWNlUGF0aChudWxsKS5idWlsZCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU1hdHJpeCgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jO2E9eDtiPXkiKS5yZXBsYWNlTWF0cml4KCJ4PWE7eT1iIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M7eD1hO3k9YiIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VNYXRyaXhQYXJhbXMoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdWJ1ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M7YT14O2I9eSIpLnJlcGxhY2VNYXRyaXhQYXJhbSgiYSIsICJ6IiwgInp6Iik7CisKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IHVidS5idWlsZCgpOworICAgICAgICAgICAgZmluYWwgTGlzdDxQYXRoU2VnbWVudD4gcHMgPSBVcmlDb21wb25lbnQuZGVjb2RlUGF0aCh1cmksIHRydWUpOworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1wcyA9IHBzLmdldCgyKS5nZXRNYXRyaXhQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYSA9IG1wcy5nZXQoImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYS5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieiIsIGEuZ2V0KDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInp6IiwgYS5nZXQoMSkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGIgPSBtcHMuZ2V0KCJiIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInkiLCBiLmdldCgwKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LnJlcGxhY2VNYXRyaXhQYXJhbSgiYSIsICJfel8iLCAiX3p6XyIpLmJ1aWxkKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhdGhTZWdtZW50PiBwcyA9IFVyaUNvbXBvbmVudC5kZWNvZGVQYXRoKHVyaSwgdHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbXBzID0gcHMuZ2V0KDIpLmdldE1hdHJpeFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhID0gbXBzLmdldCgiYSIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBhLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJfel8iLCBhLmdldCgwKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJfenpfIiwgYS5nZXQoMSkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGIgPSBtcHMuZ2V0KCJiIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInkiLCBiLmdldCgwKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gSmVyc2V5VXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M7YT14O2I9eSIpLnJlcGxhY2VNYXRyaXhQYXJhbSgiYSIsICJ6IiwgInp6IikKKyAgICAgICAgICAgICAgICAgICAgLm1hdHJpeFBhcmFtKCJjIiwgImMiKS5wYXRoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkIikuYnVpbGQoKTsKKworICAgICAgICAgICAgZmluYWwgTGlzdDxQYXRoU2VnbWVudD4gcHMgPSBVcmlDb21wb25lbnQuZGVjb2RlUGF0aCh1cmksIHRydWUpOworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1wcyA9IHBzLmdldCgyKS5nZXRNYXRyaXhQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYSA9IG1wcy5nZXQoImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYS5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieiIsIGEuZ2V0KDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInp6IiwgYS5nZXQoMSkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGIgPSBtcHMuZ2V0KCJiIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInkiLCBiLmdldCgwKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYyA9IG1wcy5nZXQoImMiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYy5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYyIsIGMuZ2V0KDApKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBKZXJzZXlVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hO3c9MTIzO3E9MTUvYi9jO2E9eDtiPXkiKS5yZXBsYWNlTWF0cml4UGFyYW0oImEiLAorICAgICAgICAgICAgICAgICAgICAieiIsICJ6eiIpLm1hdHJpeFBhcmFtKCJjIiwgImMiKS5wYXRoKCJkIikuYnVpbGQoKTsKKworICAgICAgICAgICAgZmluYWwgTGlzdDxQYXRoU2VnbWVudD4gcHMgPSBVcmlDb21wb25lbnQuZGVjb2RlUGF0aCh1cmksIHRydWUpOworICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1wcyA9IHBzLmdldCgwKS5nZXRNYXRyaXhQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB3ID0gbXBzLmdldCgidyIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCB3LnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjMiLCB3LmdldCgwKSk7CisKKyAgICAgICAgICAgIHcgPSBtcHMuZ2V0KCJxIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIHcuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjE1Iiwgdy5nZXQoMCkpOworCisgICAgICAgICAgICBtcHMgPSBwcy5nZXQoMikuZ2V0TWF0cml4UGFyYW1ldGVycygpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGEgPSBtcHMuZ2V0KCJhIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGEuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInoiLCBhLmdldCgwKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ6eiIsIGEuZ2V0KDEpKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBiID0gbXBzLmdldCgiYiIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBiLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ5IiwgYi5nZXQoMCkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGMgPSBtcHMuZ2V0KCJjIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImMiLCBjLmdldCgwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTWF0cml4UGFyYW1zRW1wdHkoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdWJ1ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5yZXBsYWNlTWF0cml4UGFyYW0oImEiLCAieiIsICJ6eiIpOworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LmJ1aWxkKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhdGhTZWdtZW50PiBwcyA9IFVyaUNvbXBvbmVudC5kZWNvZGVQYXRoKHVyaSwgdHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbXBzID0gcHMuZ2V0KDIpLmdldE1hdHJpeFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhID0gbXBzLmdldCgiYSIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBhLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ6IiwgYS5nZXQoMCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygienoiLCBhLmdldCgxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTWF0cml4UGFyYW1zRW5jb2RlZCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVidSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5yZXBsYWNlTWF0cml4KCJsaW1pdD0xMDtzcWw9c2VsZWN0KyorZnJvbSt1c2VycyIpOworICAgICAgICB1YnUucmVwbGFjZU1hdHJpeFBhcmFtKCJsaW1pdCIsIDEwMCk7CisKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IHVidS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3QvO2xpbWl0PTEwMDtzcWw9c2VsZWN0KyorZnJvbSt1c2VycyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hdHJpeFBhcmFtc1dpdGhUaGVTYW1lTmFtZSgpIHsKKyAgICAgICAgVXJpQnVpbGRlciBmaXJzdCA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL3d3dy5jb20vIikucmVwbGFjZU1hdHJpeFBhcmFtKCJleGFtcGxlIiwgIm9uZSIsICJ0d28iKTsKKyAgICAgICAgZmlyc3QgPSBmaXJzdC5wYXRoKCIvY2hpbGQiKTsKKyAgICAgICAgZmlyc3QgPSBmaXJzdC5yZXBsYWNlTWF0cml4UGFyYW0oImV4YW1wbGUiLCAiYW5vdGhlciIpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly93d3cuY29tLztleGFtcGxlPW9uZTtleGFtcGxlPXR3by9jaGlsZDtleGFtcGxlPWFub3RoZXIiLCBmaXJzdC5idWlsZCgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hdHJpeFBhcmFtc1dpdGhUaGVEaWZmZXJlbnROYW1lKCkgeworICAgICAgICBVcmlCdWlsZGVyIGZpcnN0ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vd3d3LmNvbS8iKS5yZXBsYWNlTWF0cml4UGFyYW0oImV4YW1wbGUiLCAib25lIiwgInR3byIpOworICAgICAgICBmaXJzdCA9IGZpcnN0LnBhdGgoIi9jaGlsZCIpOworICAgICAgICBmaXJzdCA9IGZpcnN0LnJlcGxhY2VNYXRyaXhQYXJhbSgib3RoZXIiLCAiYW5vdGhlciIpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly93d3cuY29tLztleGFtcGxlPW9uZTtleGFtcGxlPXR3by9jaGlsZDtvdGhlcj1hbm90aGVyIiwgZmlyc3QuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUXVlcnkoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15IikucmVwbGFjZVF1ZXJ5KCJ4PWEmeT1iIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/eD1hJnk9YiIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkRW5jb2RlZFF1ZXJ5KCkgeworICAgICAgICBVUkkgdSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoIiIpLnF1ZXJ5UGFyYW0oInkiLCAiMSAlMkIgMiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiP3k9MSslMkIrMiIpLCB1KTsKKworICAgICAgICAvLyBJc3N1ZSAyMTYKKyAgICAgICAgdSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoIi97eH0ve3l9L3t6fS97eH0iKS5idWlsZEZyb21FbmNvZGVkKCIleHkiLCAiICIsICI9Iik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyUyNXh5LyUyMC89LyUyNXh5IiksIHUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VRdWVyeVBhcmFtcygpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1YnUgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15IikucmVwbGFjZVF1ZXJ5UGFyYW0oImEiLCAieiIsICJ6eiIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImMiLCAiYyIpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSB1YnUuYnVpbGQoKTsKKworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHFwcyA9IFVyaUNvbXBvbmVudC5kZWNvZGVRdWVyeSh1cmksIHRydWUpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGEgPSBxcHMuZ2V0KCJhIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGEuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInoiLCBhLmdldCgwKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ6eiIsIGEuZ2V0KDEpKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBiID0gcXBzLmdldCgiYiIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBiLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ5IiwgYi5nZXQoMCkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGMgPSBxcHMuZ2V0KCJjIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImMiLCBjLmdldCgwKSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LnJlcGxhY2VRdWVyeVBhcmFtKCJhIiwgIl96XyIsICJfenpfIikuYnVpbGQoKTsKKworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHFwcyA9IFVyaUNvbXBvbmVudC5kZWNvZGVRdWVyeSh1cmksIHRydWUpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGEgPSBxcHMuZ2V0KCJhIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGEuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIl96XyIsIGEuZ2V0KDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIl96el8iLCBhLmdldCgxKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYiA9IHFwcy5nZXQoImIiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYi5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieSIsIGIuZ2V0KDApKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjID0gcXBzLmdldCgiYyIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBjLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjIiwgYy5nZXQoMCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaXNzdWUgMjU3IC0gcGFyYW0gaXMgcmVtb3ZlZCBhZnRlciBzZXR0aW5nIGl0IHRvIG51bGwKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgVVJJIHUxID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucXVlcnlQYXJhbSgieCIsICIxMCIpCisgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlUXVlcnlQYXJhbSgieCIsIChPYmplY3RbXSkgbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh1MS50b1N0cmluZygpLmVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikpOworCisgICAgICAgICAgICBmaW5hbCBVUkkgdTIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5xdWVyeVBhcmFtKCJ4IiwgIjEwIikucmVwbGFjZVF1ZXJ5UGFyYW0oIngiKS5idWlsZCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodTIudG9TdHJpbmcoKS5lcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlzc3VlIDI1NyAtIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnF1ZXJ5UGFyYW0oIngiLCAiMTAiKS5yZXBsYWNlUXVlcnlQYXJhbSgieCIsICIxIiwgbnVsbCwgIjIiKS5idWlsZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIGNhdWdodCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNhdWdodCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VRdWVyeVBhcmFtc0VtcHR5KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVidSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucmVwbGFjZVF1ZXJ5UGFyYW0oImEiLCAieiIsICJ6eiIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImMiLCAiYyIpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSB1YnUuYnVpbGQoKTsKKworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHFwcyA9IFVyaUNvbXBvbmVudC5kZWNvZGVRdWVyeSh1cmksIHRydWUpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGEgPSBxcHMuZ2V0KCJhIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGEuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInoiLCBhLmdldCgwKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ6eiIsIGEuZ2V0KDEpKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjID0gcXBzLmdldCgiYyIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBjLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjIiwgYy5nZXQoMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVF1ZXJ5UGFyYW1zRW5jb2RlZDEoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1YnUgPSBVcmlCdWlsZGVyLmZyb21VcmkobmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdC8iKSkucmVwbGFjZVF1ZXJ5KCJsaW1pdD0xMCZzcWw9c2VsZWN0KyorZnJvbSt1c2VycyIpOworICAgICAgICB1YnUucmVwbGFjZVF1ZXJ5UGFyYW0oImxpbWl0IiwgMTAwKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdC8/bGltaXQ9MTAwJnNxbD1zZWxlY3QrJTJBK2Zyb20rdXNlcnMiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUXVlcnlQYXJhbXNFbmNvZGVkMigpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVidSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKCJodHRwOi8vbG9jYWxob3N0IikpLnJlcGxhY2VRdWVyeSgibGltaXQ9MTAmc3FsPXNlbGVjdCsqK2Zyb20rdXNlcnMiKTsKKyAgICAgICAgdWJ1LnJlcGxhY2VRdWVyeVBhcmFtKCJsaW1pdCIsIDEwMCk7CisKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IHVidS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3QvP2xpbWl0PTEwMCZzcWw9c2VsZWN0KyUyQStmcm9tK3VzZXJzIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVF1ZXJ5UGFyYW1zRW5jb2RlZDMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1YnUgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvIikucmVwbGFjZVF1ZXJ5KCJsaW1pdD0xMCZzcWw9c2VsZWN0KyorZnJvbSt1c2VycyIpOworICAgICAgICB1YnUucmVwbGFjZVF1ZXJ5UGFyYW0oImxpbWl0IiwgMTAwKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdC8/bGltaXQ9MTAwJnNxbD1zZWxlY3QrJTJBK2Zyb20rdXNlcnMiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUXVlcnlQYXJhbXNFbmNvZGVkNCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVidSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdCIpLnJlcGxhY2VRdWVyeSgibGltaXQ9MTAmc3FsPXNlbGVjdCsqK2Zyb20rdXNlcnMiKTsKKyAgICAgICAgdWJ1LnJlcGxhY2VRdWVyeVBhcmFtKCJsaW1pdCIsIDEwMCk7CisKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IHVidS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3QvP2xpbWl0PTEwMCZzcWw9c2VsZWN0KyUyQStmcm9tK3VzZXJzIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUZyYWdtZW50KCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/YT14JmI9eSNmcmFnIikuZnJhZ21lbnQoIm1lbnQiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15I21lbnQiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlVXJpKCkgeworICAgICAgICBmaW5hbCBVUkkgdSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9ib2JAbG9jYWxob3N0OjgwODAvYS9iL2M/YT14JmI9eSNmcmFnIik7CisKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSh1KS51cmkoVVJJLmNyZWF0ZSgiaHR0cHM6Ly9ib2JAbG9jYWxob3N0OjgwODAiKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwczovL2JvYkBsb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15I2ZyYWciKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkodSkudXJpKFVSSS5jcmVhdGUoImh0dHBzOi8vc3VlQGxvY2FsaG9zdDo4MDgwIikpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cHM6Ly9zdWVAbG9jYWxob3N0OjgwODAvYS9iL2M/YT14JmI9eSNmcmFnIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKHUpLnVyaShVUkkuY3JlYXRlKCJodHRwczovL3N1ZUBsb2NhbGhvc3Q6OTA5MCIpKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHBzOi8vc3VlQGxvY2FsaG9zdDo5MDkwL2EvYi9jP2E9eCZiPXkjZnJhZyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSh1KS51cmkoVVJJLmNyZWF0ZSgiL3gveS96IikpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2JvYkBsb2NhbGhvc3Q6ODA4MC94L3kvej9hPXgmYj15I2ZyYWciKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkodSkudXJpKFVSSS5jcmVhdGUoIj94PWEmYj15IikpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2JvYkBsb2NhbGhvc3Q6ODA4MC9hL2IvYz94PWEmYj15I2ZyYWciKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkodSkudXJpKFVSSS5jcmVhdGUoIiNtZW50IikpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2JvYkBsb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15I21lbnQiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY2hlbWVTcGVjaWZpY1BhcnQoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1ID0gVVJJLmNyZWF0ZSgiaHR0cDovL2JvYkBsb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15I2ZyYWciKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKHUpLnNjaGVtZVNwZWNpZmljUGFydCgiLy9zdWVAcmVtb3RlaG9zdDo5MDkwL3gveS96P3g9YSZ5PWIiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9zdWVAcmVtb3RlaG9zdDo5MDkwL3gveS96P3g9YSZ5PWIjZnJhZyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZFBhdGgoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoImEvYi9jIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKS5wYXRoKCJhL2IvYyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCIvYS9iL2MiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jLyIpLnBhdGgoIi8iKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYy8iKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYy8iKS5wYXRoKCIveC95L3oiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYy94L3kveiIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgiL3gveS96IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBhdGgoIngveS96IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBhdGgoIi8iKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYy8iKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBhdGgoIiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYSUyMC9iJTIwL2MlMjAiKS5wYXRoKCIveCAveSAveiAiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hJTIwL2IlMjAvYyUyMC94JTIwL3klMjAveiUyMCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZFNlZ21lbnQoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnNlZ21lbnQoImEvYi9jO3giKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hJTJGYiUyRmMlM0J4IiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2hpdGVzcGFjZXNJblBhdGhQYXJhbXMoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODAvYWFhL3sgIHBhcjF9LyIpLnBhdGgoImJiYi97ICBwYXIyICAgfS9jY2MiKQorICAgICAgICAgICAgICAgIC5idWlsZCgiMXBhcmFtIiwgIjJwYXJhbSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MC9hYWEvMXBhcmFtL2JiYi8ycGFyYW0vY2NjIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2hpdGVzcGFjZXNJblBhdGhQYXJhbXNCeVJlc29sdmUoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODAvYWFhL3sgIHBhcjF9LyIpLnBhdGgoImJiYi97ICBwYXIyICAgfS9jY2MiKQorICAgICAgICAgICAgICAgIC5idWlsZCgiMXBhcmFtIiwgIjJwYXJhbSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MC9hYWEvMXBhcmFtL2JiYi8ycGFyYW0vY2NjIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2hpdGVzcGFjZXNJblBhdGhQYXJhbXMyKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwL2FhYS97ICBwYXIxfSIpLnBhdGgoImJiYi97ICBwYXIyIDogXFxkKiAgfS9jY2MiKQorICAgICAgICAgICAgICAgIC5idWlsZCgiMXBhcmFtIiwgIjIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODAvYWFhLzFwYXJhbS9iYmIvMi9jY2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlc0luUGF0aFBhcmFtczJCeVJlc29sdmUoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODAvYWFhL3sgIHBhcjF9IikucGF0aCgiYmJiL3sgIHBhcjIgOiBcXGQqICB9L2NjYyIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgicGFyMSIsICIxcGFyYW0iKS5yZXNvbHZlVGVtcGxhdGUoInBhcjIiLCAiMiIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwL2FhYS8xcGFyYW0vYmJiLzIvY2NjIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2hpdGVzcGFjZXNJblF1ZXJ5UGFyYW1zKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwL2FhYT9hPXsgICAgICBwYXJhbSAgIDogXFwuZCogIH0iKS5idWlsZCgiNSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MC9hYWE/YT01IiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2hpdGVzcGFjZXNJblF1ZXJ5UGFyYW1zQnlSZXNvbHZlKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwL2FhYT9hPXsgICAgICBwYXJhbSAgIDogXFwuZCogIH0iKS5yZXNvbHZlVGVtcGxhdGUoInBhcmFtIiwgIjUiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MC9hYWE/YT01IiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVGcm9tVXJpKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJhL2IvYyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYS9iL2MiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImEvYi9jIikucGF0aCgiZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYS9iL2MvZCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiYS9iL2MvIikucGF0aCgiZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYS9iL2MvZCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiYS9iL2MiKS5wYXRoKCIvZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYS9iL2MvZCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiYS9iL2MvIikucGF0aCgiL2QiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImEvYi9jL2QiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoIiIpLnF1ZXJ5UGFyYW0oIngiLCAieSIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiP3g9eSIpLCB1cmkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVmcm9tUGF0aCgpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImEvYi9jIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJhL2IvYyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImEvYi9jIikucGF0aCgiZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYS9iL2MvZCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImEvYi9jLyIpLnBhdGgoImQiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImEvYi9jL2QiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJhL2IvYyIpLnBhdGgoIi9kIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJhL2IvYy9kIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiYS9iL2MvIikucGF0aCgiL2QiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImEvYi9jL2QiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCIiKS5xdWVyeVBhcmFtKCJ4IiwgInkiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoIj94PXkiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRRdWVyeVBhcmFtcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/YT14JmI9eSIpLnF1ZXJ5UGFyYW0oImMiLCAieiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jP2E9eCZiPXkmYz16IiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/YT14JmI9eSIpLnF1ZXJ5UGFyYW0oImM9ICIsICJ6PSAiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15JmMlM0QrPXolM0QrIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKG5ldyBVUkkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKSkucXVlcnlQYXJhbSgiYyIsICJ6IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvP2M9eiIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKSkucXVlcnlQYXJhbSgiYyIsICJ6IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvP2M9eiIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpLnF1ZXJ5UGFyYW0oImMiLCAieiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLz9jPXoiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnF1ZXJ5UGFyYW0oImMiLCAieiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLz9jPXoiKSwgdXJpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucXVlcnlQYXJhbSgibmFtZSIsICJ4IiwgbnVsbCkuYnVpbGQoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBleHBlY3RlZCwgbW92ZSBvbi4uLgorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kTWF0cml4UGFyYW1zKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M7YT14O2I9eSIpLm1hdHJpeFBhcmFtKCJjIiwgInoiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYzthPXg7Yj15O2M9eiIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jO2E9eDtiPXkiKS5tYXRyaXhQYXJhbSgiYz0vIDsiLCAiej0vIDsiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYzthPXg7Yj15O2MlM0QlMkYlMjAlM0I9eiUzRCUyRiUyMCUzQiIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZFBhdGhBbmRNYXRyaXhQYXJhbXMoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKS5wYXRoKAorICAgICAgICAgICAgICAgICJhIikubWF0cml4UGFyYW0oIngiLCAiZm9vIikubWF0cml4UGFyYW0oInkiLCAiYmFyIikucGF0aCgiYiIpLm1hdHJpeFBhcmFtKCJ4IiwgImZvbyIpLm1hdHJpeFBhcmFtKCJ5IiwgImJhciIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2E7eD1mb287eT1iYXIvYjt4PWZvbzt5PWJhciIpLCB1cmkpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1ldGhvZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImxvY2F0b3IiKQorICAgICAgICBwdWJsaWMgT2JqZWN0IGxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXBwZW5kUGF0aCgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBVUkkgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChSZXNvdXJjZS5jbGFzcykuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9yZXNvdXJjZSIpLCB1Yik7CisKKyAgICAgICAgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChSZXNvdXJjZS5jbGFzcywgImdldCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvbWV0aG9kIiksIHViKTsKKworICAgICAgICBmaW5hbCBNZXRob2QgZ2V0ID0gUmVzb3VyY2UuY2xhc3MuZ2V0TWV0aG9kKCJnZXQiKTsKKyAgICAgICAgZmluYWwgTWV0aG9kIGxvY2F0b3IgPSBSZXNvdXJjZS5jbGFzcy5nZXRNZXRob2QoImxvY2F0b3IiKTsKKyAgICAgICAgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChnZXQpLnBhdGgobG9jYXRvcikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9tZXRob2QvbG9jYXRvciIpLCB1Yik7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlL3tpZH0iKQorICAgIGNsYXNzIFJlc291cmNlV2l0aFRlbXBsYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJtZXRob2Qve2lkMX0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsb2NhdG9yL3tpZDJ9IikKKyAgICAgICAgcHVibGljIE9iamVjdCBsb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVdpdGhUZW1wbGF0ZUFwcGVuZFBhdGgoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgVVJJIHViID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZSIpLnBhdGgoUmVzb3VyY2VXaXRoVGVtcGxhdGUuY2xhc3MpLmJ1aWxkKCJmb28iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9yZXNvdXJjZS9mb28iKSwgdWIpOworCisgICAgICAgIHViID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZSIpLnBhdGgoUmVzb3VyY2VXaXRoVGVtcGxhdGUuY2xhc3MsICJnZXQiKS5idWlsZCgiZm9vIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvbWV0aG9kL2ZvbyIpLCB1Yik7CisKKyAgICAgICAgZmluYWwgTWV0aG9kIGdldCA9IFJlc291cmNlV2l0aFRlbXBsYXRlLmNsYXNzLmdldE1ldGhvZCgiZ2V0Iik7CisgICAgICAgIGZpbmFsIE1ldGhvZCBsb2NhdG9yID0gUmVzb3VyY2VXaXRoVGVtcGxhdGUuY2xhc3MuZ2V0TWV0aG9kKCJsb2NhdG9yIik7CisgICAgICAgIHViID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZSIpLnBhdGgoZ2V0KS5wYXRoKGxvY2F0b3IpLmJ1aWxkKCJmb28iLCAiYmFyIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvbWV0aG9kL2Zvby9sb2NhdG9yL2JhciIpLCB1Yik7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlL3tpZDogLit9IikKKyAgICBjbGFzcyBSZXNvdXJjZVdpdGhUZW1wbGF0ZVJlZ2V4IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJtZXRob2Qve2lkMTogLit9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibG9jYXRvci97aWQyOiAuK30iKQorICAgICAgICBwdWJsaWMgT2JqZWN0IGxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlV2l0aFRlbXBsYXRlUmVnZXhBcHBlbmRQYXRoKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIFVSSSB1YiA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UiKS5wYXRoKFJlc291cmNlV2l0aFRlbXBsYXRlUmVnZXguY2xhc3MpLmJ1aWxkKCJmb28iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9yZXNvdXJjZS9mb28iKSwgdWIpOworCisgICAgICAgIHViID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZSIpLnBhdGgoUmVzb3VyY2VXaXRoVGVtcGxhdGVSZWdleC5jbGFzcywgImdldCIpLmJ1aWxkKCJmb28iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9tZXRob2QvZm9vIiksIHViKTsKKworICAgICAgICBmaW5hbCBNZXRob2QgZ2V0ID0gUmVzb3VyY2VXaXRoVGVtcGxhdGVSZWdleC5jbGFzcy5nZXRNZXRob2QoImdldCIpOworICAgICAgICBmaW5hbCBNZXRob2QgbG9jYXRvciA9IFJlc291cmNlV2l0aFRlbXBsYXRlUmVnZXguY2xhc3MuZ2V0TWV0aG9kKCJsb2NhdG9yIik7CisgICAgICAgIHViID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZSIpLnBhdGgoZ2V0KS5wYXRoKGxvY2F0b3IpLmJ1aWxkKCJmb28iLCAiYmFyIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvbWV0aG9kL2Zvby9sb2NhdG9yL2JhciIpLCB1Yik7CisgICAgfQorCisgICAgaW50ZXJmYWNlIEdlbmVyaWNJbnRlcmZhY2U8VCwgVT4geworCisgICAgICAgIFQgZmluZChVIHUpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZS8iKQorICAgIGNsYXNzIFJlc291cmNlV2l0aEdlbmVyaWNJbnRlcmZhY2UgaW1wbGVtZW50cyBHZW5lcmljSW50ZXJmYWNlPE9iamVjdCwgU3RyaW5nPiB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2lkfSIpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGZpbmQoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVdpdGhHZW5lcmljSW50ZXJmYWNlQXBwZW5kUGF0aCgpIHsKKyAgICAgICAgZmluYWwgVVJJIHViID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZSIpLnBhdGgoUmVzb3VyY2VXaXRoR2VuZXJpY0ludGVyZmFjZS5jbGFzcywgImZpbmQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgiZm9vIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvZm9vIiksIHViKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFRlbXBsYXRlcygpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikuYnVpbGQoIngiLCAieSIsICJ6Iik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jL3gveS96L3giKSwgdXJpKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImZvbyIsICJ4Iik7CisgICAgICAgIG0ucHV0KCJiYXIiLCAieSIpOworICAgICAgICBtLnB1dCgiYmF6IiwgInoiKTsKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5idWlsZEZyb21NYXAobSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jL3gveS96L3giKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFRlbXBsYXRlc0J5UmVzb2x2ZSgpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG0ucHV0KCJmb28iLCAieCIpOworICAgICAgICBtLnB1dCgiYmFyIiwgInkiKTsKKyAgICAgICAgbS5wdXQoImJheiIsICJ6Iik7CisKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikucmVzb2x2ZVRlbXBsYXRlcyhtKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jL3gveS96L3giKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFRlbXBsYXRlc1dpdGhOYW1lQXV0aG9yaXR5KCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8veF95LmNvbTo4MDgwL2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikuYnVpbGQoIngiLCAieSIsICJ6Iik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL3hfeS5jb206ODA4MC9hL2IvYy94L3kvei94IiksIHVyaSk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG0ucHV0KCJmb28iLCAieCIpOworICAgICAgICBtLnB1dCgiYmFyIiwgInkiKTsKKyAgICAgICAgbS5wdXQoImJheiIsICJ6Iik7CisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL3hfeS5jb206ODA4MC9hL2IvYyIpLnBhdGgoIi97Zm9vfS97YmFyfS97YmF6fS97Zm9vfSIpLmJ1aWxkRnJvbU1hcChtKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8veF95LmNvbTo4MDgwL2EvYi9jL3gveS96L3giKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFRlbXBsYXRlc1dpdGhOYW1lQXV0aG9yaXR5QnlSZXNvbHZlKCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImZvbyIsICJ4Iik7CisgICAgICAgIG0ucHV0KCJiYXIiLCAieSIpOworICAgICAgICBtLnB1dCgiYmF6IiwgInoiKTsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL3hfeS5jb206ODA4MC9hL2IvYyIpCisgICAgICAgICAgICAgICAgLnBhdGgoIi97Zm9vfS97YmFyfS97YmF6fS97Zm9vfSIpLmJ1aWxkRnJvbU1hcChtKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8veF95LmNvbTo4MDgwL2EvYi9jL3gveS96L3giKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZEZyb21NYXAoKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtYXBzLnB1dCgieCIsIG51bGwpOworICAgICAgICBtYXBzLnB1dCgieSIsICIvcGF0aC1hYnNvbHV0ZS90ZXN0MSIpOworICAgICAgICBtYXBzLnB1dCgieiIsICJmcmVkQGV4YW1wbGUuY29tIik7CisgICAgICAgIG1hcHMucHV0KCJ3IiwgInBhdGgtcm9vdGxlc3MvdGVzdDIiKTsKKyAgICAgICAgbWFwcy5wdXQoInUiLCAiZXh0cmEiKTsKKworICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVXJpQnVpbGRlci5mcm9tUGF0aCgiIikucGF0aCgie3d9L3t4fS97eX0ve3p9L3t4fSIpLmJ1aWxkRnJvbUVuY29kZWRNYXAobWFwcykpOworCisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNhdWdodCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGcm9tTWFwQnlSZXNvbHZlKCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbWFwcy5wdXQoIngiLCBudWxsKTsKKyAgICAgICAgbWFwcy5wdXQoInkiLCAiL3BhdGgtYWJzb2x1dGUvdGVzdDEiKTsKKyAgICAgICAgbWFwcy5wdXQoInoiLCAiZnJlZEBleGFtcGxlLmNvbSIpOworICAgICAgICBtYXBzLnB1dCgidyIsICJwYXRoLXJvb3RsZXNzL3Rlc3QyIik7CisgICAgICAgIG1hcHMucHV0KCJ1IiwgImV4dHJhIik7CisKKyAgICAgICAgYm9vbGVhbiBjYXVnaHQgPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFVyaUJ1aWxkZXIuZnJvbVBhdGgoIiIpLnBhdGgoInt3fS97eH0ve3l9L3t6fS97eH0iKS5yZXNvbHZlVGVtcGxhdGVzKG1hcHMpLmJ1aWxkKCkpOworCisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNhdWdodCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRRdWVyeVRlbXBsYXRlcygpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucXVlcnlQYXJhbSgiYSIsICJ7Yn0iKS5idWlsZCgiPSsmJXh4JTIwIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jP2E9JTNEJTJCJTI2JTI1eHglMjUyMCIpLCB1cmkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiYiIsICI9KyYleHglMjAiKTsKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5xdWVyeVBhcmFtKCJhIiwgIntifSIpLmJ1aWxkRnJvbU1hcChtKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/YT0lM0QlMkIlMjYlMjV4eCUyNTIwIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGcm9tRW5jb2RlZFF1ZXJ5VGVtcGxhdGVzKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5xdWVyeVBhcmFtKCJhIiwgIntifSIpLmJ1aWxkRnJvbUVuY29kZWQoIj0rJiV4eCUyMCIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPSUzRCUyQiUyNiUyNXh4JTIwIiksIHVyaSk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG0ucHV0KCJiIiwgIj0rJiV4eCUyMCIpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnF1ZXJ5UGFyYW0oImEiLCAie2J9IikuYnVpbGRGcm9tRW5jb2RlZE1hcChtKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/YT0lM0QlMkIlMjYlMjV4eCUyMCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkRnJvbUVuY29kZWRTbGFzaEluUGFyYW1WYWx1ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvQS9CIiwgVXJpQnVpbGRlci5mcm9tVXJpKCIve3BhcmFtfSIpLmJ1aWxkRnJvbUVuY29kZWQoIkEvQiIpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUZW1wbGF0ZUZyb21FbmNvZGVkUXVlcnlUZW1wbGF0ZXMoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnF1ZXJ5UGFyYW0oImEiLCAie2J9IikKKyAgICAgICAgICAgICAgICAucmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWQoImIiLCAiPSsmJXh4JTIwIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/YT0lM0QlMkIlMjYlMjV4eCUyMCIpLCB1cmkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiYiIsICI9KyYleHglMjAiKTsKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5xdWVyeVBhcmFtKCJhIiwgIntifSIpLnJlc29sdmVUZW1wbGF0ZXNGcm9tRW5jb2RlZChtKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPSUzRCUyQiUyNiUyNXh4JTIwIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGcmFnbWVudFRlbXBsYXRlcygpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikuZnJhZ21lbnQoIntmb299IikKKyAgICAgICAgICAgICAgICAuYnVpbGQoIngiLCAieSIsICJ6Iik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jL3gveS96L3gjeCIpLCB1cmkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiZm9vIiwgIngiKTsKKyAgICAgICAgbS5wdXQoImJhciIsICJ5Iik7CisgICAgICAgIG0ucHV0KCJiYXoiLCAieiIpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBhdGgoIi97Zm9vfS97YmFyfS97YmF6fS97Zm9vfSIpLmZyYWdtZW50KCJ7Zm9vfSIpCisgICAgICAgICAgICAgICAgLmJ1aWxkRnJvbU1hcChtKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oveCN4IiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlRnJvbUZyYWdtZW50VGVtcGxhdGVzKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5mcmFnbWVudCgie2Zvb30iKQorICAgICAgICAgICAgICAgIC5yZXNvbHZlVGVtcGxhdGUoImZvbyIsICJ4IikucmVzb2x2ZVRlbXBsYXRlKCJiYXIiLCAieSIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgiYmF6IiwgInoiKS5idWlsZCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jL3gveS96L3gjeCIpLCB1cmkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiZm9vIiwgIngiKTsKKyAgICAgICAgbS5wdXQoImJhciIsICJ5Iik7CisgICAgICAgIG0ucHV0KCJiYXoiLCAieiIpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBhdGgoIi97Zm9vfS97YmFyfS97YmF6fS97Zm9vfSIpLmZyYWdtZW50KCJ7Zm9vfSIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZXMobSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oveCN4IiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcGxhdGVzRGVmYXVsdFBvcnQoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5idWlsZCgieCIsICJ5IiwgInoiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0L2EvYi9jL3gveS96L3giKSwgdXJpKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImZvbyIsICJ4Iik7CisgICAgICAgIG0ucHV0KCJiYXIiLCAieSIpOworICAgICAgICBtLnB1dCgiYmF6IiwgInoiKTsKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0L2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikuYnVpbGRGcm9tTWFwKG0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3QvYS9iL2MveC95L3oveCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUZW1wbGF0ZXNEZWZhdWx0UG9ydCgpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC9hL2IvYyIpLnBhdGgoIi97Zm9vfS97YmFyfS97YmF6fS97Zm9vfSIpLnJlc29sdmVUZW1wbGF0ZSgiZm9vIiwgIngiKQorICAgICAgICAgICAgICAgIC5yZXNvbHZlVGVtcGxhdGUoImJhciIsICJ5IikucmVzb2x2ZVRlbXBsYXRlKCJiYXoiICsgIiIsICJ6IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0L2EvYi9jL3gveS96L3giKSwgdXJpKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImZvbyIsICJ4Iik7CisgICAgICAgIG0ucHV0KCJiYXIiLCAieSIpOworICAgICAgICBtLnB1dCgiYmF6IiwgInoiKTsKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0L2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikucmVzb2x2ZVRlbXBsYXRlcyhtKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3QvYS9iL2MveC95L3oveCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb25lKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHViID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vdXNlckBsb2NhbGhvc3Q6ODA4MC8/cXVlcnkjZnJhZ21lbnQiKS5wYXRoKCJhIik7CisgICAgICAgIGZpbmFsIFVSSSBmdWxsID0gdWIuY2xvbmUoKS5wYXRoKCJiIikuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgVVJJIGJhc2UgPSB1Yi5idWlsZCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL3VzZXJAbG9jYWxob3N0OjgwODAvYT9xdWVyeSNmcmFnbWVudCIpLCBiYXNlKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vdXNlckBsb2NhbGhvc3Q6ODA4MC9hL2I/cXVlcnkjZnJhZ21lbnQiKSwgZnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgeworICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpQnVpbGRlci5mcm9tUGF0aChudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNhdWdodCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2F1Z2h0KTsKKworICAgICAgICBjYXVnaHQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaSgoVVJJKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNhdWdodCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2F1Z2h0KTsKKworICAgICAgICBjYXVnaHQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaSgoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNhdWdodCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2F1Z2h0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlFbmNvZGluZygpIHsKKyAgICAgICAgZmluYWwgVVJJIGV4cGVjdGVkID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyU1RSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvXiIpLmJ1aWxkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL14iKS5idWlsZCgpKTsKKyAgICB9CisKKyAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIEpFUlNFWS0xMzI0IGZpeC4KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVXJpVGVtcGxhdGVFbmNvZGVkQXNQYXRoKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cCUyMGZ0cCUyMHhtbC8vOjg4ODo4ODgvMTo4MDgwOjgwIiksCisgICAgICAgICAgICAgICAgbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoImh0dHAgZnRwIHhtbC8vOjg4ODo4ODgvMTo4MDgwOjgwIikuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVXaXRob3V0VmFsdWUoKSB7CisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCIve2F9L3tifSIpLmJ1aWxkRnJvbUVuY29kZWQoImFWYWwiKTsKKworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjYXVnaHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvcnRWYWx1ZSgpIHsKKyAgICAgICAgYm9vbGVhbiBjYXVnaHQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3QiKS5wb3J0KC0yKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNhdWdodCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2F1Z2h0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3J0U2V0dGluZygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBVUkkgdXJpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJodHRwOi8vbG9jYWxob3N0IikucG9ydCg4MDgwKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKG5ldyBVUkkoImh0dHA6Ly9sb2NhbGhvc3QiKSkucG9ydCg4MDgwKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoODA4MCkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkobmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdC8iKSkucG9ydCg4MDgwKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0VmFsdWUoKSB7CisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0IikuaG9zdCgiIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjYXVnaHQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNhdWdodCk7CisKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoIiIpLmhvc3QoImFiYyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiLy9hYmMiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCIiKS5ob3N0KCJhYmMiKS5ob3N0KG51bGwpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiIiksIHVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IGhhcyBiZWVuIHJld3JpdHRlbiBhcyBwYXJ0IG9mIGZpeCBmb3IgSkVSU0VZLTIzNzguCisgICAgICogVGhlIG5ldyBwdXJwb3NlIG9mIHRoaXMgdGVzdCBpcyB0byBkZW1vbnN0cmF0ZSBob3cgb2xkIGJlaGF2aW9yIG9mIFVyaUJ1aWxkZXIuYnVpbGQoKSBtZXRob2QKKyAgICAgKiB3cnQuIHVucmVzb2x2ZWQgdGVtcGxhdGVzIGNhbiBiZSBhY2hpZXZlZCB2aWEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlDb21wb25lbnQjZW5jb2RlVGVtcGxhdGVOYW1lcyhTdHJpbmcpfQorICAgICAqIG1ldGhvZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVUZW1wbGF0ZU5hbWVzKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZShVcmlDb21wb25lbnQuZW5jb2RlVGVtcGxhdGVOYW1lcyhVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKAorICAgICAgICAgICAgICAgICIve2F9L3tifSIpLnJlcGxhY2VRdWVyeSgicT17Y30iKS50b1RlbXBsYXRlKCkpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvJTdCYSU3RC8lN0JiJTdEP3E9JTdCYyU3RCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVRlbXBsYXRlVGVzdCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucGF0aCgie2F9IikucGF0aCgie2J9IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicXVlcnkiLCAie3F9Iik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlKCJhIiwgInBhcmFtLWEiKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoInEiLCAicGFyYW0tcSIpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImEiLCAiaWdub3JlZC1hIik7CisgICAgICAgIG0ucHV0KCJiIiwgInBhcmFtLWIiKTsKKyAgICAgICAgbS5wdXQoInEiLCAiaWdub3JlZC1xIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhcmFtLWEvcGFyYW0tYj9xdWVyeT1wYXJhbS1xIiksIHVyaUJ1aWxkZXIuYnVpbGRGcm9tTWFwKG0pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUZW1wbGF0ZUZyb21FbmNvZGVkVGVzdCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucGF0aCgie2F9IikucGF0aCgie2J9IikucGF0aCgie2N9IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicXVlcnkiLCAie3F9Iik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWQoImEiLCAieC95L3olM0YlMjAiKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGVGcm9tRW5jb2RlZCgicSIsICJxPyUyMCUyNiIpOworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZSgiYyIsICJwYXJhbWMxL3BhcmFtYzIiKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG0ucHV0KCJhIiwgImlnbm9yZWQtYSIpOworICAgICAgICBtLnB1dCgiYiIsICJwYXJhbS1iL2FhYSIpOworICAgICAgICBtLnB1dCgicSIsICJpZ25vcmVkLXEiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3gveS96JTNGJTIwL3BhcmFtLWIvYWFhL3BhcmFtYzElMkZwYXJhbWMyP3F1ZXJ5PXElM0YlMjAlMjYiLAorICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGRGcm9tRW5jb2RlZE1hcChtKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUZW1wbGF0ZVdpdGhvdXRFbmNvZGVkVGVzdCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucGF0aCgie2F9IikucGF0aCgie2J9IikucGF0aCgie2N9IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicXVlcnkiLCAie3F9Iik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlKCJhIiwgIngveS96JTNGJTIwIik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlKCJxIiwgInE/JTIwJTI2Iik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlKCJjIiwgInBhcmFtYzEvcGFyYW1jMiIpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImEiLCAiaWdub3JlZC1hIik7CisgICAgICAgIG0ucHV0KCJiIiwgInBhcmFtLWIvYWFhIik7CisgICAgICAgIG0ucHV0KCJxIiwgImlnbm9yZWQtcSIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAveCUyRnklMkZ6JTI1M0YlMjUyMC9wYXJhbS1iJTJGYWFhL3BhcmFtYzElMkZwYXJhbWMyP3F1ZXJ5PXElM0YlMjUyMCUyNTI2IiwKKyAgICAgICAgICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkRnJvbU1hcChtKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUZW1wbGF0ZVdpdGhFbmNvZGVkU2xhc2hUZXN0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoImEiLCAicGFyYW0tYS93aXRoU2xhc2giLCBmYWxzZSk7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlKCJiIiwgInBhcmFtLWIvd2l0aEVuY29kZWRTbGFzaCIsIHRydWUpOworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZSgicSIsICJwYXJhbS1xIiwgdHJ1ZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhcmFtLWEvd2l0aFNsYXNoL3BhcmFtLWIlMkZ3aXRoRW5jb2RlZFNsYXNoP3F1ZXJ5PXBhcmFtLXEiKSwKKyAgICAgICAgICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGVtcGxhdGVzVGVzdCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucGF0aCgie2F9IikucGF0aCgie2J9IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicXVlcnkiLCAie3F9Iik7CisKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoImEiLCAicGFyYW0tYSIpOworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZSgicSIsICJwYXJhbS1xIik7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgYnVpbGRNYXAucHV0KCJhIiwgImlnbm9yZWQtYSIpOworICAgICAgICBidWlsZE1hcC5wdXQoImIiLCAicGFyYW0tYiIpOworICAgICAgICBidWlsZE1hcC5wdXQoInEiLCAiaWdub3JlZC1xIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhcmFtLWEvcGFyYW0tYj9xdWVyeT1wYXJhbS1xIiksIHVyaUJ1aWxkZXIuYnVpbGRGcm9tTWFwKGJ1aWxkTWFwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGVtcGxhdGVzRnJvbUVuY29kZWRUZXN0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKS5wYXRoKCJ7Y30iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc29sdmVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoImEiLCAieC95L3olM0YlMjAiKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoInEiLCAicT8lMjAlMjYiKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoImMiLCAicGFyYW1jMS9wYXJhbWMyIik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlc0Zyb21FbmNvZGVkKHJlc29sdmVNYXApOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGJ1aWxkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIGJ1aWxkTWFwLnB1dCgiYiIsICJwYXJhbS1iL2FhYSIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAveC95L3olM0YlMjAvcGFyYW0tYi9hYWEvcGFyYW1jMS9wYXJhbWMyP3F1ZXJ5PXElM0YlMjAlMjYiLAorICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGRGcm9tRW5jb2RlZE1hcChidWlsZE1hcCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGVtcGxhdGVzRnJvbU5vdEVuY29kZWRUZXN0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKS5wYXRoKCJ7Y30iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc29sdmVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoImEiLCAieC95L3olM0YlMjAiKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoInEiLCAicT8lMjAlMjYiKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoImMiLCAicGFyYW1jMS9wYXJhbWMyIik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlcyhyZXNvbHZlTWFwKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBidWlsZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBidWlsZE1hcC5wdXQoImIiLCAicGFyYW0tYi9hYWEiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3glMkZ5JTJGeiUyNTNGJTI1MjAvcGFyYW0tYiUyRmFhYS9wYXJhbWMxJTJGcGFyYW1jMj9xdWVyeT1xJTNGJTI1MjAlMjUyNiIsCisgICAgICAgICAgICAgICAgdXJpQnVpbGRlci5idWlsZEZyb21NYXAoYnVpbGRNYXApLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVRlbXBsYXRlc0VuY29kZVNsYXNoKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKS5wYXRoKCJ7Y30iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc29sdmVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoImEiLCAieC95L3olM0YlMjAiKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoInEiLCAicT8lMjAlMjYiKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoImMiLCAicGFyYW1jMS9wYXJhbWMyIik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlcyhyZXNvbHZlTWFwLCBmYWxzZSk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgYnVpbGRNYXAucHV0KCJiIiwgInBhcmFtLWIvYWFhIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC94L3kveiUyNTNGJTI1MjAvcGFyYW0tYi9hYWEvcGFyYW1jMS9wYXJhbWMyP3F1ZXJ5PXElM0YlMjUyMCUyNTI2IiwKKyAgICAgICAgICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkRnJvbU1hcChidWlsZE1hcCwgZmFsc2UpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVRlbXBsYXRlc1dpdGhFbmNvZGVkU2xhc2hUZXN0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiByZXNvbHZlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIHJlc29sdmVNYXAucHV0KCJhIiwgInBhcmFtLWEvd2l0aFNsYXNoIik7CisgICAgICAgIHJlc29sdmVNYXAucHV0KCJxIiwgInBhcmFtLXEiKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGVzKHJlc29sdmVNYXAsIGZhbHNlKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoImIiLCAicGFyYW0tYi93aXRoRW5jb2RlZFNsYXNoIiwgdHJ1ZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhcmFtLWEvd2l0aFNsYXNoL3BhcmFtLWIlMkZ3aXRoRW5jb2RlZFNsYXNoP3F1ZXJ5PXBhcmFtLXEiKSwKKyAgICAgICAgICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGVtcGxhdGVNdWx0aXBsZUNhbGwoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoIntzdGFydH0iKS5wYXRoKCJ7YX0iKQorICAgICAgICAgICAgICAgIC5yZXNvbHZlVGVtcGxhdGUoImEiLCAiZmlyc3QtYSIpLnBhdGgoInthfSIpLnJlc29sdmVUZW1wbGF0ZSgiYSIsICJzZWNvbmQtYSIpCisgICAgICAgICAgICAgICAgLnBhdGgoInthfS97YX0iKS5yZXNvbHZlVGVtcGxhdGUoImEiLCAidHdpY2UtYSIpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3N0YXJ0LXBhdGgvZmlyc3QtYS9zZWNvbmQtYS90d2ljZS1hL3R3aWNlLWEiKSwKKyAgICAgICAgICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkKCJzdGFydC1wYXRoIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjZVdpdGhFbXRweVNjaGVtZUZyb21VcmlUZXN0KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB1cmlPcmlnID0gImZ0cDovL2Z0cC5pcy5jby56YS9yZmMvcmZjMTgwOC50eHQiOworICAgICAgICBmaW5hbCBVUkkgdXJpUmVwbGFjZSA9IG5ldyBVUkkobnVsbCwgImZ0cC5pcy5jby56YSIsICIvdGVzdC9yZmMxODA4LnR4dCIsIG51bGwsIG51bGwpOworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKG5ldyBVUkkodXJpT3JpZykpLnVyaSh1cmlSZXBsYWNlKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJmdHA6Ly9mdHAuaXMuY28uemEvdGVzdC9yZmMxODA4LnR4dCIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VXaXRoRW1wdHlTY2hlbWVGcm9tU3RyaW5nVGVzdCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdXJpT3JpZyA9ICJmdHA6Ly9mdHAuaXMuY28uemEvcmZjL3JmYzE4MDgudHh0IjsKKyAgICAgICAgZmluYWwgVVJJIHVyaVJlcGxhY2UgPSBuZXcgVVJJKG51bGwsICJmdHAuaXMuY28uemEiLCAiL3Rlc3QvcmZjMTgwOC50eHQiLCBudWxsLCBudWxsKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKG5ldyBVUkkodXJpT3JpZykpLnVyaSh1cmlSZXBsYWNlLnRvQVNDSUlTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZnRwOi8vZnRwLmlzLmNvLnphL3Rlc3QvcmZjMTgwOC50eHQiLCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlV2l0aEVtcHR5UXVlcnlGcm9tU3RyaW5nVGVzdCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdXJpT3JpZyA9ICJmdHA6Ly9mdHAuaXMuY28uemEvcmZjL3JmYzE4MDgudHh0P2E9MSI7CisgICAgICAgIGZpbmFsIFVSSSB1cmlSZXBsYWNlID0gbmV3IFVSSShudWxsLCAiZnRwLmlzLmNvLnphIiwgIi90ZXN0L3JmYzE4MDgudHh0IiwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKHVyaU9yaWcpKS51cmkodXJpUmVwbGFjZS50b0FTQ0lJU3RyaW5nKCkpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImZ0cDovL2Z0cC5pcy5jby56YS90ZXN0L3JmYzE4MDgudHh0P2E9MSIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VXaXRoRW1wdHlGcmFnbWVudEZyb21TdHJpbmdUZXN0KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB1cmlPcmlnID0gImZ0cDovL2Z0cC5pcy5jby56YS9yZmMvcmZjMTgwOC50eHQjbXlGcmFnbWVudCI7CisgICAgICAgIGZpbmFsIFVSSSB1cmlSZXBsYWNlID0gbmV3IFVSSShudWxsLCAiZnRwLmlzLmNvLnphIiwgIi90ZXN0L3JmYzE4MDgudHh0IiwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKHVyaU9yaWcpKS51cmkodXJpUmVwbGFjZS50b0FTQ0lJU3RyaW5nKCkpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImZ0cDovL2Z0cC5pcy5jby56YS90ZXN0L3JmYzE4MDgudHh0I215RnJhZ21lbnQiLCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlT3BhcXVlVXJpV2l0aE5vbk9wYXF1ZUZyb21TdHJpbmdUZXN0KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaXJzdCA9ICJuZXdzOmNvbXAubGFuZy5qYXZhIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNlY29uZCA9ICJodHRwOi8vY29tcC5sYW5nLmphdmEiOworICAgICAgICBVcmlCdWlsZGVyLmZyb21VcmkobmV3IFVSSShmaXJzdCkpLnVyaShzZWNvbmQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjZU9wYXF1ZVVyaVdpdGhOb25PcGFxdWVGcm9tU3RyaW5nVGVzdDIoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0ID0gIm5ld3M6Y29tcC5sYW5nLmphdmEiOworICAgICAgICBmaW5hbCBTdHJpbmcgc2Vjb25kID0gImh0dHA6Ly9jb21wLmxhbmcuamF2YSI7CisgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKGZpcnN0KSkuc2NoZW1lKCJodHRwIikudXJpKHNlY29uZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlT3BhcXVlVXJpV2l0aE5vbk9wYXF1ZUZyb21VcmlUZXN0KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaXJzdCA9ICJuZXdzOmNvbXAubGFuZy5qYXZhIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNlY29uZCA9ICJodHRwOi8vY29tcC5sYW5nLmphdmEiOworICAgICAgICBVcmlCdWlsZGVyLmZyb21VcmkobmV3IFVSSShmaXJzdCkpLnVyaShuZXcgVVJJKHNlY29uZCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1FbmNvZGVkKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wYXRoIik7CisgICAgICAgIHVyaUJ1aWxkZXIucXVlcnlQYXJhbSgicXVlcnkiLCAiJWR1bW15MjMiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhdGg/cXVlcnk9JTI1ZHVtbXkyMyIsIHVyaUJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtRW5jb2RlZDIoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhdGgiKTsKKyAgICAgICAgdXJpQnVpbGRlci5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cGFyYW19Iik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wYXRoP3F1ZXJ5PSUyNWR1bW15MjMiLCB1cmlCdWlsZGVyLmJ1aWxkKCIlZHVtbXkyMyIpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1FbmNvZGVkMygpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGF0aCIpOworICAgICAgICB1cmlCdWlsZGVyLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntwYXJhbX0iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhdGg/cXVlcnk9JTI1MjV0ZXN0IiwgdXJpQnVpbGRlci5idWlsZCgiJTI1dGVzdCIpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1FbmNvZGVkNCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGF0aCIpOworICAgICAgICB1cmlCdWlsZGVyLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntwYXJhbX0iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhdGg/cXVlcnk9JTI1dGVzdCIsIHVyaUJ1aWxkZXIuYnVpbGRGcm9tRW5jb2RlZCgiJTI1dGVzdCIpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1FbmNvZGVkNSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGF0aCIpOworICAgICAgICB1cmlCdWlsZGVyLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIiEgIyAkICYgJyAoICkgKiArICwgLyA6IDsgPSA/IEAgWyBdIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wYXRoP3F1ZXJ5PSUyMSslMjMrJTI0KyUyNislMjcrJTI4KyUyOSslMkErJTJCKyUyQyslMkYrJTNBKyUzQislM0QrJTNGKyU0MCslNUIrJTVEIiwKKyAgICAgICAgICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uY29uZmlnLlRlc3RDb250cmFjdCBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5jb25maWcuVGVzdENvbnRyYWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTJlNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uY29uZmlnLlRlc3RDb250cmFjdApAQCAtMCwwICsxLDIgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uY29uZmlnLlRlc3RTZXJ2aWNlQQorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5jb25maWcuVGVzdFNlcnZpY2VDClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L3Jlc291cmNlcy9zdXJlZmlyZS5wb2xpY3kgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvcmVzb3VyY2VzL3N1cmVmaXJlLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTk5YTVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L3Jlc291cmNlcy9zdXJlZmlyZS5wb2xpY3kKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLy8gd2UgZG8gbm90IGNhcmUgYWJvdXQgamF2YSBsaWIgaXRzZWxmCitncmFudCBjb2RlYmFzZSAiZmlsZToke2phdmEuaG9tZX0vLSIgeworICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIHdlIGRvIG5vdCBjYXJlIGFib3V0IG91ciBkZXBlbmRlbmNpZXMKK2dyYW50IGNvZGViYXNlICJmaWxlOiR7c2V0dGluZ3MubG9jYWxSZXBvc2l0b3J5fS8tIiB7CisgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gdGhpcyBpcyB0byBiZSBhYmxlIHRvIHNldCBydW50aW1lIGRlbGVnYXRlIGluc3RhbmNlIGluIGpheC1ycyBmcm9tIHRoZSB0ZXN0cworLy8gYW5kIHRvIHJ1biBtdWx0aS10aHJlYWRlZCB0ZXN0cworZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzLy0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbiAic3VwcHJlc3NBY2Nlc3NDaGVja3MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAibW9kaWZ5VGhyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICIqIiwgIndyaXRlIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldENsYXNzTG9hZGVyIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjLioiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7Cit9OworCitncmFudCBjb2RlYmFzZSAiZmlsZToke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzLy0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0RlY2xhcmVkTWVtYmVycyI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJnZXRDbGFzc0xvYWRlciI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJtb2RpZnlUaHJlYWQiOworICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAicmVhZCI7CisgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiPDxBTEwgRklMRVM+PiIsICJyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjLioiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7Cit9OwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9wb20ueG1sIGIvdGVzdHMvZTJlLWVudGl0eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZjM4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3BvbS54bWwKQEAgLTAsMCArMSwyMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lMmUtZW50aXR5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWUyZS1lbnRpdHk8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEUyRSBFbnRpdHkgdGVzdHM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZvcmtDb3VudD4xPC9mb3JrQ291bnQ+CisgICAgICAgICAgICAgICAgICAgIDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlQXNzZXJ0aW9ucz5mYWxzZTwvZW5hYmxlQXNzZXJ0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1mcmVlbWFya2VyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1tdXN0YWNoZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWpldHRpc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZW50aXR5LWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1hcGFjaGUtY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktamV0dHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2lnbmF0dXJlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDItY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2d1YXZhLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD54bWx1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD54ZGs8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBkbyBub3QgdXNlIHNlY3VyaXR5IG1hbmFnZXIgZm9yIHhkayAtLT4KKyAgICAgICAgICAgICAgICA8c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZSAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0Fic3RyYWN0UGFyYW1ldGVyVHlwZUFyZ3VtZW50T3JkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9BYnN0cmFjdFBhcmFtZXRlclR5cGVBcmd1bWVudE9yZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTc1NmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9BYnN0cmFjdFBhcmFtZXRlclR5cGVBcmd1bWVudE9yZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworLyoqCisgKiBQYXJlbnQgZm9yIHNldCBvZiBQYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlciB0ZXN0cy4KKyAqCisgKiBDb250YWlucyBhbGwgdGhlIHByb3ZpZGVycyBhbmQgcmVzb3VyY2VzIGZvciB0aGUgdGVzdHMuIFRoZSByZXNvdXJjZSBjb25maWcgY3JlYXRpb24gYW5kIHRlc3QgbWV0aG9kcyB3ZXJlIHNlcGFyYXRlZCBpbnRvCisgKiBzdWJjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFyYW1ldGVyVHlwZUFyZ3VtZW50T3JkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdFdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3MgdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIE9iamVjdCBvLCBmaW5hbCBDbGFzcyB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT2JqZWN0IG8sIGZpbmFsIENsYXNzIHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcCBodHRwSGVhZGVycywgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShvLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyaWNDbGFzc1dyaXRlcjxUPiBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzIGM7CisKKyAgICAgICAgR2VuZXJpY0NsYXNzV3JpdGVyKGZpbmFsIENsYXNzIGMpIHsKKyAgICAgICAgICAgIHRoaXMuYyA9IGM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gYy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgVCB0LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgVCB0LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKChjLmdldFNpbXBsZU5hbWUoKSArIHR5cGUuZ2V0U2ltcGxlTmFtZSgpKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQSB7fQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBV3JpdGVyIGV4dGVuZHMgR2VuZXJpY0NsYXNzV3JpdGVyPEE+IHsKKworICAgICAgICBwdWJsaWMgQVdyaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKEEuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCIGV4dGVuZHMgQSB7fQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCV3JpdGVyIGV4dGVuZHMgR2VuZXJpY0NsYXNzV3JpdGVyPEI+IHsKKworICAgICAgICBwdWJsaWMgQldyaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKEIuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDIGV4dGVuZHMgQiB7fQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDV3JpdGVyIGV4dGVuZHMgR2VuZXJpY0NsYXNzV3JpdGVyPEM+IHsKKworICAgICAgICBwdWJsaWMgQ1dyaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKEMuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYSIpCisgICAgICAgIHB1YmxpYyBBIGdldEEoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEEoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImIiKQorICAgICAgICBwdWJsaWMgQiBnZXRCKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjIikKKyAgICAgICAgcHVibGljIEMgZ2V0QygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZW5lcmljQ2xhc3NSZWFkZXJXcml0ZXI8VD4gaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxUPiwgTWVzc2FnZUJvZHlSZWFkZXI8VD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgYzsKKworICAgICAgICBHZW5lcmljQ2xhc3NSZWFkZXJXcml0ZXIoZmluYWwgQ2xhc3MgYykgeworICAgICAgICAgICAgdGhpcy5jID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gYy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUIHJlYWRGcm9tKGZpbmFsIENsYXNzPFQ+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFQpIGMubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBjLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBUIHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBUIHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoKGMuZ2V0U2ltcGxlTmFtZSgpICsgdHlwZS5nZXRTaW1wbGVOYW1lKCkpLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBUmVhZGVyV3JpdGVyPFQ+IGV4dGVuZHMgR2VuZXJpY0NsYXNzUmVhZGVyV3JpdGVyPFQ+IHsKKworICAgICAgICBwdWJsaWMgQVJlYWRlcldyaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKEEuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCUmVhZGVyV3JpdGVyIGV4dGVuZHMgR2VuZXJpY0NsYXNzUmVhZGVyV3JpdGVyPEI+IHsKKworICAgICAgICBwdWJsaWMgQlJlYWRlcldyaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKEIuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDUmVhZGVyV3JpdGVyIGV4dGVuZHMgR2VuZXJpY0NsYXNzUmVhZGVyV3JpdGVyPEM+IHsKKworICAgICAgICBwdWJsaWMgQ1JlYWRlcldyaXRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKEMuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9BYnN0cmFjdFR5cGVUZXN0ZXIuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0Fic3RyYWN0VHlwZVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmM2M4YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9BYnN0cmFjdFR5cGVUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEFic3RyYWN0IGVudGl0eSB0eXBlIHRlc3RlciBiYXNlIGNsYXNzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHlwZVRlc3RlciBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbCBsb2NhbFJlcXVlc3RFbnRpdHkgPSBuZXcgVGhyZWFkTG9jYWwoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQVJlc291cmNlPFQ+IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgVCBwb3N0KFQgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcXVlc3RFbnRpdHlJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcmlnaW5hbCA9IHdyaXRlckludGVyY2VwdG9yQ29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0LnNldE91dHB1dFN0cmVhbShiYW9zKTsKKyAgICAgICAgICAgIHdyaXRlckludGVyY2VwdG9yQ29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gcmVxdWVzdEVudGl0eSA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIHdyaXRlckludGVyY2VwdG9yQ29udGV4dC5zZXRQcm9wZXJ0eSgicmVxdWVzdEVudGl0eSIsIHJlcXVlc3RFbnRpdHkpOworICAgICAgICAgICAgb3JpZ2luYWwud3JpdGUocmVxdWVzdEVudGl0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb2NhbFJlcXVlc3RFbnRpdHkuc2V0KHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnR5KCJyZXF1ZXN0RW50aXR5IikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgZm9yIGFsbCByZXNvdXJjZXMgYW5kIHByb3ZpZGVycyBkZWNsYXJlZCBhcyBpbm5lciBjbGFzc2VzIG9mIHRoZSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzCisgICAgICogYW5kIGFkZHMgdGhlbSB0byB0aGUgcmV0dXJuZWQgUmVzb3VyY2VDb25maWcgKHVubGVzcyBjb25zdHJhaW5lZCB0byBjbGllbnQgc2lkZSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlc291cmNlQ29uZmlnIGluc3RhbmNlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgSGFzaFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xzIDogZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZENsYXNzZXMoKSkgeworICAgICAgICAgICAgaWYgKGNscy5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbHMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjbHMuZ2V0QW5ub3RhdGlvbihQcm92aWRlci5jbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbmVkVG8gY29uc3RyYWluZWRUbyA9IGNscy5nZXRBbm5vdGF0aW9uKENvbnN0cmFpbmVkVG8uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW5lZFRvID09IG51bGwgfHwgY29uc3RyYWluZWRUby52YWx1ZSgpID09IFJ1bnRpbWVUeXBlLlNFUlZFUikgeworICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoY2xhc3Nlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgZm9yIGFsbCBwcm92aWRlcnMgZGVjbGFyZWQgYXMgaW5uZXIgY2xhc3NlcyBvZiB0aGUgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcworICAgICAqIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGNsaWVudCBjb25maWd1cmF0aW9uICh1bmxlc3MgY29uc3RyYWluZWQgdG8gc2VydmVyIHNpZGUpLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihSZXF1ZXN0RW50aXR5SW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoUmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xzIDogZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZENsYXNzZXMoKSkgeworICAgICAgICAgICAgaWYgKGNscy5nZXRBbm5vdGF0aW9uKFByb3ZpZGVyLmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RyYWluZWRUbyBjb25zdHJhaW5lZFRvID0gY2xzLmdldEFubm90YXRpb24oQ29uc3RyYWluZWRUby5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0cmFpbmVkVG8gPT0gbnVsbCB8fCBjb25zdHJhaW5lZFRvLnZhbHVlKCkgPT0gUnVudGltZVR5cGUuQ0xJRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihjbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCA8VD4gdm9pZCBfdGVzdChUIGluLCBDbGFzcyByZXNvdXJjZSkgeworICAgICAgICBfdGVzdChpbiwgcmVzb3VyY2UsIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCA8VD4gdm9pZCBfdGVzdChUIGluLCBDbGFzcyByZXNvdXJjZSwgTWVkaWFUeXBlIG0pIHsKKyAgICAgICAgX3Rlc3QoaW4sIHJlc291cmNlLCBtLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgPFQ+IHZvaWQgX3Rlc3QoVCBpbiwgQ2xhc3MgcmVzb3VyY2UsIGJvb2xlYW4gdmVyaWZ5KSB7CisgICAgICAgIF90ZXN0KGluLCByZXNvdXJjZSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgdmVyaWZ5KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgPFQ+IHZvaWQgX3Rlc3QoVCBpbiwgQ2xhc3MgcmVzb3VyY2UsIE1lZGlhVHlwZSBtLCBib29sZWFuIHZlcmlmeSkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KHJlc291cmNlLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sIG0pKTsKKworICAgICAgICBieXRlW10gaW5CeXRlcyA9IGdldFJlcXVlc3RFbnRpdHkoKTsKKyAgICAgICAgYnl0ZVtdIG91dEJ5dGVzID0gZ2V0RW50aXR5QXNCeXRlQXJyYXkocmVzcG9uc2UpOworCisgICAgICAgIGlmICh2ZXJpZnkpIHsKKyAgICAgICAgICAgIF92ZXJpZnkoaW5CeXRlcywgb3V0Qnl0ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gZ2V0UmVxdWVzdEVudGl0eSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZVtdKSBsb2NhbFJlcXVlc3RFbnRpdHkuZ2V0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NhbFJlcXVlc3RFbnRpdHkuc2V0KG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF92ZXJpZnkoYnl0ZVtdIGluLCBieXRlW10gb3V0KSB7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi5sZW5ndGgsIG91dC5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5baV0gIT0gb3V0W2ldKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmRleDogIiArIGksIGluW2ldLCBvdXRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gZ2V0RW50aXR5QXNCeXRlQXJyYXkoUmVzcG9uc2UgcikgeworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlYWRlcldyaXRlci53cml0ZVRvKHIucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyksIGJhb3MpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvQmVhblN0cmVhbWluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0JlYW5TdHJlYW1pbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4MmU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0JlYW5TdHJlYW1pbmdUZXN0LmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBCZWFuU3RyZWFtaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhnZXRDbGFzcygpLmdldERlY2xhcmVkQ2xhc3NlcygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBmb3IgKENsYXNzPD8+IGMgOiBnZXRDbGFzcygpLmdldERlY2xhcmVkQ2xhc3NlcygpKSB7CisgICAgICAgICAgICBpZiAoYy5nZXRBbm5vdGF0aW9uKFByb3ZpZGVyLmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCZWFuIGIgPSBuZXcgQmVhbigiYmVhbiIsIDEyMywgMy4xNDE1Zik7CisKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayB1c2luZyBCZWFuUHJvdmlkZXIgd2hpY2gKKyAgICAgICAgLy8gc3VwcG9ydHMgQmVhbi5jbGFzcyBmb3IgdHlwZSBhcHBsaWNhdGlvbi9iZWFuCisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCkucGF0aCgiL2JlYW4iKTsKKyAgICAgICAgci5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGIsICJhcHBsaWNhdGlvbi9iZWFuIiksIEJlYW4uY2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByID0gdGFyZ2V0KCkucGF0aCgiL3BsYWluIik7CisgICAgICAgICAgICByLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYiwgInRleHQvcGxhaW4iKSwgQmVhbi5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuV2lsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCZWFuIGIgPSBuZXcgQmVhbigiYmVhbiIsIDEyMywgMy4xNDE1Zik7CisKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayB1c2luZyBCZWFuV2lsZFByb3ZpZGVyIHdoaWNoCisgICAgICAgIC8vIHN1cHBvcnRzIEJlYW4uY2xhc3MgZm9yIHR5cGUgYXBwbGljYXRpb24vKgorICAgICAgICB0YXJnZXQoKS5wYXRoKCIvd2lsZCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYiwgImFwcGxpY2F0aW9uL3dpbGQtYmVhbiIpLCBCZWFuLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCZWFuMiBiID0gbmV3IEJlYW4yKCJiZWFuIiwgMTIzLCAzLjE0MTVmKTsKKworICAgICAgICB0YXJnZXQoKS5wYXRoKCIvYmVhbjIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGIsICJhcHBsaWNhdGlvbi9iZWFuIiksIEJlYW4yLmNsYXNzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgiL3BsYWluMiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYiwgInRleHQvcGxhaW4iKSwgQmVhbjIuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZmFsc2UpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbjJVc2luZ0JlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQmVhbjIgYiA9IG5ldyBCZWFuMigiYmVhbiIsIDEyMywgMy4xNDE1Zik7CisKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayB1c2luZyBCZWFuUHJvdmlkZXIgd2hpY2gKKyAgICAgICAgLy8gc3VwcG9ydHMgQmVhbi5jbGFzcyBmb3IgdHlwZSBhcHBsaWNhdGlvbi9iZWFuCisgICAgICAgIHRhcmdldCgpLnBhdGgoIi9iZWFuIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShiLCAiYXBwbGljYXRpb24vYmVhbiIpLCBCZWFuMi5jbGFzcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoIi9wbGFpbiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYiwgInRleHQvcGxhaW4iKSwgQmVhbjIuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBnb29kCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuMldpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQmVhbjIgYiA9IG5ldyBCZWFuMigiYmVhbiIsIDEyMywgMy4xNDE1Zik7CisKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBzaG91bGQgd29yayB1c2luZyBCZWFuV2lsZFByb3ZpZGVyIHdoaWNoCisgICAgICAgIC8vIHN1cHBvcnRzIEJlYW4uY2xhc3MgZm9yIHR5cGUgYXBwbGljYXRpb24vKgorICAgICAgICB0YXJnZXQoKS5wYXRoKCIvd2lsZDIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGIsICJhcHBsaWNhdGlvbi93aWxkLWJlYW4iKSwgQmVhbjIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW4yV2lsZFVzaW5nQmVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCZWFuMiBiID0gbmV3IEJlYW4yKCJiZWFuIiwgMTIzLCAzLjE0MTVmKTsKKworICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIHVzaW5nIEJlYW5XaWxkUHJvdmlkZXIgd2hpY2gKKyAgICAgICAgLy8gc3VwcG9ydHMgQmVhbi5jbGFzcyBmb3IgdHlwZSBhcHBsaWNhdGlvbi8qCisgICAgICAgIHRhcmdldCgpLnBhdGgoIi93aWxkIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShiLCAiYXBwbGljYXRpb24vd2lsZC1iZWFuIiksIEJlYW4yLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIFN0cmluZyBzdHJpbmc7CisgICAgICAgIHByaXZhdGUgaW50IGludGVnZXI7CisgICAgICAgIHByaXZhdGUgZmxvYXQgcmVhbDsKKworICAgICAgICBwdWJsaWMgQmVhbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCZWFuKFN0cmluZyBzdHJpbmcsIGludCBpbnRlZ2VyLCBmbG9hdCByZWFsKSB7CisgICAgICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKKyAgICAgICAgICAgIHRoaXMuaW50ZWdlciA9IGludGVnZXI7CisgICAgICAgICAgICB0aGlzLnJlYWwgPSByZWFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRJbnRlZ2VyKCkgeworICAgICAgICAgICAgcmV0dXJuIGludGVnZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbnRlZ2VyKGludCBpbnRlZ2VyKSB7CisgICAgICAgICAgICB0aGlzLmludGVnZXIgPSBpbnRlZ2VyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZsb2F0IGdldFJlYWwoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlYWwoZmxvYXQgcmVhbCkgeworICAgICAgICAgICAgdGhpcy5yZWFsID0gcmVhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmVhbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9iZWFuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPEJlYW4+IHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJlYW4gcmVhZEZyb20oCisgICAgICAgICAgICAgICAgQ2xhc3M8QmVhbj4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChCZWFuKSBvaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjYXVzZSkgeworICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIGVmZmVjdCA9IG5ldyBJT0V4Y2VwdGlvbihjYXVzZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGVmZmVjdC5pbml0Q2F1c2UoY2F1c2UpOworICAgICAgICAgICAgICAgIHRocm93IGVmZmVjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBCZWFuIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdCh0KTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uLyoiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbldpbGRQcm92aWRlciBleHRlbmRzIEJlYW5Qcm92aWRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iZWFuIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2JlYW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbjJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPEJlYW4yPiB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtdCkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gQmVhbjIuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmVhbjIgcmVhZEZyb20oCisgICAgICAgICAgICAgICAgQ2xhc3M8QmVhbjI+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2luID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoQmVhbjIpIG9pbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNhdXNlKSB7CisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24gZWZmZWN0ID0gbmV3IElPRXhjZXB0aW9uKGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgZWZmZWN0LmluaXRDYXVzZShjYXVzZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZWZmZWN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4yLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBCZWFuMiB0LAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICBvdXQud3JpdGVPYmplY3QodCk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vKiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi8qIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW4yV2lsZFByb3ZpZGVyIGV4dGVuZHMgQmVhbjJQcm92aWRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuMi5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtdCkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gQmVhbjIuY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW4yIGV4dGVuZHMgQmVhbiB7CisgICAgICAgIHB1YmxpYyBCZWFuMihTdHJpbmcgc3RyaW5nLCBpbnQgaW50ZWdlciwgZmxvYXQgcmVhbCkgeworICAgICAgICAgICAgc3VwZXIoc3RyaW5nLCBpbnRlZ2VyLCByZWFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvYmVhbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2JlYW4iKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2JlYW4iKQorICAgICAgICBwdWJsaWMgQmVhbiBwb3N0KEJlYW4gdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2JlYW4yIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW4yUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2JlYW4iKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2JlYW4iKQorICAgICAgICBwdWJsaWMgQmVhbjIgcG9zdChCZWFuMiB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhblRleHRQbGFpblJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIEJlYW4gcG9zdChCZWFuIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9wbGFpbjIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbjJUZXh0UGxhaW5SZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygidGV4dC9wbGFpbiIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBCZWFuMiBwb3N0KEJlYW4yIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi93aWxkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5XaWxkUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uLyoiKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uLyoiKQorICAgICAgICBwdWJsaWMgQmVhbiBwb3N0KEJlYW4gdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3dpbGQyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW4yV2lsZFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi8qIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICAgICAgcHVibGljIEJlYW4yIHBvc3QoQmVhbjIgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9DaGFyc2V0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvQ2hhcnNldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODFhYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvQ2hhcnNldFRlc3QuamF2YQpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkpheGJDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIENoYXJzZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIENIQVJTRVRTID0geworICAgICAgICAgICAgIlVTLUFTQ0lJIiwgIklTTy04ODU5LTEiLCAiVVRGLTgiLCAiVVRGLTE2QkUiLCAiVVRGLTE2TEUiLCAiVVRGLTE2IgorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVCA9ICJcdTAwQTkgQ09OVEVOVCBcdTAwRkYgXHUyMjAwIFx1MjJGRiI7CisKKyAgICBAUGF0aCgiL1N0cmluZ0NoYXJzZXRSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdDaGFyc2V0UmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJVUy1BU0NJSSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0VXNfQXNjaWkoU3RyaW5nIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIklTTy04ODU5LTEiKQorICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW47Y2hhcnNldD1JU08tODg1OS0xIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0SXNvXzg4NTlfMShTdHJpbmcgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiVVRGLTgiKQorICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdFV0Zl84KFN0cmluZyB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJVVEYtMTZCRSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbjtjaGFyc2V0PVVURi0xNkJFIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0VXRmXzE2YmUoU3RyaW5nIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIlVURi0xNkxFIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTE2TEUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RVdGZfMTZsZShTdHJpbmcgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiVVRGLTE2IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTE2IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0VXRmXzE2KFN0cmluZyB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiAoKFJlc291cmNlQ29uZmlnKSBzdXBlci5jb25maWd1cmUoKSkucmVnaXN0ZXIobmV3IEpldHRpc29uRmVhdHVyZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY29uZmlnKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNeUpheGJDb250ZXh0UmVzb2x2ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NoYXJzZXRSZXNvdXJjZSgpIHsKKyAgICAgICAgU3RyaW5nIGluID0gIlx1MDBBOSBDT05URU5UIFx1MDBGRiBcdTIyMDAgXHUyMkZGIjsKKworICAgICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldCgpLnBhdGgoIlN0cmluZ0NoYXJzZXRSZXNvdXJjZSIpOworCisgICAgICAgIGZvciAoU3RyaW5nIGNoYXJzZXQgOiBDSEFSU0VUUykgeworICAgICAgICAgICAgUmVzcG9uc2UgciA9IHQucGF0aChjaGFyc2V0KS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAidGV4dC9wbGFpbjtjaGFyc2V0PSIgKyBjaGFyc2V0KSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBpbkJ5dGVzID0gZ2V0UmVxdWVzdEVudGl0eSgpOworICAgICAgICAgICAgYnl0ZVtdIG91dEJ5dGVzID0gZ2V0RW50aXR5QXNCeXRlQXJyYXkocik7CisKKyAgICAgICAgICAgIF92ZXJpZnkoaW5CeXRlcywgb3V0Qnl0ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDaGFyc2V0UmVzb3VyY2U8VD4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIEh0dHBIZWFkZXJzIGg7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3QoVCB0KSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sodCwgaC5nZXRNZWRpYVR5cGUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvU3RyaW5nUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nUmVzb3VyY2UgZXh0ZW5kcyBDaGFyc2V0UmVzb3VyY2U8U3RyaW5nPiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3QoQ09OVEVOVCwgU3RyaW5nUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvRm9ybU11bHRpdmFsdWVkTWFwUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9ybU11bHRpdmFsdWVkTWFwUmVzb3VyY2UgZXh0ZW5kcyBDaGFyc2V0UmVzb3VyY2U8TXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+PiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtTXVsdGl2YWx1ZWRNYXBSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8PigpOworCisgICAgICAgIG1hcC5hZGQoIm5hbWUiLCAiXHUwMEE5IENPTlRFTlQgXHUwMEZGIFx1MjIwMCBcdTIyRkYiKTsKKyAgICAgICAgbWFwLmFkZCgibmFtZSIsICLvv70g77+9IO+/vSIpOworICAgICAgICBfdGVzdChtYXAsIEZvcm1NdWx0aXZhbHVlZE1hcFJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCIvRm9ybVJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZSBleHRlbmRzIENoYXJzZXRSZXNvdXJjZTxGb3JtPiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKworICAgICAgICBmb3JtLnBhcmFtKCJuYW1lIiwgIlx1MDBBOSBDT05URU5UIFx1MDBGRiBcdTIyMDAgXHUyMkZGIik7CisgICAgICAgIGZvcm0ucGFyYW0oIm5hbWUiLCAi77+9IO+/vSDvv70iKTsKKyAgICAgICAgX3Rlc3QoZm9ybSwgRm9ybVJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCIvSlNPTk9iamVjdFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpTT05PYmplY3RSZXNvdXJjZSBleHRlbmRzIENoYXJzZXRSZXNvdXJjZTxKU09OT2JqZWN0PiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKU09OT2JqZWN0UmVwcmVzZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSlNPTk9iamVjdCBvYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOworICAgICAgICBvYmplY3QucHV0KCJ1c2VyaWQiLCAxMjM0KQorICAgICAgICAgICAgICAgIC5wdXQoInVzZXJuYW1lIiwgQ09OVEVOVCkKKyAgICAgICAgICAgICAgICAucHV0KCJlbWFpbCIsICJhQGIiKQorICAgICAgICAgICAgICAgIC5wdXQoInBhc3N3b3JkIiwgIioqKioiKTsKKworICAgICAgICBfdGVzdChvYmplY3QsIEpTT05PYmplY3RSZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIi9KU09OT0FycmF5UmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSlNPTk9BcnJheVJlc291cmNlIGV4dGVuZHMgQ2hhcnNldFJlc291cmNlPEpTT05BcnJheT4geworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SlNPTkFycmF5UmVwcmVzZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSlNPTkFycmF5IGFycmF5ID0gbmV3IEpTT05BcnJheSgpOworICAgICAgICBhcnJheS5wdXQoQ09OVEVOVCkucHV0KCJUd28iKS5wdXQoIlRocmVlIikucHV0KDEpLnB1dCgyLjApOworCisgICAgICAgIF90ZXN0KGFycmF5LCBKU09OT0FycmF5UmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCIvSkFYQkJlYW5SZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQmVhblJlc291cmNlIGV4dGVuZHMgQ2hhcnNldFJlc291cmNlPEpheGJCZWFuPiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQmVhblhNTFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oQ09OVEVOVCksIEpBWEJCZWFuUmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkJlYW5KU09OUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbihDT05URU5UKSwgSkFYQkJlYW5SZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUpheGJDb250ZXh0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+IHsKKworICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0OworCisgICAgICAgIHB1YmxpYyBNeUpheGJDb250ZXh0UmVzb2x2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgSmV0dGlzb25KYXhiQ29udGV4dChKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSkFYQkNvbnRleHQgZ2V0Q29udGV4dChDbGFzczw/PiBvYmplY3RUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKG9iamVjdFR5cGUgPT0gSmF4YkJlYW4uY2xhc3MpID8gY29udGV4dCA6IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQmVhbkpTT05SZXByZXNlbnRhdGlvbldpdGhDb250ZXh0UmVzb2x2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oQ09OVEVOVCk7CisgICAgICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCIvSkFYQkJlYW5SZXNvdXJjZSIpOworICAgICAgICBmb3IgKFN0cmluZyBjaGFyc2V0IDogQ0hBUlNFVFMpIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJpYiA9IHQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD0iICsgY2hhcnNldCkpOworICAgICAgICAgICAgYnl0ZVtdIGluQnl0ZXMgPSBnZXRSZXF1ZXN0RW50aXR5KCk7CisgICAgICAgICAgICBieXRlW10gb3V0Qnl0ZXMgPSBnZXRFbnRpdHlBc0J5dGVBcnJheShyaWIpOworICAgICAgICAgICAgX3ZlcmlmeShpbkJ5dGVzLCBvdXRCeXRlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL1JlYWRlclJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWRlclJlc291cmNlIGV4dGVuZHMgQ2hhcnNldFJlc291cmNlPFJlYWRlcj4geworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGVyUmVwcmVzZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoIi9SZWFkZXJSZXNvdXJjZSIpOworICAgICAgICBmb3IgKFN0cmluZyBjaGFyc2V0IDogQ0hBUlNFVFMpIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJpYiA9IHQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgU3RyaW5nUmVhZGVyKENPTlRFTlQpLCAidGV4dC9wbGFpbjtjaGFyc2V0PSIgKyBjaGFyc2V0KSk7CisgICAgICAgICAgICBieXRlW10gaW5CeXRlcyA9IGdldFJlcXVlc3RFbnRpdHkoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBvdXRCeXRlcyA9IGdldEVudGl0eUFzQnl0ZUFycmF5KHJpYik7CisgICAgICAgICAgICBfdmVyaWZ5KGluQnl0ZXMsIG91dEJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gdm9pZCBfdGVzdChUIGluLCBDbGFzcyByZXNvdXJjZSkgeworICAgICAgICBfdGVzdChpbiwgcmVzb3VyY2UsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gdm9pZCBfdGVzdChUIGluLCBDbGFzcyByZXNvdXJjZSwgTWVkaWFUeXBlIG0pIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQocmVzb3VyY2UuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY2hhcnNldCA6IENIQVJTRVRTKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBwLnB1dCgiY2hhcnNldCIsIGNoYXJzZXQpOworICAgICAgICAgICAgTWVkaWFUeXBlIF9tID0gbmV3IE1lZGlhVHlwZShtLmdldFR5cGUoKSwgbS5nZXRTdWJ0eXBlKCksIHApOworICAgICAgICAgICAgUmVzcG9uc2UgcmliID0gdC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCBfbSkpOworICAgICAgICAgICAgYnl0ZVtdIGluQnl0ZXMgPSBnZXRSZXF1ZXN0RW50aXR5KCk7CisgICAgICAgICAgICBieXRlW10gb3V0Qnl0ZXMgPSBnZXRFbnRpdHlBc0J5dGVBcnJheShyaWIpOworICAgICAgICAgICAgX3ZlcmlmeShpbkJ5dGVzLCBvdXRCeXRlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9Db250ZXh0UmVzb2x2ZXJNZWRpYVR5cGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9Db250ZXh0UmVzb2x2ZXJNZWRpYVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyNTBlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0NvbnRleHRSZXNvbHZlck1lZGlhVHlwZVRlc3QuamF2YQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnJ1bm5lcnMuRW5jbG9zZWQ7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFJ1bldpdGgoRW5jbG9zZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29udGV4dFJlc29sdmVyTWVkaWFUeXBlVGVzdCB7CisKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIEBQcm92aWRlcgorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRleHRQbGFpbkNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoQ2xhc3M8Pz4gb2JqZWN0VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXh0L3BsYWluIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygidGV4dC8qIikKKyAgICBAUHJvdmlkZXIKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXh0Q29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPFN0cmluZz4geworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dChDbGFzczw/PiBvYmplY3RUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gInRleHQvKiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoIiovKiIpCisgICAgQFByb3ZpZGVyCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2lsZGNhcmRDb250ZXh0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0KENsYXNzPD8+IG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiKi8qIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcyh7InRleHQvcGxhaW4iLCAidGV4dC9odG1sIn0pCisgICAgQFByb3ZpZGVyCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGV4dFBsYWluSHRtbENvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoQ2xhc3M8Pz4gb2JqZWN0VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXh0L3BsYWluL2h0bWwiOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgQFByb3ZpZGVyCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGV4dEh0bWxDb250ZXh0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0KENsYXNzPD8+IG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAidGV4dC9odG1sIjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRleHRSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgUHJvdmlkZXJzIHA7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgQ29udGV4dFJlc29sdmVyPFN0cmluZz4gY3I7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2lkOiAuK30iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAUGF0aFBhcmFtKCJpZCIpIE1lZGlhVHlwZSBtKSB7CisgICAgICAgICAgICBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiBjciA9IHAuZ2V0Q29udGV4dFJlc29sdmVyKFN0cmluZy5jbGFzcywgbSk7CisKKyAgICAgICAgICAgIC8vIFZlcmlmeSBjYWNoZSBpcyB3b3JraW5nCisgICAgICAgICAgICBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiBjYWNoZWRDciA9IHAuZ2V0Q29udGV4dFJlc29sdmVyKFN0cmluZy5jbGFzcywgbSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3IsIGNhY2hlZENyKTsKKworICAgICAgICAgICAgaWYgKGNyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIk5VTEwiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3IuZ2V0Q29udGV4dChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvZHVjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ29udGV4dFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBUZXh0UGxhaW5Db250ZXh0UmVzb2x2ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRleHRDb250ZXh0UmVzb2x2ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFdpbGRjYXJkQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCB0YXJnZXQucGF0aCgidGV4dC9wbGFpbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvKiIsIHRhcmdldC5wYXRoKCJ0ZXh0LyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB0YXJnZXQucGF0aCgiKi8qIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0LyoiLCB0YXJnZXQucGF0aCgidGV4dC9odG1sIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB0YXJnZXQucGF0aCgiYXBwbGljYXRpb24veG1sIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiKi8qIiwgdGFyZ2V0LnBhdGgoImFwcGxpY2F0aW9uLyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9kdWNlc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ29udGV4dFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBUZXh0UGxhaW5IdG1sQ29udGV4dFJlc29sdmVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBUZXh0Q29udGV4dFJlc29sdmVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBXaWxkY2FyZENvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4vaHRtbCIsIHRhcmdldC5wYXRoKCJ0ZXh0L3BsYWluIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbi9odG1sIiwgdGFyZ2V0LnBhdGgoInRleHQvaHRtbCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvKiIsIHRhcmdldC5wYXRoKCJ0ZXh0LyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB0YXJnZXQucGF0aCgiKi8qIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0LyoiLCB0YXJnZXQucGF0aCgidGV4dC9jc3YiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiovKiIsIHRhcmdldC5wYXRoKCJhcHBsaWNhdGlvbi94bWwiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB0YXJnZXQucGF0aCgiYXBwbGljYXRpb24vKiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2R1Y2VzU2VwYXJhdGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENvbnRleHRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgVGV4dFBsYWluQ29udGV4dFJlc29sdmVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBUZXh0SHRtbENvbnRleHRSZXNvbHZlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgVGV4dENvbnRleHRSZXNvbHZlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgV2lsZGNhcmRDb250ZXh0UmVzb2x2ZXIuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2VzU2VwYXJhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCB0YXJnZXQucGF0aCgidGV4dC9wbGFpbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvaHRtbCIsIHRhcmdldC5wYXRoKCJ0ZXh0L2h0bWwiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0LyoiLCB0YXJnZXQucGF0aCgidGV4dC8qIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiKi8qIiwgdGFyZ2V0LnBhdGgoIiovKiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC8qIiwgdGFyZ2V0LnBhdGgoInRleHQvY3N2IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB0YXJnZXQucGF0aCgiYXBwbGljYXRpb24veG1sIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiKi8qIiwgdGFyZ2V0LnBhdGgoImFwcGxpY2F0aW9uLyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9kdWNlc1hYWFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ29udGV4dFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBUZXh0UGxhaW5Db250ZXh0UmVzb2x2ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRleHRIdG1sQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlc1hYWCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIHRhcmdldC5wYXRoKCJ0ZXh0L3BsYWluIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9odG1sIiwgdGFyZ2V0LnBhdGgoInRleHQvaHRtbCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5VTEwiLCB0YXJnZXQucGF0aCgidGV4dC8qIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTlVMTCIsIHRhcmdldC5wYXRoKCIqLyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5VTEwiLCB0YXJnZXQucGF0aCgidGV4dC9jc3YiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5VTEwiLCB0YXJnZXQucGF0aCgiYXBwbGljYXRpb24veG1sIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTlVMTCIsIHRhcmdldC5wYXRoKCJhcHBsaWNhdGlvbi8qIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VtcHR5RW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyNGU0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VtcHR5RW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5vQ29udGVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUmVhZGVyV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogSkVSU0VZLTE1NDAuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVtcHR5RW50aXR5VGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RFbXRweUJlYW4geworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgVGVzdEVtdHB5QmVhbihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RFbXB0eUJlYW5Qcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFRlc3RFbXRweUJlYW4+LCBNZXNzYWdlQm9keVdyaXRlcjxUZXN0RW10cHlCZWFuPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVGVzdEVtdHB5QmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUZXN0RW10cHlCZWFuIHJlYWRGcm9tKENsYXNzPFRlc3RFbXRweUJlYW4+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RFbXRweUJlYW4odmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIFRlc3RFbXRweUJlYW4uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFRlc3RFbXRweUJlYW4gdGVzdEVtdHB5QmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFRlc3RFbXRweUJlYW4gdGVzdEVtdHB5QmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgUmVhZGVyV3JpdGVyLndyaXRlVG9Bc1N0cmluZyh0ZXN0RW10cHlCZWFuLmdldFZhbHVlKCksIGVudGl0eVN0cmVhbSwgbWVkaWFUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEpheGJCZWFuIHsKKworICAgIH0KKworICAgIEBQYXRoKCJlbXB0eSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eVJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiamF4YmVsZW0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGpheGJlbGVtKEpBWEJFbGVtZW50PFN0cmluZz4gamF4YikgeworICAgICAgICAgICAgcmV0dXJuICJFUlJPUiI7IC8vIHNob3VsZG4ndCBiZSBjYWxsZWQKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqYXhiYmVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgamF4YmJlYW4oVGVzdEpheGJCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiAiRVJST1IiOyAvLyBzaG91bGRuJ3QgYmUgY2FsbGVkCisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiamF4Ymxpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGpheGJsaXN0KExpc3Q8VGVzdEpheGJCZWFuPiBiZWFucykgeworICAgICAgICAgICAgcmV0dXJuICJFUlJPUiI7IC8vIHNob3VsZG4ndCBiZSBjYWxsZWQKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBib29sKEJvb2xlYW4gYikgeworICAgICAgICAgICAgcmV0dXJuICJFUlJPUiI7IC8vIHNob3VsZG4ndCBiZSBjYWxsZWQKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjaGFyYWN0ZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNoYXJhY3RlcihDaGFyYWN0ZXIgYykgeworICAgICAgICAgICAgcmV0dXJuICJFUlJPUiI7IC8vIHNob3VsZG4ndCBiZSBjYWxsZWQKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJpbnRlZ2VyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBpbnRlZ2VyKEludGVnZXIgaSkgeworICAgICAgICAgICAgcmV0dXJuICJFUlJPUiI7IC8vIHNob3VsZG4ndCBiZSBjYWxsZWQKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJlbXB0eWJlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGVtcHR5QmVhbihUZXN0RW10cHlCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiAoYmVhbi5nZXRWYWx1ZSgpLmlzRW1wdHkoKSkgPyAiUEFTU0VEIiA6ICJFUlJPUiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJnZXRlbXB0eSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRFbXB0eShAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS50eXBlKGhlYWRlcnMuZ2V0QWNjZXB0YWJsZU1lZGlhVHlwZXMoKS5nZXQoMCkpLmhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgMCkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBFbXB0eUVudGl0eVRlc3QoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEVtcHR5SkFYQkVsZW1lbnQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImVtcHR5L2pheGJlbGVtIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kRW1wdHlKQVhCYmVhbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvamF4YmJlYW4iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRFbXB0eUpBWEJsaXN0KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9qYXhibGlzdCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEVtcHR5Qm9vbGVhbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvYm9vbGVhbiIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRFbXB0eUNoYXJhY3RlcigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvY2hhcmFjdGVyIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEVtcHR5SW50ZWdlcigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvaW50ZWdlciIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEVtcHR5QmVhbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvZW1wdHliZWFuIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQQVNTRUQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVFbXB0eUpBWEJFbGVtZW50KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRlbXB0eSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KG5ldyBHZW5lcmljVHlwZTxKQVhCRWxlbWVudDxTdHJpbmc+PigpIHsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShOb0NvbnRlbnRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChuZXcgR2VuZXJpY1R5cGU8SkFYQkVsZW1lbnQ8U3RyaW5nPj4oKSB7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGZhaWwoIlJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKE5vQ29udGVudEV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVFbXB0eUpBWEJiZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRlbXB0eSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFRlc3RKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKE5vQ29udGVudEV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KFRlc3RKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShOb0NvbnRlbnRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlRW1wdHlKQVhCbGlzdCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvZ2V0ZW1wdHkiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShuZXcgR2VuZXJpY1R5cGU8TGlzdDxUZXN0SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShOb0NvbnRlbnRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxUZXN0SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoTm9Db250ZW50RXhjZXB0aW9uLmNsYXNzLCBleC5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZUVtcHR5Qm9vbGVhbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvZ2V0ZW1wdHkiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoQm9vbGVhbi5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKE5vQ29udGVudEV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldChCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIlJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKE5vQ29udGVudEV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVFbXB0eUNoYXJhY3RlcigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvZ2V0ZW1wdHkiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoQ2hhcmFjdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIlByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoTm9Db250ZW50RXhjZXB0aW9uLmNsYXNzLCBleC5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KENoYXJhY3Rlci5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShOb0NvbnRlbnRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlRW1wdHlJbnRlZ2VyKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRlbXB0eSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIlByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoTm9Db250ZW50RXhjZXB0aW9uLmNsYXNzLCBleC5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KEludGVnZXIuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoTm9Db250ZW50RXhjZXB0aW9uLmNsYXNzLCBleC5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZUVtcHR5QmVhbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvZ2V0ZW1wdHkiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFkRW50aXR5KFRlc3RFbXRweUJlYW4uY2xhc3MpLmdldFZhbHVlKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldChUZXN0RW10cHlCZWFuLmNsYXNzKS5nZXRWYWx1ZSgpLmlzRW1wdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlSZXF1ZXN0VG9FbnRpdHlQYXJhbVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VtcHR5UmVxdWVzdFRvRW50aXR5UGFyYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyNThiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VtcHR5UmVxdWVzdFRvRW50aXR5UGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgZm9yIEpFUlNFWS0xNTc5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eVJlcXVlc3RUb0VudGl0eVBhcmFtVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFbnRpdHlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5UmVzb3VyY2UgeworCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlKE1hcDxTdHJpbmcsIFN0cmluZz4gZW50aXR5KSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChlbnRpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlSZXF1ZXN0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5kZWxldGUoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VtcHR5UmVxdWVzdFdpdGhKYXhiVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlSZXF1ZXN0V2l0aEpheGJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjNGYwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VtcHR5UmVxdWVzdFdpdGhKYXhiVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uSmF4YkNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC5ydW5uZXJzLkVuY2xvc2VkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BSdW5XaXRoKEVuY2xvc2VkLmNsYXNzKQorcHVibGljIGNsYXNzIEVtcHR5UmVxdWVzdFdpdGhKYXhiVGVzdCB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkUGFyYW1ldGVycyIpCisgICAgQFBhdGgoIi8iKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBiZWFuKEpheGJCZWFuIGIpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ0eXBlIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgdHlwZShKYXhiQmVhblR5cGUgYikgeworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImxpc3QtYmVhbiIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIGxpc3RCZWFuKExpc3Q8SmF4YkJlYW4+IGIpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsaXN0LXR5cGUiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBsaXN0VHlwZShMaXN0PEpheGJCZWFuVHlwZT4gYikgeworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImFycmF5LWJlYW4iKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBhcnJheUJlYW4oSmF4YkJlYW5bXSBiKSB7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYXJyYXktdHlwZSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIGFycmF5VHlwZShKYXhiQmVhblR5cGVbXSBiKSB7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlSZXF1ZXN0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykucmVnaXN0ZXIobmV3IEpldHRpc29uRmVhdHVyZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEpldHRpc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlKc29uUmVxdWVzdE1hcHBlZCgpIHsKKyAgICAgICAgICAgIF90ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVhtbFJlcXVlc3QoKSB7CisgICAgICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgpOworCisgICAgICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICBjciA9IHIucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgY3IgPSByLnBhdGgoImxpc3QtYmVhbiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgY3IgPSByLnBhdGgoImxpc3QtdHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgY3IgPSByLnBhdGgoImFycmF5LWJlYW4iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgIGNyID0gci5wYXRoKCJhcnJheS10eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ1IgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEpBWEJDb250ZXh0IGNvbnRleHQ7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc1tdIGNsYXNzZXMgPSB7SmF4YkJlYW4uY2xhc3MsIEpheGJCZWFuVHlwZS5jbGFzc307CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q2xhc3M+IHR5cGVzID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KGNsYXNzZXMpKTsKKworICAgICAgICBwdWJsaWMgQ1IoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb25maWd1cmUoY2xhc3Nlcyk7CisgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEpBWEJDb250ZXh0IGNvbmZpZ3VyZShDbGFzc1tdIGNsYXNzZXMpIHRocm93cyBKQVhCRXhjZXB0aW9uOworCisgICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRDb250ZXh0KENsYXNzPD8+IG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAodHlwZXMuY29udGFpbnMob2JqZWN0VHlwZSkpID8gY29udGV4dCA6IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcHBlZEpldHRpc29uQ1JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE1hcHBlZEpldHRpc29uQ1IuY2xhc3MsIFJlc291cmNlLmNsYXNzKS5yZWdpc3RlcihuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoSmV0dGlzb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwcGVkSmV0dGlzb25DUiBleHRlbmRzIENSIHsKKworICAgICAgICAgICAgcHJvdGVjdGVkIEpBWEJDb250ZXh0IGNvbmZpZ3VyZShDbGFzc1tdIGNsYXNzZXMpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpldHRpc29uSmF4YkNvbnRleHQoSmV0dGlzb25Db25maWcubWFwcGVkSmV0dGlzb24oKS5idWlsZCgpLCBjbGFzc2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBwZWRKZXR0aXNvbkNSKCkgeworICAgICAgICAgICAgX3Rlc3QodGFyZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYWRnZXJGaXNoQ1JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEJhZGdlckZpc2hDUi5jbGFzcywgUmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihKZXR0aXNvbkZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYWRnZXJGaXNoQ1IgZXh0ZW5kcyBDUiB7CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBKQVhCQ29udGV4dCBjb25maWd1cmUoQ2xhc3NbXSBjbGFzc2VzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXR0aXNvbkpheGJDb250ZXh0KEpldHRpc29uQ29uZmlnLmJhZGdlckZpc2goKS5idWlsZCgpLCBjbGFzc2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRnZXJGaXNoQ1IoKSB7CisgICAgICAgICAgICBfdGVzdCh0YXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3QoV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICBSZXNwb25zZSBjciA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgY3IgPSB0YXJnZXQucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICBjciA9IHRhcmdldC5wYXRoKCJsaXN0LWJlYW4iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgY3IgPSB0YXJnZXQucGF0aCgibGlzdC10eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiYXBwbGljYXRpb24vanNvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGNyID0gdGFyZ2V0LnBhdGgoImFycmF5LWJlYW4iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgY3IgPSB0YXJnZXQucGF0aCgiYXJyYXktdHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9FbnRpdHlUeXBlc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VudGl0eVR5cGVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZWQ4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9FbnRpdHlUeXBlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDExNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU3RyZWFtaW5nT3V0cHV0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTXVsdGl2YWx1ZWRTdHJpbmdNYXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuRmlsZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBFbnRpdHlUeXBlc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgQFBhdGgoIklucHV0U3RyZWFtUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXRTdHJlYW1SZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIHBvc3QoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgaW50IHJlYWQ7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBieXRlWzIwNDhdOworICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gaW4ucmVhZChkYXRhKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoZGF0YSwgMCwgcmVhZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJDT05URU5UIi5nZXRCeXRlcygpKTsKKyAgICAgICAgX3Rlc3QoaW4sIElucHV0U3RyZWFtUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJTdHJpbmdSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxTdHJpbmc+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmcoKSB7CisgICAgICAgIF90ZXN0KCJDT05URU5UIiwgU3RyaW5nUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJEYXRhU291cmNlUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGF0YVNvdXJjZVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPERhdGFTb3VyY2U+IHsKKyAgICB9CisKKyAgICBAUGF0aCgiQnl0ZUFycmF5UmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnl0ZUFycmF5UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8Ynl0ZVtdPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUFycmF5UmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KCJDT05URU5UIi5nZXRCeXRlcygpLCBCeXRlQXJyYXlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIkpheGJCZWFuUmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpheGJCZWFuPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3QobmV3IEpheGJCZWFuKCJDT05URU5UIiksIEpheGJCZWFuUmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIkpheGJCZWFuUmVzb3VyY2VNZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBBUmVzb3VyY2U8SmF4YkJlYW4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uTWVkaWFUeXBlKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKSwgSmF4YkJlYW5SZXNvdXJjZU1lZGlhVHlwZS5jbGFzcywgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5SZXByZXNlbnRhdGlvbkVycm9yKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKYXhiQmVhblJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHhtbCA9ICI8cm9vdD5mb288L3Jvb3Q+IjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgY3IgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSh4bWwsICJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5UZXh0UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5UZXh0UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SmF4YkJlYW4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblRleHRSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3QobmV3IEpheGJCZWFuKCJDT05URU5UIiksIEpheGJCZWFuVGV4dFJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuVEVYVF9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhblJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8SmF4YkJlYW5UeXBlPj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhblJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKSwgSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50TGlzdFJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIEBDb25zdW1lcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudExpc3RSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+PiB7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+IGdldEpBWEJFbGVtZW50TGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0SkFYQkVsZW1lbnRBcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudExpc3RYTUxSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3RMaXN0T3JBcnJheSh0cnVlLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0TGlzdE9yQXJyYXkoZmluYWwgYm9vbGVhbiBpc0xpc3QsIGZpbmFsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICBmaW5hbCBPYmplY3QgaW4gPSBpc0xpc3QgPyBnZXRKQVhCRWxlbWVudExpc3QoKSA6IGdldEpBWEJFbGVtZW50QXJyYXkoKTsKKyAgICAgICAgZmluYWwgR2VuZXJpY1R5cGUgZ3QgPSBpc0xpc3QgPyBuZXcgR2VuZXJpY1R5cGU8TGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+Pj4oKSB7CisgICAgICAgIH0gOiBuZXcgR2VuZXJpY1R5cGU8SkFYQkVsZW1lbnQ8U3RyaW5nPltdPigpIHsKKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KGlzTGlzdCA/ICJKQVhCRWxlbWVudExpc3RSZXNvdXJjZSIgOiAiSkFYQkVsZW1lbnRBcnJheVJlc291cmNlIik7CisgICAgICAgIGZpbmFsIE9iamVjdCBvdXQgPSB0YXJnZXQucmVxdWVzdChtdCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5KGluLCBndC5nZXRUeXBlKCkpLCBtdCksIGd0KTsKKworICAgICAgICBmaW5hbCBMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+IGluTGlzdCA9IGlzTGlzdCA/ICgoTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+PikgaW4pIDogQXJyYXlzCisgICAgICAgICAgICAgICAgLmFzTGlzdCgoSkFYQkVsZW1lbnQ8U3RyaW5nPltdKSBpbik7CisgICAgICAgIGZpbmFsIExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gb3V0TGlzdCA9IGlzTGlzdCA/ICgoTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+Pikgb3V0KSA6IEFycmF5cworICAgICAgICAgICAgICAgIC5hc0xpc3QoKEpBWEJFbGVtZW50PFN0cmluZz5bXSkgb3V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMZW5ndGhzIGRpZmZlciIsIGluTGlzdC5zaXplKCksIG91dExpc3Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbkxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTmFtZXMgb2YgZWxlbWVudHMgYXQgaW5kZXggIiArIGkgKyAiIGRpZmZlciIsIGluTGlzdC5nZXQoaSkuZ2V0TmFtZSgpLCBvdXRMaXN0LmdldChpKS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJWYWx1ZXMgb2YgZWxlbWVudHMgYXQgaW5kZXggIiArIGkgKyAiIGRpZmZlciIsIGluTGlzdC5nZXQoaSkuZ2V0VmFsdWUoKSwgb3V0TGlzdC5nZXQoaSkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudExpc3RKU09OUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0TGlzdE9yQXJyYXkodHJ1ZSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QXJyYXlSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRBcnJheVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PFN0cmluZz5bXT4geworICAgIH0KKworICAgIHByaXZhdGUgSkFYQkVsZW1lbnQ8U3RyaW5nPltdIGdldEpBWEJFbGVtZW50QXJyYXkoKSB7CisgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnRbXSB7CisgICAgICAgICAgICAgICAgbmV3IEpBWEJFbGVtZW50KFFOYW1lLnZhbHVlT2YoImVsZW1lbnQxIiksIFN0cmluZy5jbGFzcywgImFob2oiKSwKKyAgICAgICAgICAgICAgICBuZXcgSkFYQkVsZW1lbnQoUU5hbWUudmFsdWVPZigiZWxlbWVudDIiKSwgU3RyaW5nLmNsYXNzLCAibmF6ZGFyIikKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEFycmF5WE1MUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0TGlzdE9yQXJyYXkoZmFsc2UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRBcnJheUpTT05SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3RMaXN0T3JBcnJheShmYWxzZSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhblJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZU1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb25NZWRpYVR5cGUoKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZU1lZGlhVHlwZS5jbGFzcywgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb25FcnJvcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2UiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgeG1sID0gIjxyb290Pjx2YWx1ZT5mb28iOworICAgICAgICBmaW5hbCBSZXNwb25zZSBjciA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHhtbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudEJlYW5UZXh0UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuVGV4dFJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PEpheGJCZWFuVHlwZT4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5UZXh0UmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKQVhCRWxlbWVudEJlYW5UZXh0UmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZUF0b20iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYXRvbSt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vYXRvbSt4bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZUF0b20gZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8SmF4YkJlYW4+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5SZXByZXNlbnRhdGlvbk1lZGlhVHlwZUF0b20oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKYXhiQmVhblJlc291cmNlQXRvbS5jbGFzcywgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2F0b20reG1sIikpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCVHlwZVJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQlR5cGVSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEpheGJCZWFuIHBvc3QoZmluYWwgSmF4YkJlYW5UeXBlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmF4YkJlYW4odC52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gKChSZXNvdXJjZUNvbmZpZykgc3VwZXIuY29uZmlndXJlKCkpLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgc3VwZXIuY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJUeXBlUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJUeXBlUmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW5UeXBlIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24veG1sIiksIEpheGJCZWFuVHlwZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQlR5cGVSZXNvdXJjZU1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQlR5cGVSZXNvdXJjZU1lZGlhVHlwZSBleHRlbmRzIEpBWEJUeXBlUmVzb3VyY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJUeXBlUmVwcmVzZW50YXRpb25NZWRpYVR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJUeXBlUmVzb3VyY2VNZWRpYVR5cGUiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW5UeXBlIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBKYXhiQmVhblR5cGUuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJPYmplY3RSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJPYmplY3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIE9iamVjdCBwb3N0KGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQk9iamVjdFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPEpBWEJDb250ZXh0PiB7CisKKyAgICAgICAgcHVibGljIEpBWEJDb250ZXh0IGdldENvbnRleHQoZmluYWwgQ2xhc3M8Pz4gYykgeworICAgICAgICAgICAgaWYgKE9iamVjdC5jbGFzcyA9PSBjKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBKQVhCRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT2JqZWN0UmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJPYmplY3RSZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBPYmplY3QgaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi94bWwiKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4sIG91dCk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJPYmplY3RSZXNvdXJjZU1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQk9iamVjdFJlc291cmNlTWVkaWFUeXBlIGV4dGVuZHMgSkFYQk9iamVjdFJlc291cmNlIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT2JqZWN0UmVwcmVzZW50YXRpb25NZWRpYVR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJPYmplY3RSZXNvdXJjZU1lZGlhVHlwZSIpOworICAgICAgICBmaW5hbCBPYmplY3QgaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLCBvdXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJPYmplY3RSZXByZXNlbnRhdGlvbkVycm9yKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCT2JqZWN0UmVzb3VyY2UiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgeG1sID0gIjxyb290PmZvbzwvcm9vdD4iOworICAgICAgICBmaW5hbCBSZXNwb25zZSBjciA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHhtbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCJGaWxlUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEZpbGU+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlUmVwcmVzZW50YXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlUHJvdmlkZXIgZnAgPSBuZXcgRmlsZVByb3ZpZGVyKCk7CisgICAgICAgIGZpbmFsIEZpbGUgaW4gPSBmcC5yZWFkRnJvbShGaWxlLmNsYXNzLCBGaWxlLmNsYXNzLCBudWxsLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiQ09OVEVOVCIuZ2V0Qnl0ZXMoKSkpOworCisgICAgICAgIF90ZXN0KGluLCBGaWxlUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgQFBhdGgoIkZvcm1SZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8Rm9ybT4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgRm9ybSBmcCA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZwLnBhcmFtKCJFbWFpbCIsICJqb2huZG9lQGdtYWlsLmNvbSIpOworICAgICAgICBmcC5wYXJhbSgiUGFzc3dkIiwgIm5vcnRoIDIzQVoiKTsKKyAgICAgICAgZnAucGFyYW0oInNlcnZpY2UiLCAiY2wiKTsKKyAgICAgICAgZnAucGFyYW0oInNvdXJjZSIsICJHdWxwLUNhbEd1bC0xLjA1Iik7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiRm9ybVJlc291cmNlIik7CisgICAgICAgIGZpbmFsIEZvcm0gcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShmcCwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSwgRm9ybS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZwLmFzTWFwKCkuc2l6ZSgpLCByZXNwb25zZS5hc01hcCgpLnNpemUoKSk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGZwLmFzTWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHMgPSByZXNwb25zZS5hc01hcCgpLmdldChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cnkuZ2V0VmFsdWUoKS5zaXplKCksIHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdDEgPSBlbnRyeS5nZXRWYWx1ZSgpLmxpc3RJdGVyYXRvcigpLCBpdDIgPSBzLmxpc3RJdGVyYXRvcigpOyBpdDEuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaXQxLm5leHQoKSwgaXQyLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQFBhdGgoIkpTT05PYmplY3RSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKU09OT2JqZWN0UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SlNPTk9iamVjdD4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpTT05PYmplY3RSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBKU09OT2JqZWN0IG9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisgICAgICAgIG9iamVjdC5wdXQoInVzZXJpZCIsIDEyMzQpCisgICAgICAgICAgICAgICAgLnB1dCgidXNlcm5hbWUiLCAiMTIzNCIpCisgICAgICAgICAgICAgICAgLnB1dCgiZW1haWwiLCAiYUBiIikKKyAgICAgICAgICAgICAgICAucHV0KCJwYXNzd29yZCIsICIqKioqIik7CisKKyAgICAgICAgX3Rlc3Qob2JqZWN0LCBKU09OT2JqZWN0UmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpOworICAgIH0KKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veHh4K2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veHh4K2pzb24iKQorICAgIEBQYXRoKCJKU09OT2JqZWN0UmVzb3VyY2VHZW5lcmFsTWVkaWFUeXBlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpTT05PYmplY3RSZXNvdXJjZUdlbmVyYWxNZWRpYVR5cGUgZXh0ZW5kcyBBUmVzb3VyY2U8SlNPTk9iamVjdD4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpTT05PYmplY3RSZXByZXNlbnRhdGlvbkdlbmVyYWxNZWRpYVR5cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBKU09OT2JqZWN0IG9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisgICAgICAgIG9iamVjdC5wdXQoInVzZXJpZCIsIDEyMzQpCisgICAgICAgICAgICAgICAgLnB1dCgidXNlcm5hbWUiLCAiMTIzNCIpCisgICAgICAgICAgICAgICAgLnB1dCgiZW1haWwiLCAiYUBiIikKKyAgICAgICAgICAgICAgICAucHV0KCJwYXNzd29yZCIsICIqKioqIik7CisKKyAgICAgICAgX3Rlc3Qob2JqZWN0LCBKU09OT2JqZWN0UmVzb3VyY2VHZW5lcmFsTWVkaWFUeXBlLmNsYXNzLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24veHh4K2pzb24iKSk7CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBQYXRoKCJKU09OT0FycmF5UmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSlNPTk9BcnJheVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpTT05BcnJheT4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpTT05BcnJheVJlcHJlc2VudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEpTT05BcnJheSBhcnJheSA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgYXJyYXkucHV0KCJPbmUiKS5wdXQoIlR3byIpLnB1dCgiVGhyZWUiKS5wdXQoMSkucHV0KDIuMCk7CisKKyAgICAgICAgX3Rlc3QoYXJyYXksIEpTT05PQXJyYXlSZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94eHgranNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94eHgranNvbiIpCisgICAgQFBhdGgoIkpTT05PQXJyYXlSZXNvdXJjZUdlbmVyYWxNZWRpYVR5cGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSlNPTk9BcnJheVJlc291cmNlR2VuZXJhbE1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKU09OQXJyYXk+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKU09OQXJyYXlSZXByZXNlbnRhdGlvbkdlbmVyYWxNZWRpYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSlNPTkFycmF5IGFycmF5ID0gbmV3IEpTT05BcnJheSgpOworICAgICAgICBhcnJheS5wdXQoIk9uZSIpLnB1dCgiVHdvIikucHV0KCJUaHJlZSIpLnB1dCgxKS5wdXQoMi4wKTsKKworICAgICAgICBfdGVzdChhcnJheSwgSlNPTk9BcnJheVJlc291cmNlR2VuZXJhbE1lZGlhVHlwZS5jbGFzcywgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL3h4eCtqc29uIikpOworICAgIH0KKworICAgIC8vICAgIEBQYXRoKCJGZWVkUmVzb3VyY2UiKQorICAgIC8vICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmVlZFJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEZlZWQ+IHsKKyAgICAvLyAgICB9CisgICAgLy8KKyAgICAvLyAgICBAVGVzdAorICAgIC8vICAgIHB1YmxpYyB2b2lkIHRlc3RGZWVkUmVwcmVzZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZmVlZC54bWwiKTsKKyAgICAvLyAgICAgICAgQXRvbUZlZWRQcm92aWRlciBhZnAgPSBuZXcgQXRvbUZlZWRQcm92aWRlcigpOworICAgIC8vICAgICAgICBGZWVkIGYgPSBhZnAucmVhZEZyb20oRmVlZC5jbGFzcywgRmVlZC5jbGFzcywgbnVsbCwgbnVsbCwgbnVsbCwgaW4pOworICAgIC8vCisgICAgLy8gICAgICAgIF90ZXN0KGYsIEZlZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgLy8gICAgfQorICAgIC8vCisgICAgLy8gICAgQFBhdGgoIkVudHJ5UmVzb3VyY2UiKQorICAgIC8vICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50cnlSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxFbnRyeT4geworICAgIC8vICAgIH0KKyAgICAvLworICAgIC8vICAgIEBUZXN0CisgICAgLy8gICAgcHVibGljIHZvaWQgdGVzdEVudHJ5UmVwcmVzZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAvLyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZW50cnkueG1sIik7CisgICAgLy8gICAgICAgIEF0b21FbnRyeVByb3ZpZGVyIGFmcCA9IG5ldyBBdG9tRW50cnlQcm92aWRlcigpOworICAgIC8vICAgICAgICBFbnRyeSBlID0gYWZwLnJlYWRGcm9tKEVudHJ5LmNsYXNzLCBFbnRyeS5jbGFzcywgbnVsbCwgbnVsbCwgbnVsbCwgaW4pOworICAgIC8vCisgICAgLy8gICAgICAgIF90ZXN0KGUsIEVudHJ5UmVzb3VyY2UuY2xhc3MpOworICAgIC8vICAgIH0KKworICAgIEBQYXRoKCJSZWFkZXJSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWFkZXJSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxSZWFkZXI+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdChuZXcgU3RyaW5nUmVhZGVyKCJDT05URU5UIiksIFJlYWRlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1VNRU5UID0gIjxuOnggeG1sbnM6bj1cInVybjpuXCI+PG46ZT5DT05UTkVUPC9uOmU+PC9uOng+IjsKKworICAgIEBQYXRoKCJTdHJlYW1Tb3VyY2VSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1Tb3VyY2VSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxTdHJlYW1Tb3VyY2U+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1Tb3VyY2VSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJlYW1Tb3VyY2Ugc3MgPSBuZXcgU3RyZWFtU291cmNlKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShYTUxfRE9DVU1FTlQuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBfdGVzdChzcywgU3RyZWFtU291cmNlUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJTQVhTb3VyY2VSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTQVhTb3VyY2VSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxTQVhTb3VyY2U+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTQVhTb3VyY2VSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJlYW1Tb3VyY2Ugc3MgPSBuZXcgU3RyZWFtU291cmNlKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShYTUxfRE9DVU1FTlQuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBfdGVzdChzcywgU0FYU291cmNlUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJET01Tb3VyY2VSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBET01Tb3VyY2VSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxET01Tb3VyY2U+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RET01Tb3VyY2VSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihYTUxfRE9DVU1FTlQpKSk7CisgICAgICAgIGZpbmFsIERPTVNvdXJjZSBkcyA9IG5ldyBET01Tb3VyY2UoZCk7CisgICAgICAgIF90ZXN0KGRzLCBET01Tb3VyY2VSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIkRvY3VtZW50UmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG9jdW1lbnRSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxEb2N1bWVudD4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvY3VtZW50UmVwcmVzZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIoWE1MX0RPQ1VNRU5UKSkpOworICAgICAgICBfdGVzdChkLCBEb2N1bWVudFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiRm9ybU11bHRpdmFsdWVkTWFwUmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtTXVsdGl2YWx1ZWRNYXBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwb3N0KGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1NdWx0aXZhbHVlZE1hcFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZnAgPSBuZXcgTXVsdGl2YWx1ZWRTdHJpbmdNYXAoKTsKKyAgICAgICAgZnAuYWRkKCJFbWFpbCIsICJqb2huZG9lQGdtYWlsLmNvbSIpOworICAgICAgICBmcC5hZGQoIlBhc3N3ZCIsICJub3J0aCAyM0FaIik7CisgICAgICAgIGZwLmFkZCgic2VydmljZSIsICJjbCIpOworICAgICAgICBmcC5hZGQoInNvdXJjZSIsICJHdWxwLUNhbEd1bC0xLjA1Iik7CisgICAgICAgIGZwLmFkZCgic291cmNlIiwgImZvby5qYXZhIik7CisgICAgICAgIGZwLmFkZCgic291cmNlIiwgImJhci5qYXZhIik7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiRm9ybU11bHRpdmFsdWVkTWFwUmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXAgX2ZwID0gdGFyZ2V0LnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZnAsICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwgTXVsdGl2YWx1ZWRNYXAuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoZnAsIF9mcCk7CisgICAgfQorCisgICAgQFBhdGgoIlN0cmVhbWluZ091dHB1dFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmVhbWluZ091dHB1dFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJlYW1pbmdPdXRwdXQgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1pbmdPdXRwdXQoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgZW50aXR5LndyaXRlKCJDT05URU5UIi5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtaW5nT3V0cHV0UmVwcmVzZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiU3RyZWFtaW5nT3V0cHV0UmVzb3VyY2UiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDT05URU5UIiwgdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhbkpTT05SZXNvdXJjZSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuSlNPTlJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PFN0cmluZz4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5KU09OUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJFbGVtZW50QmVhbkpTT05SZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJpYiA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdCgKKyAgICAgICAgICAgICAgICBFbnRpdHkuZW50aXR5KG5ldyBKQVhCRWxlbWVudDw+KG5ldyBRTmFtZSgidGVzdCIpLCBTdHJpbmcuY2xhc3MsICJDT05URU5UIiksICJhcHBsaWNhdGlvbi9qc29uIikpOworCisgICAgICAgIC8vIFRPRE86IHRoZSBmb2xsb3dpbmcgd291bGQgbm90IGJlIG5lZWRlZCBpZiBpIGtuZXcgaG93IHRvIHdvcmthcm91bmQgSkFYQkVsZW1lbnQ8U3RyaW5nPi5jbGFzcyBsaXRlcmFsCisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGluQnl0ZXMgPSBnZXRSZXF1ZXN0RW50aXR5KCk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBvdXRCeXRlcyA9IGdldEVudGl0eUFzQnl0ZUFycmF5KHJpYik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmcob3V0Qnl0ZXMpLCBpbkJ5dGVzLmxlbmd0aCwgb3V0Qnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbkJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5CeXRlc1tpXSAhPSBvdXRCeXRlc1tpXSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5kZXg6ICIgKyBpLCBpbkJ5dGVzW2ldLCBvdXRCeXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZUpTT04iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VKU09OIGV4dGVuZHMgQVJlc291cmNlPEpheGJCZWFuPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5SZXByZXNlbnRhdGlvbkpTT04oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpheGJCZWFuUmVzb3VyY2VKU09OIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vanNvbiIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUgZXh0ZW5kcyBBUmVzb3VyY2U8SmF4YkJlYW4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uSlNPTk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSmF4YkJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mb28ranNvbiIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUpTT04gZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8SmF4YkJlYW5UeXBlPj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhblJlcHJlc2VudGF0aW9uSlNPTigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vanNvbiIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50QmVhblJlc291cmNlSlNPTk1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb25KU09OTWVkaWFUeXBlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mb28ranNvbiIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQlR5cGVSZXNvdXJjZUpTT04iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJUeXBlUmVzb3VyY2VKU09OIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gcG9zdChmaW5hbCBKYXhiQmVhblR5cGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXhiQmVhbih0LnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJUeXBlUmVwcmVzZW50YXRpb25KU09OKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCVHlwZVJlc291cmNlSlNPTiIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhblR5cGUgb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9qc29uIiksIEpheGJCZWFuVHlwZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQlR5cGVSZXNvdXJjZUpTT05NZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQlR5cGVSZXNvdXJjZUpTT05NZWRpYVR5cGUgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbiBwb3N0KGZpbmFsIEpheGJCZWFuVHlwZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpheGJCZWFuKHQudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlR5cGVSZXByZXNlbnRhdGlvbkpTT05NZWRpYVR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJUeXBlUmVzb3VyY2VKU09OTWVkaWFUeXBlIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuVHlwZSBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zvbytqc29uIiksIEpheGJCZWFuVHlwZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZUZhc3RJbmZvc2V0IikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VGYXN0SW5mb3NldCBleHRlbmRzIEFSZXNvdXJjZTxKYXhiQmVhbj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiVE9ETzogdW5pZ25vcmUgb25jZSBmaSBzdXBwb3J0IGltcGxlbWVudGVkIChKRVJTRVktMTE5MCkiKQorICAgIC8vIFRPRE86IHVuaWdub3JlIG9uY2UgZmkgc3VwcG9ydCBpbXBsZW1lbnRlZCAoSkVSU0VZLTExOTApCisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuUmVwcmVzZW50YXRpb25GYXN0SW5mb3NldCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSmF4YkJlYW5SZXNvdXJjZUZhc3RJbmZvc2V0Iik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhblJlc291cmNlRmFzdEluZm9zZXQiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VGYXN0SW5mb3NldCBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJUT0RPOiB1bmlnbm9yZSBvbmNlIGZpIHN1cHBvcnQgaW1wbGVtZW50ZWQgKEpFUlNFWS0xMTkwKSIpCisgICAgLy8gVE9ETzogdW5pZ25vcmUgb25jZSBmaSBzdXBwb3J0IGltcGxlbWVudGVkIChKRVJTRVktMTE5MCkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb25GYXN0SW5mb3NldCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VGYXN0SW5mb3NldCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IiksIEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCVHlwZVJlc291cmNlRmFzdEluZm9zZXQiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQlR5cGVSZXNvdXJjZUZhc3RJbmZvc2V0IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gcG9zdChmaW5hbCBKYXhiQmVhblR5cGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXhiQmVhbih0LnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiVE9ETzogdW5pZ25vcmUgb25jZSBmaSBzdXBwb3J0IGltcGxlbWVudGVkIChKRVJTRVktMTE5MCkiKQorICAgIC8vIFRPRE86IHVuaWdub3JlIG9uY2UgZmkgc3VwcG9ydCBpbXBsZW1lbnRlZCAoSkVSU0VZLTExOTApCisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJUeXBlUmVwcmVzZW50YXRpb25GYXN0SW5mb3NldCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQlR5cGVSZXNvdXJjZUZhc3RJbmZvc2V0Iik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuVHlwZSBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IiksIEpheGJCZWFuVHlwZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkxpc3RSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBMaXN0PEpheGJCZWFuPiBwb3N0KGZpbmFsIExpc3Q8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInNldCIpCisgICAgICAgIHB1YmxpYyBTZXQ8SmF4YkJlYW4+IHBvc3RTZXQoZmluYWwgU2V0PEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJxdWV1ZSIpCisgICAgICAgIHB1YmxpYyBRdWV1ZTxKYXhiQmVhbj4gcG9zdFF1ZXVlKGZpbmFsIFF1ZXVlPEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzdGFjayIpCisgICAgICAgIHB1YmxpYyBTdGFjazxKYXhiQmVhbj4gcG9zdFN0YWNrKGZpbmFsIFN0YWNrPEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjdXN0b20iKQorICAgICAgICBwdWJsaWMgTXlBcnJheUxpc3Q8SmF4YkJlYW4+IHBvc3RDdXN0b20oZmluYWwgTXlBcnJheUxpc3Q8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxKYXhiQmVhbj4gZ2V0KCkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEpheGJCZWFuPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oIm9uZSIpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigidHdvIikpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJ0aHJlZSIpKTsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInR5cGUiKQorICAgICAgICBwdWJsaWMgTGlzdDxKYXhiQmVhbj4gcG9zdFR5cGUoZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhblR5cGU+IGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SmF4YkJlYW4+IGJlYW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEpheGJCZWFuVHlwZSB0IDogbCkgeworICAgICAgICAgICAgICAgIGJlYW5zLmFkZChuZXcgSmF4YkJlYW4odC52YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJlYW5zOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJBcnJheVJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkFycmF5UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbltdIHBvc3QoZmluYWwgSmF4YkJlYW5bXSBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIEpheGJCZWFuW10gZ2V0KCkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEpheGJCZWFuPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oIm9uZSIpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigidHdvIikpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJ0aHJlZSIpKTsKKyAgICAgICAgICAgIHJldHVybiBsLnRvQXJyYXkobmV3IEpheGJCZWFuW2wuc2l6ZSgpXSk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidHlwZSIpCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbltdIHBvc3RUeXBlKGZpbmFsIEpheGJCZWFuVHlwZVtdIGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SmF4YkJlYW4+IGJlYW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEpheGJCZWFuVHlwZSB0IDogbCkgeworICAgICAgICAgICAgICAgIGJlYW5zLmFkZChuZXcgSmF4YkJlYW4odC52YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJlYW5zLnRvQXJyYXkobmV3IEpheGJCZWFuW2JlYW5zLnNpemUoKV0pOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkFycmF5UmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJBcnJheVJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgSmF4YkJlYW5bXSBhID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoSmF4YkJlYW5bXS5jbGFzcyk7CisgICAgICAgIEpheGJCZWFuW10gYiA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGEsICJhcHBsaWNhdGlvbi94bWwiKSwgSmF4YkJlYW5bXS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmxlbmd0aCwgYi5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhW2ldLCBiW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYSwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhbltdLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFbaV0sIGJbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2VNZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBKQVhCTGlzdFJlc291cmNlIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCTGlzdFJlcHJlc2VudGF0aW9uTWVkaWFUeXBlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlTWVkaWFUeXBlIik7CisKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGIgPSB0YXJnZXQucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfSwgImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGEgPSBuZXcgTGlua2VkTGlzdDw+KGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInF1ZXVlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxRdWV1ZTxKYXhiQmVhbj4+KChRdWV1ZTxKYXhiQmVhbj4pIGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSwgbmV3IEdlbmVyaWNUeXBlPFF1ZXVlPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYSA9IG5ldyBIYXNoU2V0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic2V0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxTZXQ8SmF4YkJlYW4+PigoU2V0PEpheGJCZWFuPikgYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8U2V0PEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBDb21wYXJhdG9yPEpheGJCZWFuPiBjID0gbmV3IENvbXBhcmF0b3I8SmF4YkJlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgSmF4YkJlYW4gdCwgZmluYWwgSmF4YkJlYW4gdDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZS5jb21wYXJlVG8odDEudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBUcmVlU2V0PEpheGJCZWFuPiB0MSA9IG5ldyBUcmVlU2V0PD4oYyk7CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8SmF4YkJlYW4+IHQyID0gbmV3IFRyZWVTZXQ8PihjKTsKKyAgICAgICAgdDEuYWRkQWxsKGEpOworICAgICAgICB0Mi5hZGRBbGwoYik7CisgICAgICAgIGFzc2VydEVxdWFscyh0MSwgdDIpOworCisgICAgICAgIGZpbmFsIFN0YWNrPEpheGJCZWFuPiBzID0gbmV3IFN0YWNrPD4oKTsKKyAgICAgICAgcy5hZGRBbGwoYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic3RhY2siKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFN0YWNrPEpheGJCZWFuPj4ocykgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8U3RhY2s8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBiKTsKKworICAgICAgICBhID0gbmV3IE15QXJyYXlMaXN0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgiY3VzdG9tIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxNeUFycmF5TGlzdDxKYXhiQmVhbj4+KChNeUFycmF5TGlzdDxKYXhiQmVhbj4pIGEpIHsKKyAgICAgICAgICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8TXlBcnJheUxpc3Q8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25FcnJvcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB4bWwgPSAiPHJvb3Q+PHZhbHVlPmZvbyI7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNyID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoeG1sLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2VGYXN0SW5mb3NldCIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlRmFzdEluZm9zZXQgZXh0ZW5kcyBKQVhCTGlzdFJlc291cmNlIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPLCB0aGUgdW5tYXJzaGFsbGluZyBmYWlscy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlRPRE86IHVuaWdub3JlIG9uY2UgZmkgc3VwcG9ydCBpbXBsZW1lbnRlZCAoSkVSU0VZLTExOTApIikKKyAgICAvLyBUT0RPOiB1bmlnbm9yZSBvbmNlIGZpIHN1cHBvcnQgaW1wbGVtZW50ZWQgKEpFUlNFWS0xMTkwKQorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCTGlzdFJlcHJlc2VudGF0aW9uRmFzdEluZm9zZXQoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJMaXN0UmVzb3VyY2VGYXN0SW5mb3NldCIpOworCisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGEgPSB0YXJnZXQucmVxdWVzdCgpLmdldChuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKworICAgICAgICBDb2xsZWN0aW9uPEpheGJCZWFuPiBiID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHsKKyAgICAgICAgICAgICAgICB9LCAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IiksIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYSA9IG5ldyBMaW5rZWRMaXN0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgicXVldWUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFF1ZXVlPEpheGJCZWFuPj4oKFF1ZXVlPEpheGJCZWFuPikgYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSwgbmV3IEdlbmVyaWNUeXBlPFF1ZXVlPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYSA9IG5ldyBIYXNoU2V0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic2V0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxTZXQ8SmF4YkJlYW4+PigoU2V0PEpheGJCZWFuPikgYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSwgbmV3IEdlbmVyaWNUeXBlPFNldDxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgQ29tcGFyYXRvcjxKYXhiQmVhbj4gYyA9IG5ldyBDb21wYXJhdG9yPEpheGJCZWFuPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIEpheGJCZWFuIHQsIGZpbmFsIEpheGJCZWFuIHQxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQudmFsdWUuY29tcGFyZVRvKHQxLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgVHJlZVNldDxKYXhiQmVhbj4gdDEgPSBuZXcgVHJlZVNldDw+KGMpOworICAgICAgICBmaW5hbCBUcmVlU2V0PEpheGJCZWFuPiB0MiA9IG5ldyBUcmVlU2V0PD4oYyk7CisgICAgICAgIHQxLmFkZEFsbChhKTsKKyAgICAgICAgdDIuYWRkQWxsKGIpOworICAgICAgICBhc3NlcnRFcXVhbHModDEsIHQyKTsKKworICAgICAgICBmaW5hbCBTdGFjazxKYXhiQmVhbj4gcyA9IG5ldyBTdGFjazw+KCk7CisgICAgICAgIHMuYWRkQWxsKGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInN0YWNrIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxTdGFjazxKYXhiQmVhbj4+KHMpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IiksIG5ldyBHZW5lcmljVHlwZTxTdGFjazxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIGIpOworCisgICAgICAgIGEgPSBuZXcgTXlBcnJheUxpc3Q8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJjdXN0b20iKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PE15QXJyYXlMaXN0PEpheGJCZWFuPj4oKE15QXJyYXlMaXN0PEpheGJCZWFuPikgYSkgeworICAgICAgICAgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpLCBuZXcgR2VuZXJpY1R5cGU8TXlBcnJheUxpc3Q8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCTGlzdFJlc291cmNlSlNPTiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkxpc3RSZXNvdXJjZUpTT04gZXh0ZW5kcyBKQVhCTGlzdFJlc291cmNlIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCTGlzdFJlcHJlc2VudGF0aW9uSlNPTigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlSlNPTiIpOworCisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGEgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBDb2xsZWN0aW9uPEpheGJCZWFuPiBiID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICBhID0gbmV3IExpbmtlZExpc3Q8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJxdWV1ZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8UXVldWU8SmF4YkJlYW4+PigoUXVldWU8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9qc29uIiksIG5ldyBHZW5lcmljVHlwZTxRdWV1ZTxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGEgPSBuZXcgSGFzaFNldDw+KGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInNldCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8U2V0PEpheGJCZWFuPj4oKFNldDxKYXhiQmVhbj4pIGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPFNldDxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgQ29tcGFyYXRvcjxKYXhiQmVhbj4gYyA9IG5ldyBDb21wYXJhdG9yPEpheGJCZWFuPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIEpheGJCZWFuIHQsIGZpbmFsIEpheGJCZWFuIHQxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQudmFsdWUuY29tcGFyZVRvKHQxLnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgVHJlZVNldDxKYXhiQmVhbj4gdDEgPSBuZXcgVHJlZVNldDw+KGMpOworICAgICAgICBmaW5hbCBUcmVlU2V0PEpheGJCZWFuPiB0MiA9IG5ldyBUcmVlU2V0PD4oYyk7CisgICAgICAgIHQxLmFkZEFsbChhKTsKKyAgICAgICAgdDIuYWRkQWxsKGIpOworICAgICAgICBhc3NlcnRFcXVhbHModDEsIHQyKTsKKworICAgICAgICBmaW5hbCBTdGFjazxKYXhiQmVhbj4gcyA9IG5ldyBTdGFjazw+KCk7CisgICAgICAgIHMuYWRkQWxsKGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInN0YWNrIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxTdGFjazxKYXhiQmVhbj4+KHMpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPFN0YWNrPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMocywgYik7CisKKyAgICAgICAgYSA9IG5ldyBNeUFycmF5TGlzdDw+KGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoImN1c3RvbSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8TXlBcnJheUxpc3Q8SmF4YkJlYW4+PigoTXlBcnJheUxpc3Q8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgICAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPE15QXJyYXlMaXN0PEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICAvLyBUT0RPOiB3b3VsZCBiZSBuaWNlIHRvIHByb2R1Y2UvY29uc3VtZSBhIHJlYWwgSlNPTiBhcnJheSBsaWtlIGZvbGxvd2luZworICAgICAgICAvLyBpbnN0ZWFkIG9mIHdoYXQgd2UgaGF2ZSBub3c6CisgICAgICAgIC8vICAgICAgICBKU09OQXJyYXkgYSA9IHIuZ2V0KEpTT05BcnJheS5jbGFzcyk7CisgICAgICAgIC8vICAgICAgICBKU09OQXJyYXkgYiA9IG5ldyBKU09OQXJyYXkoKS4KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgcHV0KG5ldyBKU09OT2JqZWN0KCkucHV0KCJ2YWx1ZSIsICJvbmUiKSkuCisgICAgICAgIC8vICAgICAgICAgICAgICAgIHB1dChuZXcgSlNPTk9iamVjdCgpLnB1dCgidmFsdWUiLCAidHdvIikpLgorICAgICAgICAvLyAgICAgICAgICAgICAgICBwdXQobmV3IEpTT05PYmplY3QoKS5wdXQoInZhbHVlIiwgInRocmVlIikpOworICAgICAgICAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKGEudG9TdHJpbmcoKSwgYi50b1N0cmluZygpKTsKKyAgICAgICAgLy8gICAgICAgIEpTT05BcnJheSBjID0gci5wb3N0KEpTT05BcnJheS5jbGFzcywgYik7CisgICAgICAgIC8vICAgICAgICBhc3NlcnRFcXVhbHMoYS50b1N0cmluZygpLCBjLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCTGlzdFJlc291cmNlSlNPTk1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlSlNPTk1lZGlhVHlwZSBleHRlbmRzIEpBWEJMaXN0UmVzb3VyY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25KU09OTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJMaXN0UmVzb3VyY2VKU09OTWVkaWFUeXBlIik7CisKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGIgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2Zvbytqc29uIiksIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgLy8gVE9ETzogd291bGQgYmUgbmljZSB0byBwcm9kdWNlL2NvbnN1bWUgYSByZWFsIEpTT04gYXJyYXkgbGlrZSBmb2xsb3dpbmcKKyAgICAgICAgLy8gaW5zdGVhZCBvZiB3aGF0IHdlIGhhdmUgbm93OgorICAgICAgICAvLyAgICAgICAgSlNPTkFycmF5IGEgPSByLmdldChKU09OQXJyYXkuY2xhc3MpOworICAgICAgICAvLyAgICAgICAgSlNPTkFycmF5IGIgPSBuZXcgSlNPTkFycmF5KCkuCisgICAgICAgIC8vICAgICAgICAgICAgICAgIHB1dChuZXcgSlNPTk9iamVjdCgpLnB1dCgidmFsdWUiLCAib25lIikpLgorICAgICAgICAvLyAgICAgICAgICAgICAgICBwdXQobmV3IEpTT05PYmplY3QoKS5wdXQoInZhbHVlIiwgInR3byIpKS4KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgcHV0KG5ldyBKU09OT2JqZWN0KCkucHV0KCJ2YWx1ZSIsICJ0aHJlZSIpKTsKKyAgICAgICAgLy8gICAgICAgIGFzc2VydEVxdWFscyhhLnRvU3RyaW5nKCksIGIudG9TdHJpbmcoKSk7CisgICAgICAgIC8vICAgICAgICBKU09OQXJyYXkgYyA9IHIucG9zdChKU09OQXJyYXkuY2xhc3MsIGIpOworICAgICAgICAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKGEudG9TdHJpbmcoKSwgYy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL05vQ29udGVudFR5cGVKQVhCUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9Db250ZW50VHlwZUpBWEJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEpheGJCZWFuIHBvc3QoQENvbnRleHQgZmluYWwgSHR0cEhlYWRlcnMgaGVhZGVycywgZmluYWwgSmF4YkJlYW4gYmVhbikgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChoZWFkZXJzLmdldE1lZGlhVHlwZSgpLCBpcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKyAgICAgICAgICAgIHJldHVybiBiZWFuOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Db250ZW50VHlwZUpheGJFbnRpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgiTm9Db250ZW50VHlwZUpBWEJSZXNvdXJjZSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLnBvc3QoRW50aXR5LnhtbChuZXcgSmF4YkJlYW4oImZvbyIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZWRpYVR5cGUoKSwKKyAgICAgICAgICAgICAgICBpcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9HZW5lcmljVHlwZUFuZEVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0dlbmVyaWNUeXBlQW5kRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDkyODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9HZW5lcmljVHlwZUFuZEVudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5SZWFkZXJXcml0ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY1R5cGVBbmRFbnRpdHlUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgIEBQcm92aWRlcgorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaXN0SW50ZWdlcldyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPExpc3Q8SW50ZWdlcj4+LCBNZXNzYWdlQm9keVdyaXRlcjxMaXN0PEludGVnZXI+PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHQ7CisKKyAgICAgICAgcHVibGljIExpc3RJbnRlZ2VyV3JpdGVyKCkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxJbnRlZ2VyPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmaW5hbCBHZW5lcmljRW50aXR5PExpc3Q8SW50ZWdlcj4+IGdlID0gbmV3IEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4obCkge307CisgICAgICAgICAgICB0aGlzLnQgPSBnZS5nZXRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiBjLCBmaW5hbCBUeXBlIHQsIGZpbmFsIEFubm90YXRpb25bXSBhcywgZmluYWwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy50LmVxdWFscyh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgTGlzdDxJbnRlZ2VyPiBsLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBMaXN0PEludGVnZXI+IGwsIGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIFR5cGUgdCwgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtdCwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEludGVnZXIgaSA6IGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LndyaXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudC5lcXVhbHMoZ2VuZXJpY1R5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IHJlYWRGcm9tKGZpbmFsIENsYXNzPExpc3Q8SW50ZWdlcj4+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpLnNwbGl0KCIsIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChpbnB1dCAtPiBJbnRlZ2VyLnZhbHVlT2YoaW5wdXQudHJpbSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJpY0xpc3RSZXNvdXJjZTxUPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImdlbmVyaWNUeXBlIikKKyAgICAgICAgcHVibGljIExpc3Q8VD4gcG9zdChmaW5hbCBMaXN0PFQ+IHBvc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3N0OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkxpc3RSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaXN0UmVzb3VyY2UgZXh0ZW5kcyBHZW5lcmljTGlzdFJlc291cmNlPEludGVnZXI+IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0eXBlIikKKyAgICAgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gdHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZ2VuZXJpY0VudGl0eSIpCisgICAgICAgIHB1YmxpYyBHZW5lcmljRW50aXR5PExpc3Q8SW50ZWdlcj4+IGdlbmVyaWNFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4oQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSkge307CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJvYmplY3QiKQorICAgICAgICBwdWJsaWMgT2JqZWN0IG9iamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0VudGl0eTxMaXN0PEludGVnZXI+PihBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpKSB7fTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHJlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG5ldyBHZW5lcmljRW50aXR5PExpc3Q8SW50ZWdlcj4+KEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCkpIHt9KS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgid3JvbmdHZW5lcmljRW50aXR5IikKKyAgICAgICAgcHVibGljIEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4gd3JvbmdHZW5lcmljRW50aXR5KCkgeworICAgICAgICAgICAgLy8gd3JvbmdseSBjb25zdHJ1Y3RlZCBnZW5lcmljIGVudGl0eTogZ2VuZXJpYyB0eXBlIG9mIHRoZSBnZW5lcmljIGVudGl0eQorICAgICAgICAgICAgLy8gaXMgbm90IGdlbmVyaWMgYnV0IGp1c3QgYSBMaXN0IGludGVyZmFjZSB0eXBlLiBJbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIC8vIHRoZSByZXR1cm4gZ2VuZXJpYyB0eXBlIHdpbGwgYmUgdXNlZAorICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljRW50aXR5PD4oQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSwgTGlzdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyaWNMaXN0TWVkaWFUeXBlUmVzb3VyY2U8VD4geworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJnZW5lcmljVHlwZSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBMaXN0PFQ+IHBvc3QoZmluYWwgTGlzdDxUPiBwb3N0KSB7CisgICAgICAgICAgICByZXR1cm4gcG9zdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJMaXN0UmVzb3VyY2VXaXRoTWVkaWFUeXBlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RSZXNvdXJjZVdpdGhNZWRpYVR5cGUgZXh0ZW5kcyBHZW5lcmljTGlzdE1lZGlhVHlwZVJlc291cmNlPEludGVnZXI+IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0eXBlIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gdHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZ2VuZXJpY0VudGl0eSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBHZW5lcmljRW50aXR5PExpc3Q8SW50ZWdlcj4+IGdlbmVyaWNFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4oQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSkge307CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJvYmplY3QiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgT2JqZWN0IG9iamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0VudGl0eTxMaXN0PEludGVnZXI+PihBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpKSB7fTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHJlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG5ldyBHZW5lcmljRW50aXR5PExpc3Q8SW50ZWdlcj4+KEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCkpIHt9KS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgid3JvbmdHZW5lcmljRW50aXR5IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4gd3JvbmdHZW5lcmljRW50aXR5KCkgeworICAgICAgICAgICAgLy8gd3JvbmdseSBjb25zdHJ1Y3RlZCBnZW5lcmljIGVudGl0eTogZ2VuZXJpYyB0eXBlIG9mIHRoZSBnZW5lcmljIGVudGl0eQorICAgICAgICAgICAgLy8gaXMgbm90IGdlbmVyaWMgYnV0IGp1c3QgYSBMaXN0IGludGVyZmFjZSB0eXBlLiBJbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIC8vIHRoZSByZXR1cm4gZ2VuZXJpYyB0eXBlIHdpbGwgYmUgdXNlZAorICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljRW50aXR5PD4oQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSwgTGlzdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljVHlwZSgpIHsKKyAgICAgICAgX2dlbmVyaWNUZXN0KExpc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY1R5cGVXaXRoTWVkaWFUeXBlKCkgeworICAgICAgICBfZ2VuZXJpY1Rlc3QoTGlzdFJlc291cmNlV2l0aE1lZGlhVHlwZS5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9nZW5lcmljVGVzdChmaW5hbCBDbGFzcyByZXNvdXJjZUNsYXNzKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQocmVzb3VyY2VDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworCisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQsICJ0eXBlIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQsICJnZW5lcmljRW50aXR5Iik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQsICJvYmplY3QiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCwgInJlc3BvbnNlIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQsICJ3cm9uZ0dlbmVyaWNFbnRpdHkiKTsKKworICAgICAgICBfdGVzdFBhdGhQb3N0KHRhcmdldCwgImdlbmVyaWNUeXBlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UGF0aChmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0LCBmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjEsIDIsIDMsIDQiLCB0YXJnZXQucGF0aChwYXRoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFBhdGhQb3N0KGZpbmFsIFdlYlRhcmdldCB0YXJnZXQsIGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMSwgMiwgMywgNCIsIHRhcmdldC5wYXRoKHBhdGgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCIxLCAyLCAzLCA0IiksIFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwU3RyaW5nUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8TWFwPFN0cmluZywgU3RyaW5nPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm9keVdyaXRlcjxNYXA8U3RyaW5nLCBTdHJpbmc+PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIG1hcFN0cmluZ1R5cGU7CisKKyAgICAgICAgcHVibGljIE1hcFN0cmluZ1JlYWRlcigpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlIGlmYWNlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0aGlzLmdldENsYXNzKCkuZ2V0R2VuZXJpY0ludGVyZmFjZXMoKVswXTsKKyAgICAgICAgICAgIG1hcFN0cmluZ1R5cGUgPSBpZmFjZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIFR5cGUgdCwgZmluYWwgQW5ub3RhdGlvbltdIGFzLCBmaW5hbCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiBNYXAuY2xhc3MgPT0gYyAmJiBtYXBTdHJpbmdUeXBlLmVxdWFscyh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlYWRGcm9tKGZpbmFsIENsYXNzPE1hcDxTdHJpbmcsIFN0cmluZz4+IGMsIGZpbmFsIFR5cGUgdCwgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbXQsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHYgPSBSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhpbiwgbXQpLnNwbGl0KCIsIik7CisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG0gPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpID0gaSArIDIpIHsKKyAgICAgICAgICAgICAgICBtLnB1dCh2W2ldLCB2W2kgKyAxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiBjLCBmaW5hbCBUeXBlIHQsIGZpbmFsIEFubm90YXRpb25bXSBhcywgZmluYWwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gTWFwLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYykgJiYgbWFwU3RyaW5nVHlwZS5lcXVhbHModCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdCwgZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtdCwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHQuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlLmdldEtleSgpKS5hcHBlbmQoJywnKS5hcHBlbmQoZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC53cml0ZShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZW5lcmljTWFwUmVzb3VyY2U8SywgVj4geworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBNYXA8SywgVj4gcG9zdChmaW5hbCBNYXA8SywgVj4gbSkgeworICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL01hcFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcFJlc291cmNlIGV4dGVuZHMgR2VuZXJpY01hcFJlc291cmNlPFN0cmluZywgU3RyaW5nPiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCIvTWFwUmVzb3VyY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiYSxiLGMsZCIpLCBTdHJpbmcuY2xhc3MpLCBpcygiYSxiLGMsZCIpKTsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcExpc3RTdHJpbmdSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm9keVdyaXRlcjxNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIG1hcExpc3RTdHJpbmdUeXBlOworCisgICAgICAgIHB1YmxpYyBNYXBMaXN0U3RyaW5nUmVhZGVyKCkgeworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgaWZhY2UgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHRoaXMuZ2V0Q2xhc3MoKS5nZXRHZW5lcmljSW50ZXJmYWNlcygpWzBdOworICAgICAgICAgICAgbWFwTGlzdFN0cmluZ1R5cGUgPSBpZmFjZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIFR5cGUgdCwgZmluYWwgQW5ub3RhdGlvbltdIGFzLCBmaW5hbCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiBNYXAuY2xhc3MgPT0gYyAmJiBtYXBMaXN0U3RyaW5nVHlwZS5lcXVhbHModCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZWFkRnJvbShmaW5hbCBDbGFzczxNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBjLCBmaW5hbCBUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhcywgZmluYWwgTWVkaWFUeXBlIG10LCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsCisgICAgICAgICAgICAgICAgU3RyaW5nPiBoZWFkZXJzLCBmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgSlNPTk9iamVjdCBvID0gbmV3IEpTT05PYmplY3QoUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcoaW4sIG10KSk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG0gPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisgICAgICAgICAgICAgICAgZmluYWwgSXRlcmF0b3Iga2V5cyA9IG8ua2V5cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgICAgIG0ucHV0KGtleSwgbCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpTT05BcnJheSBhID0gby5nZXRKU09OQXJyYXkoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwuYWRkKGEuZ2V0U3RyaW5nKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEpTT05FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIFR5cGUgdCwgZmluYWwgQW5ub3RhdGlvbltdIGFzLCBmaW5hbCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiBNYXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjKSAmJiBtYXBMaXN0U3RyaW5nVHlwZS5lcXVhbHModCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFzLCBmaW5hbCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gdCwgZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtdCwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBKU09OT2JqZWN0IG8gPSBuZXcgSlNPTk9iamVjdCgpOworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlIDogdC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG8ucHV0KGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dC53cml0ZShvLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBKU09ORXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJpY01hcExpc3RSZXNvdXJjZTxLLCBWPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIE1hcDxLLCBMaXN0PFY+PiBwb3N0KGZpbmFsIE1hcDxLLCBMaXN0PFY+PiBtKSB7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvTWFwTGlzdFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcExpc3RSZXNvdXJjZSBleHRlbmRzIEdlbmVyaWNNYXBMaXN0UmVzb3VyY2U8U3RyaW5nLCBTdHJpbmc+IHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNNYXBMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBqc29uID0gIntcImFcIjpbXCIxXCIsXCIyXCJdLFwiYlwiOltcIjFcIixcIjJcIl19IjsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoIi9NYXBMaXN0UmVzb3VyY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChqc29uKSwgU3RyaW5nLmNsYXNzKSwgaXMoanNvbikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0luamVjdGVkUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9JbmplY3RlZFByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjJlZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9JbmplY3RlZFByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEluamVjdGVkUHJvdmlkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nOworCisgICAgICAgIHB1YmxpYyBCZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJlYW4oU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5SZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxCZWFuPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCZWFuIHJlYWRGcm9tKAorICAgICAgICAgICAgICAgIENsYXNzPEJlYW4+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0SW5wdXRTdHJlYW0gb2luID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoQmVhbikgb2luLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY2F1c2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oY2F1c2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmplY3RlZEJlYW5SZWFkZXJXcml0ZXIgZXh0ZW5kcyBCZWFuUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8QmVhbj4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFVyaUluZm8gdXJpSW5mbzsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICAgICAgQmVhbiB0LAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHQuc2V0U3RyaW5nKHVyaUluZm8uZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdCh0KTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoQmVhbiB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvb25lL3R3by97aWR9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgQmVhbiBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJlYW4oIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEJlYW5SZWFkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQmVhbiBiZWFuMyA9IHRhcmdldCgib25lL3R3by90aHJlZSIpLnJlcXVlc3QoKS5nZXQoQmVhbi5jbGFzcyk7CisgICAgICAgIEJlYW4gYmVhbjQgPSB0YXJnZXQoIm9uZS90d28vZm91ciIpLnJlcXVlc3QoKS5nZXQoQmVhbi5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkge3sKKyAgICAgICAgICAgIHB1dCgiaWQiLCAidGhyZWUiKTsKKyAgICAgICAgfX07CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwNCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpIHt7CisgICAgICAgICAgICBwdXQoImlkIiwgImZvdXIiKTsKKyAgICAgICAgfX07CisKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RVcmkzID0gdGFyZ2V0KCkuZ2V0VXJpQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnBhdGgoQmVhblJlc291cmNlLmNsYXNzKS5idWlsZEZyb21NYXAobWFwMykudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RVcmk0ID0gdGFyZ2V0KCkuZ2V0VXJpQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnBhdGgoQmVhblJlc291cmNlLmNsYXNzKS5idWlsZEZyb21NYXAobWFwNCkudG9TdHJpbmcoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVxdWVzdFVyaTMsIGJlYW4zLmdldFN0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcXVlc3RVcmk0LCBiZWFuNC5nZXRTdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSW50ZXJjZXB0ZWRTdHJlYW1DbG9zZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0ludGVyY2VwdGVkU3RyZWFtQ2xvc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJhYzU3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0ludGVyY2VwdGVkU3RyZWFtQ2xvc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE4NDUuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEludGVyY2VwdGVkU3RyZWFtQ2xvc2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnRJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yLCBXcml0ZXJJbnRlcmNlcHRvciB7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHJlYWRGcm9tQ291bnQgPSAwOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCBpbkNsb3NlQ291bnQgPSAwOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCB3cml0ZVRvQ291bnQgPSAwOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCBvdXRDbG9zZUNvdW50ID0gMDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZWFkRnJvbUNvdW50Kys7CisKKyAgICAgICAgICAgIGNvbnRleHQuc2V0SW5wdXRTdHJlYW0obmV3IEZpbHRlcklucHV0U3RyZWFtKGNvbnRleHQuZ2V0SW5wdXRTdHJlYW0oKSkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaW5DbG9zZUNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB3cml0ZVRvQ291bnQrKzsKKworICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0obmV3IEZpbHRlck91dHB1dFN0cmVhbShjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBvdXRDbG9zZUNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZWRTdHJlYW1DbG9zZWQoKSB7CisgICAgICAgIENsaWVudEludGVyY2VwdG9yIGludGVyY2VwdG9yID0gbmV3IENsaWVudEludGVyY2VwdG9yKCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZWdpc3RlcihpbnRlcmNlcHRvcikKKyAgICAgICAgICAgICAgICAucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJlbnRpdHkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW50aXR5IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW50ZXJjZXB0b3IucmVhZEZyb21Db3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnRlcmNlcHRvci5pbkNsb3NlQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW50ZXJjZXB0b3Iud3JpdGVUb0NvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludGVyY2VwdG9yLm91dENsb3NlQ291bnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0ludmFsaWRFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9JbnZhbGlkRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTdjYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9JbnZhbGlkRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5SZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgSW52YWxpZEVudGl0eVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJmb28vYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb29CYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImZvby9iYXIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEVudGl0eSgpIHsKKyAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQoKS5yZXF1ZXN0KCJmb28vYmFyIikuZ2V0KEludGVnZXIuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZXhjZXB0aW9uID0gZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24pKSB7CisgICAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9JbnZhbGlkRm9ybVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0ludmFsaWRGb3JtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZjliMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9JbnZhbGlkRm9ybVRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBJbnZhbGlkRm9ybVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZXNvdXJjZTxUPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdChUIHQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJtdWx0aXZhbHVlZG1hcCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtTXVsdGl2YWx1ZWRNYXBSZXNvdXJjZSBleHRlbmRzIFJlc291cmNlPE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPj4ge30KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1NdWx0aXZhbHVlZE1hcFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdCgibXVsdGl2YWx1ZWRtYXAiKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZm9ybSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZTxGb3JtPiB7fQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KCJmb3JtIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3QoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIGZvcm0gPSAibT0lIjsKKyAgICAgICAgUmVzcG9uc2UgY3IgPSB0YXJnZXQocGF0aCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShmb3JtLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pBWEJDb250ZXh0UmVzb2x2ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9KQVhCQ29udGV4dFJlc29sdmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjg3NzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9KQVhCQ29udGV4dFJlc29sdmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwucnVubmVycy5FbmNsb3NlZDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFJ1bldpdGgoRW5jbG9zZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSkFYQkNvbnRleHRSZXNvbHZlclRlc3QgeworCisgICAgQFByb3ZpZGVyCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxKQVhCQ29udGV4dD4geworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHQgY29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW52b2tlZDsKKworICAgICAgICBwdWJsaWMgSkFYQkNvbnRleHRSZXNvbHZlcigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoSmF4YkJlYW4uY2xhc3MpOworICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRDb250ZXh0KENsYXNzPD8+IGMpIHsKKyAgICAgICAgICAgIGlmIChKYXhiQmVhbi5jbGFzcyA9PSBjKSB7CisgICAgICAgICAgICAgICAgaW52b2tlZCsrOworICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaW52b2tlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VkOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFyc2hhbGxlclJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPE1hcnNoYWxsZXI+IHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0IGNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgaW50IGludm9rZWQ7CisKKyAgICAgICAgcHVibGljIE1hcnNoYWxsZXJSZXNvbHZlcigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoSmF4YkJlYW4uY2xhc3MpOworICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNYXJzaGFsbGVyIGdldENvbnRleHQoQ2xhc3M8Pz4gYykgeworICAgICAgICAgICAgaWYgKEpheGJCZWFuLmNsYXNzID09IGMpIHsKKyAgICAgICAgICAgICAgICBpbnZva2VkKys7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY3JlYXRlTWFyc2hhbGxlcigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGludm9rZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaW52b2tlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVubWFyc2hhbGxlclJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPFVubWFyc2hhbGxlcj4geworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHQgY29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW52b2tlZDsKKworICAgICAgICBwdWJsaWMgVW5tYXJzaGFsbGVyUmVzb2x2ZXIoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVW5tYXJzaGFsbGVyIGdldENvbnRleHQoQ2xhc3M8Pz4gYykgeworICAgICAgICAgICAgaWYgKEpheGJCZWFuLmNsYXNzID09IGMpIHsKKyAgICAgICAgICAgICAgICBpbnZva2VkKys7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaW52b2tlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VkOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbiBnZXQoSmF4YkJlYW4gYikgeworICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJDb250ZXh0VGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyIGNyOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgY3IgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhKYXhiQmVhblJlc291cmNlLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjcik7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLnBvc3QoRW50aXR5LnhtbChuZXcgSmF4YkJlYW4oImZvbyIpKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLCBlcXVhbFRvKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkpOworCisgICAgICAgICAgICBmaW5hbCBKYXhiQmVhbiBmb28gPSByZXNwb25zZS5yZWFkRW50aXR5KEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZm9vLnZhbHVlLCBlcXVhbFRvKCJmb28iKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNyLmludm9rZWQoKSwgZXF1YWxUbygyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVubWFyc2hhbGxlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlciBjcjsKKyAgICAgICAgcHJpdmF0ZSBNYXJzaGFsbGVyUmVzb2x2ZXIgbXI7CisgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyUmVzb2x2ZXIgdW1yOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgY3IgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcigpOworICAgICAgICAgICAgbXIgPSBuZXcgTWFyc2hhbGxlclJlc29sdmVyKCk7CisgICAgICAgICAgICB1bXIgPSBuZXcgVW5tYXJzaGFsbGVyUmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmF4YkJlYW5SZXNvdXJjZS5jbGFzcykucmVnaXN0ZXJJbnN0YW5jZXMoY3IsIG1yLCB1bXIpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFVubWFyc2hhbGxlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkucG9zdChFbnRpdHkueG1sKG5ldyBKYXhiQmVhbigiZm9vIikpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIGVxdWFsVG8oTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisKKyAgICAgICAgICAgIGZpbmFsIEpheGJCZWFuIGZvbyA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoSmF4YkJlYW4uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChmb28udmFsdWUsIGVxdWFsVG8oImZvbyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY3IuaW52b2tlZCgpLCBlcXVhbFRvKDApKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQobXIuaW52b2tlZCgpLCBlcXVhbFRvKDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodW1yLmludm9rZWQoKSwgZXF1YWxUbygxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkNvbnRleHRSZXNvbHZlckFwcCBleHRlbmRzIEpBWEJDb250ZXh0UmVzb2x2ZXIgeworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXJzaGFsbGVyUmVzb2x2ZXJBcHAgZXh0ZW5kcyBNYXJzaGFsbGVyUmVzb2x2ZXIgeworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbm1hcnNoYWxsZXJSZXNvbHZlckFwcCBleHRlbmRzIFVubWFyc2hhbGxlclJlc29sdmVyIHsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblJlc291cmNlQXBwIGV4dGVuZHMgSmF4YkJlYW5SZXNvdXJjZSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQ29udGV4dEFwcFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlciBjcjsKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyQXBwIGNyQXBwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgY3IgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcigpOworICAgICAgICAgICAgY3JBcHAgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlckFwcCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhKYXhiQmVhblJlc291cmNlQXBwLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjciwgY3JBcHApOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEpBWEJDb250ZXh0QXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY3JBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVW5tYXJzaGFsbGVyQXBwVGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyIGNyOworICAgICAgICBwcml2YXRlIE1hcnNoYWxsZXJSZXNvbHZlciBtcjsKKyAgICAgICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXJSZXNvbHZlciB1bXI7CisgICAgICAgIHByaXZhdGUgTWFyc2hhbGxlclJlc29sdmVyQXBwIG1yQXBwOworICAgICAgICBwcml2YXRlIFVubWFyc2hhbGxlclJlc29sdmVyQXBwIHVtckFwcDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGNyID0gbmV3IEpBWEJDb250ZXh0UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIG1yID0gbmV3IE1hcnNoYWxsZXJSZXNvbHZlcigpOworICAgICAgICAgICAgdW1yID0gbmV3IFVubWFyc2hhbGxlclJlc29sdmVyKCk7CisgICAgICAgICAgICBtckFwcCA9IG5ldyBNYXJzaGFsbGVyUmVzb2x2ZXJBcHAoKTsKKyAgICAgICAgICAgIHVtckFwcCA9IG5ldyBVbm1hcnNoYWxsZXJSZXNvbHZlckFwcCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhKYXhiQmVhblJlc291cmNlQXBwLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjciwgbXIsIHVtciwgbXJBcHAsIHVtckFwcCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5tYXJzaGFsbGVyQXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbXIuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB1bXIuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVtckFwcC5pbnZva2VkKCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHRhcmdldCgpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBKYXhiQmVhbigiZm9vIiksICJhcHBsaWNhdGlvbi94bWw7Y2hhcnNldD1VVEYtOCIpLCBKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbXIuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB1bXIuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBtckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHVtckFwcC5pbnZva2VkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3htbCIpCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkNvbnRleHRSZXNvbHZlclRleHQgZXh0ZW5kcyBKQVhCQ29udGV4dFJlc29sdmVyIHsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoInRleHQveG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXJzaGFsbGVyUmVzb2x2ZXJUZXh0IGV4dGVuZHMgTWFyc2hhbGxlclJlc29sdmVyIHsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoInRleHQveG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbm1hcnNoYWxsZXJSZXNvbHZlclRleHQgZXh0ZW5kcyBVbm1hcnNoYWxsZXJSZXNvbHZlciB7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VUZXh0IGV4dGVuZHMgSmF4YkJlYW5SZXNvdXJjZSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQ29udGV4dFRleHRUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3I7CisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlclRleHQgY3JUZXh0OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgY3IgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcigpOworICAgICAgICAgICAgY3JUZXh0ID0gbmV3IEpBWEJDb250ZXh0UmVzb2x2ZXJUZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEpheGJCZWFuUmVzb3VyY2VUZXh0LmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjciwgY3JUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQ29udGV4dFRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAidGV4dC94bWwiKSwgSmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNyVGV4dC5pbnZva2VkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbm1hcnNoYWxsZXJUZXh0VGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyIGNyOworICAgICAgICBwcml2YXRlIE1hcnNoYWxsZXJSZXNvbHZlciBtcjsKKyAgICAgICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXJSZXNvbHZlciB1bXI7CisgICAgICAgIHByaXZhdGUgTWFyc2hhbGxlclJlc29sdmVyVGV4dCBtclRleHQ7CisgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyUmVzb2x2ZXJUZXh0IHVtclRleHQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICBtciA9IG5ldyBNYXJzaGFsbGVyUmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIHVtciA9IG5ldyBVbm1hcnNoYWxsZXJSZXNvbHZlcigpOworICAgICAgICAgICAgbXJUZXh0ID0gbmV3IE1hcnNoYWxsZXJSZXNvbHZlclRleHQoKTsKKyAgICAgICAgICAgIHVtclRleHQgPSBuZXcgVW5tYXJzaGFsbGVyUmVzb2x2ZXJUZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEpheGJCZWFuUmVzb3VyY2VUZXh0LmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjciwgbXIsIHVtciwgbXJUZXh0LCB1bXJUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hcnNoYWxsZXJUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgInRleHQveG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1yVGV4dC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVtclRleHQuaW52b2tlZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygidGV4dC9mb28reG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXJzaGFsbGVyUmVzb2x2ZXJGb28gZXh0ZW5kcyBNYXJzaGFsbGVyUmVzb2x2ZXIgeworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygidGV4dC9mb28reG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbm1hcnNoYWxsZXJSZXNvbHZlckZvbyBleHRlbmRzIFVubWFyc2hhbGxlclJlc29sdmVyIHsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L2Zvbyt4bWwiKQorICAgIEBQcm9kdWNlcygidGV4dC9mb28reG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblJlc291cmNlRm9vIGV4dGVuZHMgSmF4YkJlYW5SZXNvdXJjZSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbm1hcnNoYWxsZXJGb29UZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3I7CisgICAgICAgIHByaXZhdGUgTWFyc2hhbGxlclJlc29sdmVyIG1yOworICAgICAgICBwcml2YXRlIFVubWFyc2hhbGxlclJlc29sdmVyIHVtcjsKKyAgICAgICAgcHJpdmF0ZSBNYXJzaGFsbGVyUmVzb2x2ZXJGb28gbXJGb287CisgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyUmVzb2x2ZXJGb28gdW1yRm9vOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgY3IgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcigpOworICAgICAgICAgICAgbXIgPSBuZXcgTWFyc2hhbGxlclJlc29sdmVyKCk7CisgICAgICAgICAgICB1bXIgPSBuZXcgVW5tYXJzaGFsbGVyUmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIG1yRm9vID0gbmV3IE1hcnNoYWxsZXJSZXNvbHZlckZvbygpOworICAgICAgICAgICAgdW1yRm9vID0gbmV3IFVubWFyc2hhbGxlclJlc29sdmVyRm9vKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEpheGJCZWFuUmVzb3VyY2VGb28uY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKGNyLCBtciwgdW1yLCBtckZvbywgdW1yRm9vKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hcnNoYWxsZXJGb28oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAidGV4dC9mb28reG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1yRm9vLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdW1yRm9vLmludm9rZWQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdGFyZ2V0KCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgInRleHQvZm9vK3htbDtjaGFyc2V0PVVURi04IiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1yRm9vLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdW1yRm9vLmludm9rZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZUFsbCB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICAgICAgcHVibGljIEpheGJCZWFuIGdldChKYXhiQmVhbiBiKSB7CisgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gZ2V0QXBwKEpheGJCZWFuIGIpIHsKKyAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gZ2V0VGV4dChKYXhiQmVhbiBiKSB7CisgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkNvbnRleHRBbGxUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3I7CisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlckFwcCBjckFwcDsKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyVGV4dCBjclRleHQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICBjckFwcCA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyQXBwKCk7CisgICAgICAgICAgICBjclRleHQgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlclRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmF4YkJlYW5SZXNvdXJjZUFsbC5jbGFzcykucmVnaXN0ZXJJbnN0YW5jZXMoY3IsIGNyQXBwLCBjclRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEpBWEJDb250ZXh0QWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSwgSmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JUZXh0Lmludm9rZWQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAiYXBwbGljYXRpb24veG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyVGV4dC5pbnZva2VkKCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgInRleHQveG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNyVGV4dC5pbnZva2VkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbm1hcnNoYWxsZXJBbGxUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3I7CisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlckFwcCBjckFwcDsKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyVGV4dCBjclRleHQ7CisgICAgICAgIHByaXZhdGUgTWFyc2hhbGxlclJlc29sdmVyIG1yOworICAgICAgICBwcml2YXRlIFVubWFyc2hhbGxlclJlc29sdmVyIHVtcjsKKyAgICAgICAgcHJpdmF0ZSBNYXJzaGFsbGVyUmVzb2x2ZXJBcHAgbXJBcHA7CisgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyUmVzb2x2ZXJBcHAgdW1yQXBwOworICAgICAgICBwcml2YXRlIE1hcnNoYWxsZXJSZXNvbHZlclRleHQgbXJUZXh0OworICAgICAgICBwcml2YXRlIFVubWFyc2hhbGxlclJlc29sdmVyVGV4dCB1bXJUZXh0OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgY3IgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcigpOworICAgICAgICAgICAgY3JBcHAgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlckFwcCgpOworICAgICAgICAgICAgY3JUZXh0ID0gbmV3IEpBWEJDb250ZXh0UmVzb2x2ZXJUZXh0KCk7CisgICAgICAgICAgICBtciA9IG5ldyBNYXJzaGFsbGVyUmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIHVtciA9IG5ldyBVbm1hcnNoYWxsZXJSZXNvbHZlcigpOworICAgICAgICAgICAgbXJBcHAgPSBuZXcgTWFyc2hhbGxlclJlc29sdmVyQXBwKCk7CisgICAgICAgICAgICB1bXJBcHAgPSBuZXcgVW5tYXJzaGFsbGVyUmVzb2x2ZXJBcHAoKTsKKyAgICAgICAgICAgIG1yVGV4dCA9IG5ldyBNYXJzaGFsbGVyUmVzb2x2ZXJUZXh0KCk7CisgICAgICAgICAgICB1bXJUZXh0ID0gbmV3IFVubWFyc2hhbGxlclJlc29sdmVyVGV4dCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhKYXhiQmVhblJlc291cmNlQWxsLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjciwgY3JBcHAsIGNyVGV4dCwgbXIsIHVtciwKKyAgICAgICAgICAgICAgICAgICAgbXJBcHAsIHVtckFwcCwgbXJUZXh0LCB1bXJUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hcnNoYWxsZXJBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjclRleHQuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1yQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdW1yQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbXJUZXh0Lmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdW1yVGV4dC5pbnZva2VkKCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjclRleHQuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1yQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdW1yQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbXJUZXh0Lmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdW1yVGV4dC5pbnZva2VkKCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgInRleHQveG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyVGV4dC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdW1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbXJBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB1bXJBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtclRleHQuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB1bXJUZXh0Lmludm9rZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAWG1sUm9vdEVsZW1lbnQKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPdGhlckpheGJCZWFuIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBPdGhlckpheGJCZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE90aGVySmF4YkJlYW4oU3RyaW5nIHN0cikgeworICAgICAgICAgICAgdmFsdWUgPSBzdHI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBvIGluc3RhbmNlb2YgSmF4YkJlYW4gJiYgKChKYXhiQmVhbikgbykudmFsdWUuZXF1YWxzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkpBWEJDbGFzczogIiArIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VBbGxPdGhlckpheGJCZWFuIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgICAgICBwdWJsaWMgT3RoZXJKYXhiQmVhbiBnZXQoT3RoZXJKYXhiQmVhbiBiKSB7CisgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICBwdWJsaWMgT3RoZXJKYXhiQmVhbiBnZXRBcHAoT3RoZXJKYXhiQmVhbiBiKSB7CisgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQveG1sIikKKyAgICAgICAgcHVibGljIE90aGVySmF4YkJlYW4gZ2V0VGV4dChPdGhlckpheGJCZWFuIGIpIHsKKyAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQ29udGV4dEFsbFdpdGhPdGhlckpheGJCZWFuVGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyIGNyOworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXJBcHAgY3JBcHA7CisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlclRleHQgY3JUZXh0OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgY3IgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcigpOworICAgICAgICAgICAgY3JBcHAgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlckFwcCgpOworICAgICAgICAgICAgY3JUZXh0ID0gbmV3IEpBWEJDb250ZXh0UmVzb2x2ZXJUZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEpheGJCZWFuUmVzb3VyY2VBbGxPdGhlckpheGJCZWFuLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjciwgY3JBcHAsIGNyVGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNvbnRleHRBbGxXaXRoT3RoZXJKYXhiQmVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB0YXJnZXQoKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgT3RoZXJKYXhiQmVhbigiZm9vIiksICJhcHBsaWNhdGlvbi9mb28reG1sIiksIE90aGVySmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JUZXh0Lmludm9rZWQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdGFyZ2V0KCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IE90aGVySmF4YkJlYW4oImZvbyIpLCAiYXBwbGljYXRpb24veG1sIiksIE90aGVySmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JUZXh0Lmludm9rZWQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgT3RoZXJKYXhiQmVhbigiZm9vIiksICJ0ZXh0L3htbCIpLCBPdGhlckpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyVGV4dC5pbnZva2VkKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSmF4YkJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pheGJCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjZDJkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pheGJCZWFuLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIERvdWcgS29obGVydAorICovCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJqYXhiQmVhbiIpCitwdWJsaWMgY2xhc3MgSmF4YkJlYW4geworCisgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBKYXhiQmVhbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSmF4YkJlYW4oU3RyaW5nIHN0cikgeworICAgICAgICB2YWx1ZSA9IHN0cjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEpheGJCZWFuKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEpheGJCZWFuKSBvKS52YWx1ZS5lcXVhbHModmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSkFYQkNsYXNzOiAiICsgdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSmF4YkJlYW5UeXBlLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9KYXhiQmVhblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFiNDgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSmF4YkJlYW5UeXBlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK0BYbWxUeXBlKG5hbWUgPSAiZGFkYSIpCitwdWJsaWMgY2xhc3MgSmF4YkJlYW5UeXBlIHsKKworICAgIHB1YmxpYyBTdHJpbmcgdmFsdWU7CisKKyAgICBwdWJsaWMgSmF4YkJlYW5UeXBlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBKYXhiQmVhblR5cGUoU3RyaW5nIHN0cikgeworICAgICAgICB2YWx1ZSA9IHN0cjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEpheGJCZWFuVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKChKYXhiQmVhblR5cGUpIG8pLnZhbHVlLmVxdWFscyh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJKYXhiQmVhblR5cGU6ICIgKyB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9Kc29uTW94eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pzb25Nb3h5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTAzYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9Kc29uTW94eVRlc3QuamF2YQpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5Db25jdXJyZW50UnVubmVyOworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgSnNvbk1veHlUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgIEBQYXRoKCJKQVhCRWxlbWVudExpc3RSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIEBDb25zdW1lcyh7ImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50TGlzdFJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4+IHsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gZ2V0SkFYQkVsZW1lbnRMaXN0KCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRKQVhCRWxlbWVudEFycmF5KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTW94eUpzb25Db25maWd1cmF0aW9uQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPE1veHlKc29uQ29uZmlnPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNb3h5SnNvbkNvbmZpZyBnZXRDb250ZXh0KGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIGZpbmFsIE1veHlKc29uQ29uZmlnIGNvbmZpZ3VyYXRpb24gPSBuZXcgTW94eUpzb25Db25maWcoKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0SW5jbHVkZVJvb3QodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIF90ZXN0TGlzdE9yQXJyYXkoZmluYWwgYm9vbGVhbiBpc0xpc3QsIGZpbmFsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICBmaW5hbCBPYmplY3QgaW4gPSBpc0xpc3QgPyBnZXRKQVhCRWxlbWVudExpc3QoKSA6IGdldEpBWEJFbGVtZW50QXJyYXkoKTsKKyAgICAgICAgZmluYWwgR2VuZXJpY1R5cGUgZ3QgPSBpc0xpc3QgPyBuZXcgR2VuZXJpY1R5cGU8TGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+Pj4oKSB7CisgICAgICAgIH0gOiBuZXcgR2VuZXJpY1R5cGU8SkFYQkVsZW1lbnQ8U3RyaW5nPltdPigpIHsKKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KGlzTGlzdCA/ICJKQVhCRWxlbWVudExpc3RSZXNvdXJjZSIgOiAiSkFYQkVsZW1lbnRBcnJheVJlc291cmNlIik7CisgICAgICAgIGZpbmFsIE9iamVjdCBvdXQgPSB0YXJnZXQucmVxdWVzdChtdCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5KGluLCBndC5nZXRUeXBlKCkpLCBtdCksIGd0KTsKKworICAgICAgICBmaW5hbCBMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+IGluTGlzdCA9CisgICAgICAgICAgICAgICAgaXNMaXN0ID8gKChMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+KSBpbikgOiBBcnJheXMuYXNMaXN0KChKQVhCRWxlbWVudDxTdHJpbmc+W10pIGluKTsKKyAgICAgICAgZmluYWwgTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+PiBvdXRMaXN0ID0gaXNMaXN0ID8gKChMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+KSBvdXQpIDogQXJyYXlzCisgICAgICAgICAgICAgICAgLmFzTGlzdCgoSkFYQkVsZW1lbnQ8U3RyaW5nPltdKSBvdXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkxlbmd0aHMgZGlmZmVyIiwgaW5MaXN0LnNpemUoKSwgb3V0TGlzdC5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOYW1lcyBvZiBlbGVtZW50cyBhdCBpbmRleCAiICsgaSArICIgZGlmZmVyIiwgaW5MaXN0LmdldChpKS5nZXROYW1lKCksIG91dExpc3QuZ2V0KGkpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlZhbHVlcyBvZiBlbGVtZW50cyBhdCBpbmRleCAiICsgaSArICIgZGlmZmVyIiwgaW5MaXN0LmdldChpKS5nZXRWYWx1ZSgpLCBvdXRMaXN0LmdldChpKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50TGlzdEpTT05SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3RMaXN0T3JBcnJheSh0cnVlLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRBcnJheVJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgQENvbnN1bWVzKHsiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRBcnJheVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PFN0cmluZz5bXT4geworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgSkFYQkVsZW1lbnQ8U3RyaW5nPltdIGdldEpBWEJFbGVtZW50QXJyYXkoKSB7CisgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnRbXSB7CisgICAgICAgICAgICAgICAgbmV3IEpBWEJFbGVtZW50KFFOYW1lLnZhbHVlT2YoImVsZW1lbnQxIiksIFN0cmluZy5jbGFzcywgImFob2oiKSwKKyAgICAgICAgICAgICAgICBuZXcgSkFYQkVsZW1lbnQoUU5hbWUudmFsdWVPZigiZWxlbWVudDIiKSwgU3RyaW5nLmNsYXNzLCAibmF6ZGFyIikKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEFycmF5SlNPTlJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdExpc3RPckFycmF5KGZhbHNlLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworCisgICAgICAgIHJldHVybiAoKFJlc291cmNlQ29uZmlnKSBzdXBlci5jb25maWd1cmUoKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTW94eUpzb25GZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNb3h5SnNvbkNvbmZpZ3VyYXRpb25Db250ZXh0UmVzb2x2ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZUNsaWVudChjb25maWcpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTW94eUpzb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE1veHlKc29uQ29uZmlndXJhdGlvbkNvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhbkpTT05SZXNvdXJjZSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuSlNPTlJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PFN0cmluZz4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5KU09OUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJFbGVtZW50QmVhbkpTT05SZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIEdlbmVyaWNUeXBlPEpBWEJFbGVtZW50PFN0cmluZz4+IGdlbmVyaWNUeXBlID0gbmV3IEdlbmVyaWNUeXBlPEpBWEJFbGVtZW50PFN0cmluZz4+KCkgeworICAgICAgICB9OworICAgICAgICBmaW5hbCBHZW5lcmljRW50aXR5PEpBWEJFbGVtZW50PFN0cmluZz4+IGpheGJFbGVtZW50R2VuZXJpY0VudGl0eSA9IG5ldyBHZW5lcmljRW50aXR5PD4oCisgICAgICAgICAgICAgICAgbmV3IEpBWEJFbGVtZW50PD4obmV3IFFOYW1lKCJ0ZXN0IiksIFN0cmluZy5jbGFzcywgIkNPTlRFTlQiKSwgZ2VuZXJpY1R5cGUuZ2V0VHlwZSgpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByaWIgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoCisgICAgICAgICAgICAgICAgRW50aXR5LmVudGl0eShqYXhiRWxlbWVudEdlbmVyaWNFbnRpdHksICJhcHBsaWNhdGlvbi9qc29uIikpOworCisgICAgICAgIC8vIFRPRE86IHRoZSBmb2xsb3dpbmcgd291bGQgbm90IGJlIG5lZWRlZCBpZiBpIGtuZXcgaG93IHRvIHdvcmthcm91bmQgSkFYQkVsZW1lbnQ8U3RyaW5nPi5jbGFzcyBsaXRlcmFsCisgICAgICAgIGZpbmFsIGJ5dGVbXSBpbkJ5dGVzID0gZ2V0UmVxdWVzdEVudGl0eSgpOworICAgICAgICBmaW5hbCBieXRlW10gb3V0Qnl0ZXMgPSBnZXRFbnRpdHlBc0J5dGVBcnJheShyaWIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU3RyaW5nKG91dEJ5dGVzKSwgaW5CeXRlcy5sZW5ndGgsIG91dEJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5CeXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGluQnl0ZXNbaV0gIT0gb3V0Qnl0ZXNbaV0pIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluZGV4OiAiICsgaSwgaW5CeXRlc1tpXSwgb3V0Qnl0ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkpheGJCZWFuUmVzb3VyY2VKU09OIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblJlc291cmNlSlNPTiBleHRlbmRzIEFSZXNvdXJjZTxKYXhiQmVhbj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuUmVwcmVzZW50YXRpb25KU09OKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKYXhiQmVhblJlc291cmNlSlNPTiIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2pzb24iKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpheGJCZWFuUmVzb3VyY2VKU09OTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VKU09OTWVkaWFUeXBlIGV4dGVuZHMgQVJlc291cmNlPEpheGJCZWFuPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5SZXByZXNlbnRhdGlvbkpTT05NZWRpYVR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpheGJCZWFuUmVzb3VyY2VKU09OTWVkaWFUeXBlIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vZm9vK2pzb24iKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhblJlc291cmNlSlNPTiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PEpheGJCZWFuVHlwZT4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5SZXByZXNlbnRhdGlvbkpTT04oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJFbGVtZW50QmVhblJlc291cmNlSlNPTiIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2pzb24iKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhblJlc291cmNlSlNPTk1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8SmF4YkJlYW5UeXBlPj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhblJlcHJlc2VudGF0aW9uSlNPTk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OTWVkaWFUeXBlIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vZm9vK2pzb24iKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJUeXBlUmVzb3VyY2VKU09OIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCVHlwZVJlc291cmNlSlNPTiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEpheGJCZWFuIHBvc3QoZmluYWwgSmF4YkJlYW5UeXBlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmF4YkJlYW4odC52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCVHlwZVJlcHJlc2VudGF0aW9uSlNPTigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQlR5cGVSZXNvdXJjZUpTT04iKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW5UeXBlIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vanNvbiIpLCBKYXhiQmVhblR5cGUuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJUeXBlUmVzb3VyY2VKU09OTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJUeXBlUmVzb3VyY2VKU09OTWVkaWFUeXBlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gcG9zdChmaW5hbCBKYXhiQmVhblR5cGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXhiQmVhbih0LnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJUeXBlUmVwcmVzZW50YXRpb25KU09OTWVkaWFUeXBlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCVHlwZVJlc291cmNlSlNPTk1lZGlhVHlwZSIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhblR5cGUgb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mb28ranNvbiIpLCBKYXhiQmVhblR5cGUuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgTGlzdDxKYXhiQmVhbj4gcG9zdChmaW5hbCBMaXN0PEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzZXQiKQorICAgICAgICBwdWJsaWMgU2V0PEpheGJCZWFuPiBwb3N0U2V0KGZpbmFsIFNldDxKYXhiQmVhbj4gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgicXVldWUiKQorICAgICAgICBwdWJsaWMgUXVldWU8SmF4YkJlYW4+IHBvc3RRdWV1ZShmaW5hbCBRdWV1ZTxKYXhiQmVhbj4gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic3RhY2siKQorICAgICAgICBwdWJsaWMgU3RhY2s8SmF4YkJlYW4+IHBvc3RTdGFjayhmaW5hbCBTdGFjazxKYXhiQmVhbj4gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiY3VzdG9tIikKKyAgICAgICAgcHVibGljIE15QXJyYXlMaXN0PEpheGJCZWFuPiBwb3N0Q3VzdG9tKGZpbmFsIE15QXJyYXlMaXN0PEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248SmF4YkJlYW4+IGdldCgpIHsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxKYXhiQmVhbj4gbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJvbmUiKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oInR3byIpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigidGhyZWUiKSk7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ0eXBlIikKKyAgICAgICAgcHVibGljIExpc3Q8SmF4YkJlYW4+IHBvc3RUeXBlKGZpbmFsIENvbGxlY3Rpb248SmF4YkJlYW5UeXBlPiBsKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEpheGJCZWFuPiBiZWFucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBKYXhiQmVhblR5cGUgdCA6IGwpIHsKKyAgICAgICAgICAgICAgICBiZWFucy5hZGQobmV3IEpheGJCZWFuKHQudmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiZWFuczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJKQVhCTGlzdFJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlTWVkaWFUeXBlIGV4dGVuZHMgSkFYQkxpc3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2VKU09OIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlSlNPTiBleHRlbmRzIEpBWEJMaXN0UmVzb3VyY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25KU09OQ29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlSlNPTiIpOworCisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248SmF4YkJlYW4+IGEgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBDb2xsZWN0aW9uPEpheGJCZWFuPiBiID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCTGlzdFJlcHJlc2VudGF0aW9uSlNPTkxpbmtlZExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZUpTT04iKTsKKworICAgICAgICBDb2xsZWN0aW9uPEpheGJCZWFuPiBhID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYjsKKworICAgICAgICBhID0gbmV3IExpbmtlZExpc3Q8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJxdWV1ZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8UXVldWU8SmF4YkJlYW4+PigoUXVldWU8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9qc29uIiksIG5ldyBHZW5lcmljVHlwZTxRdWV1ZTxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25KU09OU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJMaXN0UmVzb3VyY2VKU09OIik7CisKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248SmF4YkJlYW4+IGI7CisKKyAgICAgICAgYSA9IG5ldyBIYXNoU2V0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic2V0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxTZXQ8SmF4YkJlYW4+PigoU2V0PEpheGJCZWFuPikgYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8U2V0PEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBDb21wYXJhdG9yPEpheGJCZWFuPiBjID0gbmV3IENvbXBhcmF0b3I8SmF4YkJlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgSmF4YkJlYW4gdCwgZmluYWwgSmF4YkJlYW4gdDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZS5jb21wYXJlVG8odDEudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBUcmVlU2V0PEpheGJCZWFuPiB0MSA9IG5ldyBUcmVlU2V0PD4oYyk7CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8SmF4YkJlYW4+IHQyID0gbmV3IFRyZWVTZXQ8PihjKTsKKyAgICAgICAgdDEuYWRkQWxsKGEpOworICAgICAgICB0Mi5hZGRBbGwoYik7CisgICAgICAgIGFzc2VydEVxdWFscyh0MSwgdDIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25KU09OU3RhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZUpTT04iKTsKKworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPEpheGJCZWFuPiBhID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYjsKKworICAgICAgICBmaW5hbCBTdGFjazxKYXhiQmVhbj4gcyA9IG5ldyBTdGFjazw+KCk7CisgICAgICAgIHMuYWRkQWxsKGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInN0YWNrIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxTdGFjazxKYXhiQmVhbj4+KHMpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPFN0YWNrPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMocywgYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJVbnRpbCBKRVJTRVktMjgyNSBpcyBmaXhlZC4iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCTGlzdFJlcHJlc2VudGF0aW9uSlNPTkFycmF5TGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlSlNPTiIpOworCisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGEgPSB0YXJnZXQucmVxdWVzdCgpLmdldChuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkge30pOworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPEpheGJCZWFuPiBiOworCisgICAgICAgIGEgPSBuZXcgTXlBcnJheUxpc3Q8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJjdXN0b20iKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PE15QXJyYXlMaXN0PEpheGJCZWFuPj4oKE15QXJyYXlMaXN0PEpheGJCZWFuPikgYSkge30sICJhcHBsaWNhdGlvbi9qc29uIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGU8TXlBcnJheUxpc3Q8SmF4YkJlYW4+PigpIHt9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCTGlzdFJlc291cmNlSlNPTk1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlSlNPTk1lZGlhVHlwZSBleHRlbmRzIEpBWEJMaXN0UmVzb3VyY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25KU09OTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJMaXN0UmVzb3VyY2VKU09OTWVkaWFUeXBlIik7CisKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGIgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2Zvbytqc29uIiksIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTWVkaWFUeXBlU2VsZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTWVkaWFUeXBlU2VsZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjdkZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9NZWRpYVR5cGVTZWxlY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVR5cGVTZWxlY3Rpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKyAgICBAUGF0aCgiZm9ybSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGRhdGEsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJmb28iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImZvby8qIikKKyAgICAgICAgQFByb2R1Y2VzKCJmb28vKiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZm9vKFN0cmluZyBmb28pIHsKKyAgICAgICAgICAgIHJldHVybiBmb287CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgidGV4dCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXh0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC8qIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICAgICAgQFBhdGgoImFueSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW55KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXh0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC8qIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KCJlbnRpdHkiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIndpbGRjYXJkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdpbGRDYXJkUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHdpbGRDYXJkKFN0cmluZyB3YykgeworICAgICAgICAgICAgcmV0dXJuIHdjOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImppcmEvMTUxOCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJc3N1ZTE1MThSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygidGV4dC9wbGFpbjtxcz0wLjciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG5ldmVyKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5DT05GTElDVCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQvKiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiMTUxOCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBKRVJTRVktMTUxOCByZXByb2R1Y2VyIHRlc3QKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRc0luQ29uc3VtZXMoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImppcmEvMTUxOCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkucG9zdChFbnRpdHkudGV4dCgicmVxdWVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNTE4Iiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8vIEpFUlNFWS0xMTg3IHJlZ3Jlc3Npb24gdGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0TWVkaWFUeXBlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJmb3JtIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmZvcm0obmV3IEZvcm0oKS5wYXJhbSgiYSIsICJiIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSwgci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHIucmVhZEVudGl0eShGb3JtLmNsYXNzKS5hc01hcCgpLmdldEZpcnN0KCJhIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFtYmlndW91c1dpbGRjYXJkKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJmb28iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ0ZXN0IiwgImZvby9wbGFpbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNiwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRJblN1YlR5cGUoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoInRleHQiKS5yZXF1ZXN0KCJ0ZXh0LyoiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNiwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRJblN1YlR5cGVQb3N0KCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJ0ZXh0IikucmVxdWVzdCgidGV4dC8qIikucG9zdChFbnRpdHkuZW50aXR5KCJ0ZXN0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA2LCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZEluU3ViVHlwZTIoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoInRleHQiKS5yZXF1ZXN0KCIqLyoiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNiwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRzSW5UeXBlQW5kU3ViVHlwZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGV4dC9hbnkiKS5yZXF1ZXN0KCIqLyoiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUsIHIuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vQWNjZXB0SGVhZGVyKCkgeworICAgICAgICAvLyBUaGlzIHRlc3QgaXMgdGVzdGluZyB0aGUgc2l0dWF0aW9uIHdoZW4gdGhlIGNsaWVudCBzZW5kcyBubyBBY2NlcHQgaGVhZGVyIHRvIHRoZSBzZXJ2ZXIgYW5kIGl0IGV4cGVjdHMKKyAgICAgICAgLy8gQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUgdG8gYmUgcmV0dXJuZWQuIEJ1dCB3aGVuIG5vIEFjY2VwdCBoZWFkZXIgaXMgZGVmaW5lZCBieSB0aGUgY2xpZW50IGFwaSB0aGUKKyAgICAgICAgLy8gSHR0cFVSTENvbm5lY3Rpb24gKGluIEh0dHBVcmxDb25uZWN0b3IpICBhbHdheXMgcHV0IHRoZXJlIHNvbWUgZGVmYXVsdCBBY2NlcHQgaGVhZGVyIChsaWtlICovKiwgdGV4dC9wbGFpbiwgLi4uKS4KKyAgICAgICAgLy8gVG8gb3ZlcndyaXRlIHRoaXMgYmVoYXZpb3VyIHdlIHNldCBBY2NlcHQgdG8gZW1wdHkgU3RyaW5nLiBUaGlzIHdvcmtzIGZpbmUgYXMgdGhlIHNlcnZlciBjb2RlIGhhbmRsZXMgZW1wdHkKKyAgICAgICAgLy8gQWNjZXB0IGhlYWRlciBsaWtlIG5vIEFjY2VwdCBoZWFkZXIuCisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkSGFzaE1hcCBoZWFkZXJzID0gbmV3IE11bHRpdmFsdWVkSGFzaE1hcCgpOworICAgICAgICBoZWFkZXJzLmFkZCgiQWNjZXB0IiwgIiIpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoInRleHQvYW55IikucmVxdWVzdCgpLmhlYWRlcnMoaGVhZGVycykuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFLCByLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpYygpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiZm9vIikucmVxdWVzdCgiZm9vL3BsYWluIikucG9zdChFbnRpdHkuZW50aXR5KCJ0ZXN0IiwgImZvby9wbGFpbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS52YWx1ZU9mKCJmb28vcGxhaW4iKSwgci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIkpTT05CIGJyZWFrcyB0aGlzIHRlc3QuIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25XaWxkQ2FyZCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgid2lsZGNhcmQiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi8qIikucG9zdChFbnRpdHkudGV4dCgidGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSwgci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9NZXNzYWdlQm9keVByb3ZpZGVyQW5ub3RhdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9NZXNzYWdlQm9keVByb3ZpZGVyQW5ub3RhdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3YmZlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L01lc3NhZ2VCb2R5UHJvdmlkZXJBbm5vdGF0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGFubm90YXRpb25zIHBhc3NlZCB0byBtZXNzYWdlIGJvZHkgcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlQcm92aWRlckFubm90YXRpb25zVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhDb250YWluZXJSZWFkZXJXcml0ZXIuY2xhc3MsIFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZXIoKSB7CisgICAgICAgIFN0cmluZyBnZXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdCgidGVzdC90ZXh0IikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0LW9rIiwgZ2V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXIoKSB7CisgICAgICAgIFN0cmluZyBnZXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdCgidGV4dC9wbGFpbiIpLnBvc3QoRW50aXR5LmVudGl0eSgidGVzdCIsICJ0ZXN0L3RleHQiKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvayIsIGdldCk7CisgICAgfQorCisKKyAgICBAUHJvZHVjZXMoInRlc3QvdGV4dCIpCisgICAgQENvbnN1bWVzKCJ0ZXN0L3RleHQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGFpbmVyUmVhZGVyV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiwgTWVzc2FnZUJvZHlSZWFkZXI8QmVhbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZW50aXR5U3RyZWFtKTsKKworICAgICAgICAgICAgaWYgKGNvbXBhcmVBbm5vdGF0aW9ucyhuZXcgQ2xhc3M8Pz5bXXtNeUFubm90YXRpb24uY2xhc3MsIFByb2R1Y2VzLmNsYXNzLCBHRVQuY2xhc3N9LCBhbm5vdGF0aW9ucykpIHsKKyAgICAgICAgICAgICAgICBvc3cud3JpdGUocyArICItb2siKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3N3LndyaXRlKHMgKyAiLWZhaWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zdy5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCZWFuIHJlYWRGcm9tKENsYXNzPEJlYW4+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoY29tcGFyZUFubm90YXRpb25zKG5ldyBDbGFzczw/Pltde015QW5ub3RhdGlvbi5jbGFzc30sIGFubm90YXRpb25zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmVhbigib2siKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCZWFuKCJmYWlsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW4geworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgQmVhbihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbXBhcmVBbm5vdGF0aW9ucyhDbGFzc1tdIGV4cGVjdGVkLCBBbm5vdGF0aW9uW10gYWN0dWFsKSB7CisgICAgICAgIGlmIChleHBlY3RlZC5sZW5ndGggIT0gYWN0dWFsLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChDbGFzczw/PiBlIDogZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhIDogYWN0dWFsKSB7CisgICAgICAgICAgICAgICAgaWYgKGUuZXF1YWxzKGEuYW5ub3RhdGlvblR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbiBBTk5PVEFUSU9OOworCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgTXlBbm5vdGF0aW9uIHsKKyAgICB9CisKKyAgICBzdGF0aWMgeworICAgICAgICBATXlBbm5vdGF0aW9uCisgICAgICAgIGNsYXNzIFRlbXBDbGFzcyB7CisgICAgICAgIH0KKyAgICAgICAgOworICAgICAgICBBTk5PVEFUSU9OID0gVGVtcENsYXNzLmNsYXNzLmdldEFubm90YXRpb24oTXlBbm5vdGF0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXN0L3RleHQiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZS5vaygpLmVudGl0eSgiZ2V0IiwgbmV3IEFubm90YXRpb25bXXtBTk5PVEFUSU9OfSkuYnVpbGQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygidGVzdC90ZXh0IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KEBNeUFubm90YXRpb24gQmVhbiBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L011bHRpcGFydFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L011bHRpcGFydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlkYTcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTXVsdGlwYXJ0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW07CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBhcnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlPYmplY3QgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBNeU9iamVjdCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNeU9iamVjdChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE11bHRpcGFydFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiZmlsZW5hbWUiKQorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyBmaWxlbmFtZShmaW5hbCBGb3JtRGF0YU11bHRpUGFydCBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0RmllbGQoInRleHQiKS5nZXRWYWx1ZSgpICsgZW50aXR5LmdldEZpZWxkKCJmaWxlIikuZ2V0Q29udGVudERpc3Bvc2l0aW9uKCkuZ2V0RmlsZU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJtYnIiKQorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIG1icihmaW5hbCBGb3JtRGF0YU11bHRpUGFydCBlbnRpdHkpIHsKKyAgICAgICAgICAgIGVudGl0eS5nZXRGaWVsZCgidGV4dCIpLmdldFZhbHVlQXMoTXVsdGlwYXJ0UmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soImtvIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJsaXN0QXNQYXJhbWV0ZXIiKQorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvY2VzcyhARm9ybURhdGFQYXJhbSh2YWx1ZSA9ICJvYmplY3QiKSBmaW5hbCBNeU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSh2YWx1ZSA9ICJsaXN0IikgZmluYWwgTGlzdDxNeU9iamVjdD4gbGlzdCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gb2JqZWN0LnZhbHVlOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIE15T2JqZWN0IG9iaiA6IGxpc3QpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSArPSAiXyIgKyBvYmoudmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZUJvZHlQcm92aWRlcgorICAgICAgICAgICAgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNdWx0aXBhcnRSZXNvdXJjZT4sIE1lc3NhZ2VCb2R5V3JpdGVyPE11bHRpcGFydFJlc291cmNlPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNdWx0aXBhcnRSZXNvdXJjZSByZWFkRnJvbShmaW5hbCBDbGFzczxNdWx0aXBhcnRSZXNvdXJjZT4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIklPRSIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBNdWx0aXBhcnRSZXNvdXJjZSBtdWx0aXBhcnRSZXNvdXJjZSwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE11bHRpcGFydFJlc291cmNlIG11bHRpcGFydFJlc291cmNlLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSU9FIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE11bHRpcGFydFJlc291cmNlLmNsYXNzLCBNZXNzYWdlQm9keVByb3ZpZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lSW50ZXJuZXRFeHBsb3JlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHkgPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIm11bHRpcGFydC10ZXN0Y2FzZS50eHQiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImZpbGVuYW1lIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiVXNlci1BZ2VudCIsICJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgTVNJRSA3LjA7IFdpbmRvd3MgTlQgNi4wOyBlbi1VUykiKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCAibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tN2RjOTQxNTIwODg4IikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJiaGhrbGJwb20ueG1sIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgibXVsdGlwYXJ0LXRlc3RjYXNlLnR4dCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZmlsZW5hbWUiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KGVudGl0eSwgIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTdkYzk0MTUyMDg4OCIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiYmhoa2xiQzpqYXZhcHJvamVjdHNtdWx0aXBhcnQtdGVzdGNhc2Vwb20ueG1sIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ickV4Y2VwdGlvblNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHkgPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIm11bHRpcGFydC10ZXN0Y2FzZS50eHQiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIm1iciIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCAibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tN2RjOTQxNTIwODg4IikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNTAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGluamVjdGlvbiBvZiBhIGxpc3QgKHNwZWNpZmljIHR5cGUpIHdvcmtzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwZWNpZmljTGlzdEFzUGFyYW1ldGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE15T2JqZWN0IG9iamVjdCA9IG5ldyBNeU9iamVjdCgib2JqZWN0Iik7CisgICAgICAgIGZpbmFsIExpc3Q8TXlPYmplY3Q+IGxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBNeU9iamVjdCgibGlzdDEiKSwgbmV3IE15T2JqZWN0KCJsaXN0MiIpKTsKKworICAgICAgICBmaW5hbCBGb3JtRGF0YU11bHRpUGFydCBtcCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpOworICAgICAgICBtcC5ib2R5UGFydChuZXcgRm9ybURhdGFCb2R5UGFydChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJvYmplY3QiKS5maWxlTmFtZSgib2JqZWN0IikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICBvYmplY3QsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpKTsKKyAgICAgICAgbXAuYm9keVBhcnQobmV3IEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgibGlzdCIpLmZpbGVOYW1lKCJsaXN0IikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICBsaXN0LCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImxpc3RBc1BhcmFtZXRlciIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobXAsIE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIm9iamVjdF9saXN0MV9saXN0MiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZmlsZW5hbWUiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVudGl0eVdpdGhvdXRDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZmlsZW5hbWUiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChudWxsKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg0MDApKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L015QXJyYXlMaXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9NeUFycmF5TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTkyMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9NeUFycmF5TGlzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBNeUFycmF5TGlzdDxUPiBleHRlbmRzIEFycmF5TGlzdDxUPiB7CisKKyAgICBwdWJsaWMgTXlBcnJheUxpc3QoKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgTXlBcnJheUxpc3QoZmluYWwgQ29sbGVjdGlvbjxUPiBhKSB7CisgICAgICAgIHN1cGVyKGEpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTm9NZXNzYWdlQm9keVdvcmtlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L05vTWVzc2FnZUJvZHlXb3JrZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU0ZmFjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L05vTWVzc2FnZUJvZHlXb3JrZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIE5vTWVzc2FnZUJvZHlXb3JrZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gKFJlc291cmNlQ29uZmlnKSBzdXBlci5jb25maWd1cmUoKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoQ29tbW9uUHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBQYXRoKCJub2JvZHlyZWFkZXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9NZXNzYWdlQm9keVJlYWRlclJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KE5vTWVzc2FnZUJvZHlSZWFkZXJSZXNvdXJjZSB0KSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb01lc3NhZ2VCb2R5UmVhZGVyUmVzb3VyY2UoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoIm5vYm9keXJlYWRlciIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJhIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDE1LCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgibm9ib2R5d3JpdGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vTWVzc2FnZUJvZHlXcml0ZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgTm9NZXNzYWdlQm9keVdyaXRlclJlc291cmNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTm9NZXNzYWdlQm9keVdyaXRlclJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb01lc3NhZ2VCb2R5V3JpdGVyUmVzb3VyY2UoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoIm5vYm9keXdyaXRlciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvUGFyYW1ldGVyVHlwZUFyZ3VtZW50T3JkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9QYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjdiYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvUGFyYW1ldGVyVHlwZUFyZ3VtZW50T3JkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aGUgY29ycmVjdCBvcmRlciBvZiBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVyVHlwZUFyZ3VtZW50T3JkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RQYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQVdyaXRlci5jbGFzcywgQldyaXRlci5jbGFzcywgQ1dyaXRlci5jbGFzcywgQ2xhc3NSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NSZXNvdXJjZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQSIsIHRhcmdldCgpLnBhdGgoImEiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJCIiwgdGFyZ2V0KCkucGF0aCgiYiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ0MiLCB0YXJnZXQoKS5wYXRoKCJjIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1BhcmFtZXRlclR5cGVBcmd1bWVudFJlc291cmNlUmVhZGVyV3JpdGVyT3JkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9QYXJhbWV0ZXJUeXBlQXJndW1lbnRSZXNvdXJjZVJlYWRlcldyaXRlck9yZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YWE3OTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9QYXJhbWV0ZXJUeXBlQXJndW1lbnRSZXNvdXJjZVJlYWRlcldyaXRlck9yZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhlIGNvcnJlY3Qgb3JkZXIgb2YgcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlclR5cGVBcmd1bWVudFJlc291cmNlUmVhZGVyV3JpdGVyT3JkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RQYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQVJlYWRlcldyaXRlci5jbGFzcywgQlJlYWRlcldyaXRlci5jbGFzcywgQ1JlYWRlcldyaXRlci5jbGFzcywgQ2xhc3NSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NSZXNvdXJjZSgpIHsKKyAgICAgICAgLy8gTk9URTogSHR0cFVybENvbm5lY3RvciBzZW5kcyBzZXZlcmFsIGFjY2VwdGVkIHR5cGVzIGJ5IGRlZmF1bHQgd2hlbiBub3QgZXhwbGljaXRseSBzZXQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgLy8gSW4gc3VjaCBjYXNlLCB0aGUgLmFjY2VwdCgidGV4dC9odG1sIikgY2FsbCBpcyBub3QgbmVjZXNzYXJ5LiBIb3dldmVyLCBvdGhlciBjb25uZWN0b3JzIGFjdCBpbiBhIGRpZmZlcmVudCB3YXkgYW5kCisgICAgICAgIC8vIHRoaXMgbGVhZHMgaW4gZGlmZmVyZW50IGJlaGF2aW91ciB3aGVuIHNlbGVjdGluZyB0aGUgTWVzc2FnZUJvZHlXcml0ZXIuIExlYXZpbmcgdGhlIGRlZmluaXRpb24gZXhwbGljaXQgZm9yIGJyb2FkZXIKKyAgICAgICAgLy8gY29tcGF0aWJpbGl0eS4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQSIsIHRhcmdldCgpLnBhdGgoImEiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQkIiLCB0YXJnZXQoKS5wYXRoKCJiIikucmVxdWVzdCgidGV4dC9odG1sIikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNDIiwgdGFyZ2V0KCkucGF0aCgiYyIpLnJlcXVlc3QoInRleHQvaHRtbCIpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9QYXJhbWV0ZXJUeXBlQXJndW1lbnRSZXZlcnNlZE9yZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvUGFyYW1ldGVyVHlwZUFyZ3VtZW50UmV2ZXJzZWRPcmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM4MjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvUGFyYW1ldGVyVHlwZUFyZ3VtZW50UmV2ZXJzZWRPcmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoZSBjb3JyZWN0IG9yZGVyIG9mIHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJUeXBlQXJndW1lbnRSZXZlcnNlZE9yZGVyVGVzdCBleHRlbmRzIEFic3RyYWN0UGFyYW1ldGVyVHlwZUFyZ3VtZW50T3JkZXJUZXN0IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENXcml0ZXIuY2xhc3MsIEJXcml0ZXIuY2xhc3MsIEFXcml0ZXIuY2xhc3MsIENsYXNzUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzUmVzb3VyY2UoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiQUEiLCB0YXJnZXQoKS5wYXRoKCJhIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCQiIsIHRhcmdldCgpLnBhdGgoImIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNDIiwgdGFyZ2V0KCkucGF0aCgiYyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9SZW5kZXJlZEltYWdlVHlwZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1JlbmRlcmVkSW1hZ2VUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzc5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9SZW5kZXJlZEltYWdlVHlwZVRlc3QuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5SZW5kZXJlZEltYWdlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW47CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFJlbmRlcmVkSW1hZ2VUeXBlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1hZ2VSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnN1bWVzKCJpbWFnZS9naWYiKQorICAgICAgICBAUHJvZHVjZXMoImltYWdlL3BuZyIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIHBvc3RHaWYoZmluYWwgUmVuZGVyZWRJbWFnZSBpbWFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGltYWdlOworICAgICAgICB9CisKKyAgICAgICAgQENvbnN1bWVzKCJpbWFnZS9wbmciKQorICAgICAgICBAUHJvZHVjZXMoImltYWdlL3BuZyIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIHBvc3RQbmcoZmluYWwgUmVuZGVyZWRJbWFnZSBpbWFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGltYWdlOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikKKyAgICAgICAgQFByb2R1Y2VzKCJpbWFnZS9wbmciKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSBwb3N0VW5kZWZpbmVkKGZpbmFsIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBpbWFnZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSW1hZ2VSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFBuZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oIkplcnNleV95ZWxsb3cucG5nIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShzdHJlYW0sICJpbWFnZS9wbmciKSk7CisgICAgICAgIGFzc2VydFRoYXQoTG9uZy52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ29udGVudC1MZW5ndGgiKSksIGdyZWF0ZXJUaGFuKDBMKSk7CisKKyAgICAgICAgZmluYWwgUmVuZGVyZWRJbWFnZSBpbWFnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoUmVuZGVyZWRJbWFnZS5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoaW1hZ2UsIG5vdE51bGxWYWx1ZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW1hZ2UsICJpbWFnZS9wbmciKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShSZW5kZXJlZEltYWdlLmNsYXNzKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KExvbmcudmFsdWVPZihyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIikpLCBncmVhdGVyVGhhbigwTCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RHaWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJkdWtlX3JvY2tldC5naWYiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHN0cmVhbSwgImltYWdlL2dpZiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChMb25nLnZhbHVlT2YocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJDb250ZW50LUxlbmd0aCIpKSwgZ3JlYXRlclRoYW4oMEwpKTsKKworICAgICAgICBmaW5hbCBSZW5kZXJlZEltYWdlIGltYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShSZW5kZXJlZEltYWdlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChpbWFnZSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbWFnZSwgImltYWdlL3BuZyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFJlbmRlcmVkSW1hZ2UuY2xhc3MpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoTG9uZy52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ29udGVudC1MZW5ndGgiKSksIGdyZWF0ZXJUaGFuKDBMKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFVuZGVmaW5lZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oImR1a2Vfcm9ja2V0LmdpZiIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgic3ViIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShzdHJlYW0sICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSk7CisgICAgICAgIGFzc2VydFRoYXQoTG9uZy52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ29udGVudC1MZW5ndGgiKSksIGdyZWF0ZXJUaGFuKDBMKSk7CisKKyAgICAgICAgZmluYWwgUmVuZGVyZWRJbWFnZSBpbWFnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoUmVuZGVyZWRJbWFnZS5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoaW1hZ2UsIG5vdE51bGxWYWx1ZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW1hZ2UsICJpbWFnZS9wbmciKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShSZW5kZXJlZEltYWdlLmNsYXNzKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KExvbmcudmFsdWVPZihyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIikpLCBncmVhdGVyVGhhbigwTCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1N0cmVhbWluZ091dHB1dFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1N0cmVhbWluZ091dHB1dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmRmNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvU3RyZWFtaW5nT3V0cHV0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TdHJlYW1pbmdPdXRwdXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU3RyZWFtaW5nT3V0cHV0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBHRVQKKyAgICBAUGF0aCgid2FlIikKKyAgICBwdWJsaWMgU3RyZWFtaW5nT3V0cHV0IHRlc3QyKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmVhbWluZ091dHB1dCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5CQURfR0FURVdBWS5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoU3RyZWFtaW5nT3V0cHV0VGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViQXBwbGljYXRpb25FeGNlcHRpb24oKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoIndhZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5CQURfR0FURVdBWS5nZXRTdGF0dXNDb2RlKCksIHIuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvU3ViUmVzb3VyY2VEeW5hbWljUHJveHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9TdWJSZXNvdXJjZUR5bmFtaWNQcm94eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWIyMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvU3ViUmVzb3VyY2VEeW5hbWljUHJveHlUZXN0LmphdmEKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNTQxLgorICoKKyAqIE1ha2Ugc3VyZSB0aGF0IHR5cGUgcGFyYW1ldGVyIHdpbGwgYmUgcmV0YWluZWQgZm9yIHJlc291cmNlIG1ldGhvZAorICogb2YgYSBzdWItcmVzb3VyY2UgbG9jYXRvciB0aGF0IHJldHVybnMgYSBkeW5hbWljIHByb3h5LgorICogVGhpcyB0ZXN0IHNob3VsZCBjb3ZlciBhbHNvIHRoZSBFSkIgY2FzZSwgYXMgdGhlIGNvbW1vbiBjYXVzZQorICogaXMgbWlzc2luZyB0eXBlIHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VEeW5hbWljUHJveHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKExpc3RQcm92aWRlci5jbGFzcywgUm9vdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWItcmVzb3VyY2UgaW50ZXJmYWNlIHNvIHRoYXQgaXQgaXMgZWFzeSB0byBtYWtlIGEgZHluYW1pYyBwcm94eQorICAgICAqIHdpdGggdGhlIHN0YW5kYXJkIEphdmEgcmVmbGVjdGlvbiBBUEkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIExpc3Q8Rm9vPiBnZXRHcmVldGluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciB0eXBlIHRvIGJlIHVzZWQgYXMgYSB0eXBlIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvbyB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVzc2FnZSBib2R5IHdyaXRlciB0aGF0IHVzZXMgdG8gY2hlY2sgcHJlc2VuY2Ugb2YgdHlwZSBwYXJhbWV0ZXIgaW4gdGhlIHByb3ZpZGVkIGVudGl0eSB0eXBlLgorICAgICAqIElmIG5vIHR5cGUgcGFyYW1ldGVyIGlzIGZvdW5kIHRoZSBwcm92aWRlciByZWZ1c2VzIHRvIHByb2Nlc3MgY29ycmVzcG9uZGluZyBlbnRpdHksCisgICAgICogd2hpY2ggd291bGQgbGVhZCB0byBhbiBlcnJvci4KKyAgICAgKi8KKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPExpc3Q8Rm9vPj4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIHRoZSBkYXRhIHRoYXQgd291bGQgYmUgd3JpdHRlbiB0byB0aGUgcmVzcG9uc2UgYm9keSBieSB0aGUge0BsaW5rIExpc3RQcm92aWRlcn0gYmVsbG93LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19EQVRBID0gImVuc3VyZSB0aGlzIG9uZSBtYWtlcyBpdCB0byB0aGUgY2xpZW50IjsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2UgbmVlZCB0byB3b3JrIHdpdGggYSBub24tbnVsbCBlbnRpdHkgaGVyZSBzbyB0aGF0IHRoZSB3b3JrZXIgY291bGQgZG8gaXQncyBqb2IuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgTGlua2VkTGlzdDxGb28+IFRFU1RfRU5USVRZID0gbmV3IExpbmtlZExpc3Q8Rm9vPigpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQobmV3IEZvbygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBpZiAoIShnZW5lcmljVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpIGdlbmVyaWNUeXBlOworCisgICAgICAgICAgICBpZiAocHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghKHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSBpbnN0YW5jZW9mIENsYXNzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgQ2xhc3MgbGlzdENsYXNzID0gKENsYXNzKSBwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CisgICAgICAgICAgICByZXR1cm4gbGlzdENsYXNzID09IEZvby5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKExpc3Q8Rm9vPiB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKExpc3Q8Rm9vPiB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHModCwgVEVTVF9FTlRJVFkpOworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKENIRUNLX0RBVEEuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicm9vdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290UmVzb3VyY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdWItcmVzb3VyY2UgbG9jYXRvciBpcyB1c2VkIGhlcmUsIHNvIHRoYXQgcmVzb3VyY2UgbW9kZWwgd2lsbCBiZSBidWlsdAorICAgICAgICAgKiBhdCBydW50aW1lLCB3aGVuIHRoZSBhY3R1YWwgaGFuZGxlciBpcyB0aGUgZHluYW1pYyBwcm94eS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBkeW5hbWljIHByb3h5IGZvciB0aGUgc3ViLXJlc291cmNlCisgICAgICAgICAqLworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGdldFN1YnJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIChTdWJSZXNvdXJjZSkgUHJveHkubmV3UHJveHlJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgUm9vdFJlc291cmNlLmNsYXNzLmdldENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzczw/PltdIHtTdWJSZXNvdXJjZS5jbGFzc30sCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnZvY2F0aW9uSGFuZGxlcigpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMaXN0UHJvdmlkZXIuVEVTVF9FTlRJVFk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBzdXJlIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZCB3aXRob3V0IGVycm9ycywgYW5kIHRoZSBkYXRhCisgICAgICogd3JpdHRlbiBieSB0aGUge0BsaW5rIExpc3RQcm92aWRlcn0gaXMgcmV0dXJuZWQgYmFjayB0byB0aGUgY2xpZW50LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlUHJveHkoKSB7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9yb290L3N1YiIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMaXN0UHJvdmlkZXIuQ0hFQ0tfREFUQSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9YWEVUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9YWEVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzZDNiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1hYRVRlc3QuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB4bWwgc2VjdXJpdHkuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgWFhFVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1RZUEUgPSAiPCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgeHhlIFNZU1RFTSBcIiVzXCI+XT4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUwgPSAiPGpheGJCZWFuPjx2YWx1ZT4meHhlOzwvdmFsdWU+PC9qYXhiQmVhbj4iOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RG9jdW1lbnQoKSB7CisgICAgICAgIGZpbmFsIFVSTCB1ID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCJ4eGUudHh0Iik7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KERPQ1RZUEUsIHUudG9TdHJpbmcoKSkgKyBYTUw7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGlzdERvY3VtZW50KCkgeworICAgICAgICBmaW5hbCBVUkwgdSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgieHhlLnR4dCIpOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdChET0NUWVBFLCB1LnRvU3RyaW5nKCkpICsgIjxqYXhiQmVhbnM+IiArIFhNTCArIFhNTCArIFhNTCArICI8L2pheGJCZWFucz4iOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5SG9sZGVyUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJqYXhiIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIEpheGJCZWFuIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBzLnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImpheGJlbGVtZW50IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIEpBWEJFbGVtZW50PEpheGJCZWFuVHlwZT4gcykgeworICAgICAgICAgICAgcmV0dXJuIHMuZ2V0VmFsdWUoKS52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJqYXhiL2xpc3QiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgTGlzdDxKYXhiQmVhbj4gcykgeworICAgICAgICAgICAgcmV0dXJuIHMuZ2V0KDApLnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInNheCIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTQVhTb3VyY2UgcG9zdFNheChmaW5hbCBTQVhTb3VyY2UgcykgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZG9tIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0RG9tKGZpbmFsIERPTVNvdXJjZSBzKSB7CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudCBkID0gKERvY3VtZW50KSBzLmdldE5vZGUoKTsKKyAgICAgICAgICAgIGZpbmFsIEVsZW1lbnQgZSA9IChFbGVtZW50KSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2YWx1ZSIpLml0ZW0oMCk7CisgICAgICAgICAgICBmaW5hbCBOb2RlIG4gPSBlLmdldENoaWxkTm9kZXMoKS5pdGVtKDApOworICAgICAgICAgICAgaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuLmdldE5vZGVWYWx1ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN0cmVhbSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJlYW1Tb3VyY2UgcG9zdFN0cmVhbShmaW5hbCBTdHJlYW1Tb3VyY2UgcykgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEVudGl0eUhvbGRlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCU2VjdXJlKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImpheGIiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5wb3N0KEVudGl0eS5lbnRpdHkoZ2V0RG9jdW1lbnQoKSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJTZWN1cmVXaXRoVGhyZWFkcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBpbnQgbiA9IDQ7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKG4pOworCisgICAgICAgIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiamF4YiIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLnBvc3QoRW50aXR5LmVudGl0eShnZXREb2N1bWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHMpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBTZXQ8VGhyb3dhYmxlPiBzID0gbmV3IEhhc2hTZXQ8VGhyb3dhYmxlPigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgZmluYWwgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKHJ1bm5hYmxlKTsKKyAgICAgICAgICAgIHQuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBUaHJlYWQuVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVuY2F1Z2h0RXhjZXB0aW9uKGZpbmFsIFRocmVhZCB0LCBmaW5hbCBUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgcy5hZGQoZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxhdGNoLmF3YWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50U2VjdXJlKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImpheGJlbGVtZW50IikucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikucG9zdChFbnRpdHkuZW50aXR5KGdldERvY3VtZW50KCksCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBzKTsKKyAgICB9CisKKyAgICBASWdub3JlIC8vIFRPRE8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCTGlzdFNlY3VyZSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJqYXhiL2xpc3QiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5wb3N0KEVudGl0eS5lbnRpdHkoZ2V0TGlzdERvY3VtZW50KCksCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTQVhTZWN1cmUoKSB7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGIgPSB0YXJnZXQoKS5wYXRoKCJzYXgiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5wb3N0KEVudGl0eS5lbnRpdHkoZ2V0RG9jdW1lbnQoKSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgYi52YWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RE9NU2VjdXJlKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImRvbSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLnBvc3QoRW50aXR5LmVudGl0eShnZXREb2N1bWVudCgpLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtU2VjdXJlKCkgeworICAgICAgICBmaW5hbCBKYXhiQmVhbiBiID0gdGFyZ2V0KCkucGF0aCgic3RyZWFtIikucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikucG9zdChFbnRpdHkuZW50aXR5KGdldERvY3VtZW50KCksCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGIudmFsdWUpOworICAgIH0KKworICAgIC8vIE5PVEUgLSB0aGlzIGlzIGEgdGVzIG1pZ3JhdGVkIGZyb20gSmVyc2V5IDEueCB0ZXN0cy4gVGhlIG9yaWdpbmFsIHRlc3QgY2xhc3MgY29udGFpbnMgYWxzbyBpbnNlY3VyZSAidmVyc2lvbnMiIG9mIHRoZQorICAgIC8vIG1ldGhvZHMgYWJvdmUgY29uZmlndXJlZCB2aWEgRmVhdHVyZXNBbmRQcm9wZXJ0aWVzLkZFQVRVUkVfRElTQUJMRV9YTUxfU0VDVVJJVFkuIFRob3NlIG1ldGhvZHMgYXJlIG9tbWl0ZWQsCisgICAgLy8gYXMgSmVyc2V5IDIgZG9lcyBub3Qgc3VwcG9ydCBzdWNoIGNvbnN0dXJjdC4KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvWG1sSmF4QkVsZW1lbnRQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1htbEpheEJFbGVtZW50UHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViODRlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1htbEpheEJFbGVtZW50UHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgWG1sSmF4QkVsZW1lbnRQcm92aWRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEF0b20uY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJhdG9tIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF0b20geworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBoZWFkZXJzOworCisgICAgICAgIEBQYXRoKCJ3aWxkY2FyZCIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vKiIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vKiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB3aWxkY2FyZChKQVhCRWxlbWVudDxTdHJpbmc+IGpheGIpIHsKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYSA9IGhlYWRlcnMuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soamF4YikudHlwZShtZWRpYSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJhdG9tIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9hdG9tK3htbCIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYXRvbSt4bWwiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXRvbShKQVhCRWxlbWVudDxTdHJpbmc+IGpheGIpIHsKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYSA9IGhlYWRlcnMuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soamF4YikudHlwZShtZWRpYSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJlbXB0eSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBlbXB0eUNvbnN1bWVzUHJvZHVjZXMoSkFYQkVsZW1lbnQ8U3RyaW5nPiBqYXhiKSB7CisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWEgPSBoZWFkZXJzLmdldE1lZGlhVHlwZSgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGpheGIpLnR5cGUobWVkaWEpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSAiYXRvbS93aWxkY2FyZCI7CisgICAgICAgIF90ZXN0KHBhdGgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChTdHJpbmcgcGF0aCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KHBhdGgpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXMgPSB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vYXRvbSt4bWwiKS5wb3N0KAorICAgICAgICAgICAgICAgIEVudGl0eS5lbnRpdHkobmV3IEpBWEJFbGVtZW50PFN0cmluZz4obmV3IFFOYW1lKCJhdG9tIiksIFN0cmluZy5jbGFzcywgInZhbHVlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24vYXRvbSt4bWwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIEdlbmVyaWNUeXBlPEpBWEJFbGVtZW50PFN0cmluZz4+IGdlbmVyaWNUeXBlID0gbmV3IEdlbmVyaWNUeXBlPEpBWEJFbGVtZW50PFN0cmluZz4+KCkge307CisgICAgICAgIGZpbmFsIEpBWEJFbGVtZW50PFN0cmluZz4gc3RyaW5nSkFYQkVsZW1lbnQgPSByZXMucmVhZEVudGl0eShnZW5lcmljVHlwZSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBzdHJpbmdKQVhCRWxlbWVudC5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdG9tKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9ICJhdG9tL2F0b20iOworICAgICAgICBfdGVzdChwYXRoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSAiYXRvbS9lbXB0eSI7CisgICAgICAgIF90ZXN0KHBhdGgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1htbE1veHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9YbWxNb3h5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOTVjYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9YbWxNb3h5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNFbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkueG1sLk1veHlYbWxGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBYbWxNb3h5VGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SmF4YkJlYW4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKSwgSmF4YkJlYW5SZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZU1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZU1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKYXhiQmVhbj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuUmVwcmVzZW50YXRpb25NZWRpYVR5cGUoKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKYXhiQmVhblJlc291cmNlTWVkaWFUeXBlLmNsYXNzLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vK3htbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uRXJyb3IoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpheGJCZWFuUmVzb3VyY2UiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgeG1sID0gIjxyb290PmZvbzwvcm9vdD4iOworICAgICAgICBmaW5hbCBSZXNwb25zZSBjciA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHhtbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCJKYXhiQmVhblRleHRSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3htbCIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblRleHRSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxKYXhiQmVhbj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuVGV4dFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKSwgSmF4YkJlYW5UZXh0UmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRMaXN0UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgQENvbnN1bWVzKHsiYXBwbGljYXRpb24veG1sIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50TGlzdFJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4+IHsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gZ2V0SkFYQkVsZW1lbnRMaXN0KCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRKQVhCRWxlbWVudEFycmF5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50TGlzdFhNTFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdExpc3RPckFycmF5KHRydWUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgX3Rlc3RMaXN0T3JBcnJheShmaW5hbCBib29sZWFuIGlzTGlzdCwgZmluYWwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBpbiA9IGlzTGlzdCA/IGdldEpBWEJFbGVtZW50TGlzdCgpIDogZ2V0SkFYQkVsZW1lbnRBcnJheSgpOworICAgICAgICBmaW5hbCBHZW5lcmljVHlwZSBndCA9IGlzTGlzdCA/IG5ldyBHZW5lcmljVHlwZTxMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+PigpIHsKKyAgICAgICAgfSA6IG5ldyBHZW5lcmljVHlwZTxKQVhCRWxlbWVudDxTdHJpbmc+W10+KCkgeworICAgICAgICB9OworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoaXNMaXN0ID8gIkpBWEJFbGVtZW50TGlzdFJlc291cmNlIiA6ICJKQVhCRWxlbWVudEFycmF5UmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IG91dCA9IHRhcmdldC5yZXF1ZXN0KG10KS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHkoaW4sIGd0LmdldFR5cGUoKSksIG10KSwgZ3QpOworCisgICAgICAgIGZpbmFsIExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gaW5MaXN0ID0KKyAgICAgICAgICAgICAgICBpc0xpc3QgPyAoKExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4pIGluKSA6IEFycmF5cy5hc0xpc3QoKEpBWEJFbGVtZW50PFN0cmluZz5bXSkgaW4pOworICAgICAgICBmaW5hbCBMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+IG91dExpc3QgPSBpc0xpc3QgPyAoKExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4pIG91dCkgOiBBcnJheXMKKyAgICAgICAgICAgICAgICAuYXNMaXN0KChKQVhCRWxlbWVudDxTdHJpbmc+W10pIG91dCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTGVuZ3RocyBkaWZmZXIiLCBpbkxpc3Quc2l6ZSgpLCBvdXRMaXN0LnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5MaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5hbWVzIG9mIGVsZW1lbnRzIGF0IGluZGV4ICIgKyBpICsgIiBkaWZmZXIiLCBpbkxpc3QuZ2V0KGkpLmdldE5hbWUoKSwgb3V0TGlzdC5nZXQoaSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVmFsdWVzIG9mIGVsZW1lbnRzIGF0IGluZGV4ICIgKyBpICsgIiBkaWZmZXIiLCBpbkxpc3QuZ2V0KGkpLmdldFZhbHVlKCksIG91dExpc3QuZ2V0KGkpLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QXJyYXlSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRBcnJheVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PFN0cmluZz5bXT4geworICAgIH0KKworICAgIHByaXZhdGUgSkFYQkVsZW1lbnQ8U3RyaW5nPltdIGdldEpBWEJFbGVtZW50QXJyYXkoKSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICByZXR1cm4gbmV3IEpBWEJFbGVtZW50W10geworICAgICAgICAgICAgICAgIG5ldyBKQVhCRWxlbWVudChRTmFtZS52YWx1ZU9mKCJlbGVtZW50MSIpLCBTdHJpbmcuY2xhc3MsICJhaG9qIiksCisgICAgICAgICAgICAgICAgbmV3IEpBWEJFbGVtZW50KFFOYW1lLnZhbHVlT2YoImVsZW1lbnQyIiksIFN0cmluZy5jbGFzcywgIm5hemRhciIpCisgICAgICAgIH07CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRBcnJheVhNTFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdExpc3RPckFycmF5KGZhbHNlLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZU1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8SmF4YkJlYW5UeXBlPj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhblJlcHJlc2VudGF0aW9uTWVkaWFUeXBlKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKSwgSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VNZWRpYVR5cGUuY2xhc3MsIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28reG1sIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhblJlcHJlc2VudGF0aW9uRXJyb3IoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJFbGVtZW50QmVhblJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHhtbCA9ICI8cm9vdD48dmFsdWU+Zm9vIjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgY3IgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSh4bWwsICJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuVGV4dFJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoInRleHQveG1sIikKKyAgICBAQ29uc3VtZXMoInRleHQveG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50QmVhblRleHRSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuVGV4dFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKSwgSkFYQkVsZW1lbnRCZWFuVGV4dFJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuVEVYVF9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJUeXBlUmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCVHlwZVJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gcG9zdChmaW5hbCBKYXhiQmVhblR5cGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXhiQmVhbih0LnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiAoKFJlc291cmNlQ29uZmlnKSBzdXBlci5jb25maWd1cmUoKSkucmVnaXN0ZXIobmV3IE1veHlYbWxGZWF0dXJlKFNpbXBsZUJlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY29uZmlnKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBNb3h5WG1sRmVhdHVyZShTaW1wbGVCZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlR5cGVSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQlR5cGVSZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhblR5cGUgb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi94bWwiKSwgSmF4YkJlYW5UeXBlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCVHlwZVJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCVHlwZVJlc291cmNlTWVkaWFUeXBlIGV4dGVuZHMgSkFYQlR5cGVSZXNvdXJjZSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlR5cGVSZXByZXNlbnRhdGlvbk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQlR5cGVSZXNvdXJjZU1lZGlhVHlwZSIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhblR5cGUgb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIEpheGJCZWFuVHlwZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQk9iamVjdFJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQk9iamVjdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgT2JqZWN0IHBvc3QoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCT2JqZWN0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+IHsKKworICAgICAgICBwdWJsaWMgSkFYQkNvbnRleHQgZ2V0Q29udGV4dChmaW5hbCBDbGFzczw/PiBjKSB7CisgICAgICAgICAgICBpZiAoT2JqZWN0LmNsYXNzID09IGMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoSmF4YkJlYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEpBWEJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9PUC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJPYmplY3RSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQk9iamVjdFJlc291cmNlIik7CisgICAgICAgIGZpbmFsIE9iamVjdCBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbiwgb3V0KTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQk9iamVjdFJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCT2JqZWN0UmVzb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBKQVhCT2JqZWN0UmVzb3VyY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJPYmplY3RSZXByZXNlbnRhdGlvbk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQk9iamVjdFJlc291cmNlTWVkaWFUeXBlIik7CisgICAgICAgIGZpbmFsIE9iamVjdCBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4sIG91dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQk9iamVjdFJlcHJlc2VudGF0aW9uRXJyb3IoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJPYmplY3RSZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB4bWwgPSAiPHJvb3Q+Zm9vPC9yb290PiI7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNyID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoeG1sLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgTGlzdDxKYXhiQmVhbj4gcG9zdChmaW5hbCBMaXN0PEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzZXQiKQorICAgICAgICBwdWJsaWMgU2V0PEpheGJCZWFuPiBwb3N0U2V0KGZpbmFsIFNldDxKYXhiQmVhbj4gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgicXVldWUiKQorICAgICAgICBwdWJsaWMgUXVldWU8SmF4YkJlYW4+IHBvc3RRdWV1ZShmaW5hbCBRdWV1ZTxKYXhiQmVhbj4gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic3RhY2siKQorICAgICAgICBwdWJsaWMgU3RhY2s8SmF4YkJlYW4+IHBvc3RTdGFjayhmaW5hbCBTdGFjazxKYXhiQmVhbj4gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiY3VzdG9tIikKKyAgICAgICAgcHVibGljIE15QXJyYXlMaXN0PEpheGJCZWFuPiBwb3N0Q3VzdG9tKGZpbmFsIE15QXJyYXlMaXN0PEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248SmF4YkJlYW4+IGdldCgpIHsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxKYXhiQmVhbj4gbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJvbmUiKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oInR3byIpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigidGhyZWUiKSk7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ0eXBlIikKKyAgICAgICAgcHVibGljIExpc3Q8SmF4YkJlYW4+IHBvc3RUeXBlKGZpbmFsIENvbGxlY3Rpb248SmF4YkJlYW5UeXBlPiBsKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEpheGJCZWFuPiBiZWFucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBKYXhiQmVhblR5cGUgdCA6IGwpIHsKKyAgICAgICAgICAgICAgICBiZWFucy5hZGQobmV3IEpheGJCZWFuKHQudmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiZWFuczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJKQVhCQXJyYXlSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJBcnJheVJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW5bXSBwb3N0KGZpbmFsIEpheGJCZWFuW10gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbltdIGdldCgpIHsKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxKYXhiQmVhbj4gbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJvbmUiKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oInR3byIpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigidGhyZWUiKSk7CisgICAgICAgICAgICByZXR1cm4gbC50b0FycmF5KG5ldyBKYXhiQmVhbltsLnNpemUoKV0pOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInR5cGUiKQorICAgICAgICBwdWJsaWMgSmF4YkJlYW5bXSBwb3N0VHlwZShmaW5hbCBKYXhiQmVhblR5cGVbXSBsKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEpheGJCZWFuPiBiZWFucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBKYXhiQmVhblR5cGUgdCA6IGwpIHsKKyAgICAgICAgICAgICAgICBiZWFucy5hZGQobmV3IEpheGJCZWFuKHQudmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiZWFucy50b0FycmF5KG5ldyBKYXhiQmVhbltiZWFucy5zaXplKCldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJBcnJheVJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCQXJyYXlSZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIEpheGJCZWFuW10gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KEpheGJCZWFuW10uY2xhc3MpOworICAgICAgICBKYXhiQmVhbltdIGIgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShhLCAiYXBwbGljYXRpb24veG1sIiksIEpheGJCZWFuW10uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoYS5sZW5ndGgsIGIubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYVtpXSwgYltpXSk7CisgICAgICAgIH0KKworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInR5cGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGEsICJhcHBsaWNhdGlvbi94bWwiKSwgSmF4YkJlYW5bXS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmxlbmd0aCwgYi5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhW2ldLCBiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJKQVhCTGlzdFJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlTWVkaWFUeXBlIGV4dGVuZHMgSkFYQkxpc3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkxpc3RSZXByZXNlbnRhdGlvbk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZU1lZGlhVHlwZSIpOworCisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGEgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBDb2xsZWN0aW9uPEpheGJCZWFuPiBiID0gdGFyZ2V0LnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KGEpIHt9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHt9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGEgPSBuZXcgTGlua2VkTGlzdDw+KGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInF1ZXVlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxRdWV1ZTxKYXhiQmVhbj4+KChRdWV1ZTxKYXhiQmVhbj4pIGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSwgbmV3IEdlbmVyaWNUeXBlPFF1ZXVlPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYSA9IG5ldyBIYXNoU2V0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic2V0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxTZXQ8SmF4YkJlYW4+PigoU2V0PEpheGJCZWFuPikgYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8U2V0PEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBDb21wYXJhdG9yPEpheGJCZWFuPiBjID0gbmV3IENvbXBhcmF0b3I8SmF4YkJlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgSmF4YkJlYW4gdCwgZmluYWwgSmF4YkJlYW4gdDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZS5jb21wYXJlVG8odDEudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBUcmVlU2V0PEpheGJCZWFuPiB0MSA9IG5ldyBUcmVlU2V0PD4oYyk7CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8SmF4YkJlYW4+IHQyID0gbmV3IFRyZWVTZXQ8PihjKTsKKyAgICAgICAgdDEuYWRkQWxsKGEpOworICAgICAgICB0Mi5hZGRBbGwoYik7CisgICAgICAgIGFzc2VydEVxdWFscyh0MSwgdDIpOworCisgICAgICAgIGZpbmFsIFN0YWNrPEpheGJCZWFuPiBzID0gbmV3IFN0YWNrPD4oKTsKKyAgICAgICAgcy5hZGRBbGwoYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic3RhY2siKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFN0YWNrPEpheGJCZWFuPj4ocykgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8U3RhY2s8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBiKTsKKworICAgICAgICBhID0gbmV3IE15QXJyYXlMaXN0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgiY3VzdG9tIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxNeUFycmF5TGlzdDxKYXhiQmVhbj4+KChNeUFycmF5TGlzdDxKYXhiQmVhbj4pIGEpIHsKKyAgICAgICAgICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8TXlBcnJheUxpc3Q8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25FcnJvcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB4bWwgPSAiPHJvb3Q+PHZhbHVlPmZvbyI7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNyID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoeG1sLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZUJlYW4geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBTaW1wbGVCZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNpbXBsZUJlYW4oZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGxleEpheGJCZWFuIHsKKworICAgICAgICBwcml2YXRlIE9iamVjdCBzaW1wbGVCZWFuOworCisgICAgICAgIHB1YmxpYyBDb21wbGV4SmF4YkJlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGxleEpheGJCZWFuKGZpbmFsIE9iamVjdCBzaW1wbGVCZWFuKSB7CisgICAgICAgICAgICB0aGlzLnNpbXBsZUJlYW4gPSBzaW1wbGVCZWFuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRTaW1wbGVCZWFuKCkgeworICAgICAgICAgICAgcmV0dXJuIHNpbXBsZUJlYW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTaW1wbGVCZWFuKGZpbmFsIE9iamVjdCBzaW1wbGVCZWFuKSB7CisgICAgICAgICAgICB0aGlzLnNpbXBsZUJlYW4gPSBzaW1wbGVCZWFuOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkFkZGl0aW9uYWxDbGFzc2VzUmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBZGRpdGlvbmFsQ2xhc3Nlc1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBDb21wbGV4SmF4YkJlYW4gZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4SmF4YkJlYW4obmV3IFNpbXBsZUJlYW4oImZvbyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZGl0aW9uYWxDbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbXBsZXhKYXhiQmVhbiBub25KYXhiQmVhbiA9IHRhcmdldCgiQWRkaXRpb25hbENsYXNzZXNSZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoQ29tcGxleEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHNpbXBsZUJlYW4gPSBub25KYXhiQmVhbi5nZXRTaW1wbGVCZWFuKCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChzaW1wbGVCZWFuLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoc2ltcGxlQmVhbiwgaW5zdGFuY2VPZihTaW1wbGVCZWFuLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoImZvbyIsIGVxdWFsVG8oKChTaW1wbGVCZWFuKSBzaW1wbGVCZWFuKS5nZXRWYWx1ZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0RlZmF1bHRGaWx0ZXJpbmdTY29wZS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0RlZmF1bHRGaWx0ZXJpbmdTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNjMwYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRGVmYXVsdEZpbHRlcmluZ1Njb3BlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0RmlsdGVyaW5nU2NvcGUgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxFbnRpdHlGaWx0ZXJpbmc+IGltcGxlbWVudHMgRW50aXR5RmlsdGVyaW5nIHsKKworICAgIC8qKgorICAgICAqIEdldCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgRW50aXR5RmlsdGVyaW5nfSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBEZWZhdWx0RmlsdGVyaW5nU2NvcGUoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VtcHR5RW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VtcHR5RW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzM1NjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW1wdHlFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5FbXB0eUVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTm9uRW1wdHlFbnRpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBVc2UtY2FzZXMgdG8gY2hlY2sgd2hldGhlciBlbXB0eSBjbGFzcyBjYXVzZXMgcHJvYmxlbXMgKEpFUlNFWS0yODI0IHJlcHJvZHVjZXIpLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRW1wdHlFbnRpdHlUZXN0IGV4dGVuZHMgRW50aXR5RmlsdGVyaW5nVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJlbnRpdHkvZmlsdGVyaW5nIikKKyAgICBAUHJvZHVjZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJub25FbXB0eUVudGl0eSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIE5vbkVtcHR5RW50aXR5IG5vbkVtcHR5RW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIE5vbkVtcHR5RW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImVtcHR5RW50aXR5IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgRW1wdHlFbnRpdHkgZW1wdHlFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5RW50aXR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLy8gUHJvdmlkZXJzLgorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FbXB0eUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJub25FbXB0eUVudGl0eSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgInZhbHVlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiZW1wdHlFbnRpdHkiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nQ2xpZW50VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ0NsaWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA1MDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ0NsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEVudGl0eUZpbHRlcmluZ0NsaWVudFRlc3QgZXh0ZW5kcyBFbnRpdHlGaWx0ZXJpbmdUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVkaWFUeXBlIEVOVElUWV9GSUxURVJJTkcgPSBuZXcgTWVkaWFUeXBlKCJlbnRpdHkiLCAiZmlsdGVyaW5nIik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihGaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJlbnRpdHkvZmlsdGVyaW5nIikKKyAgICBAUHJvZHVjZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUFubm90YXRpb25zUHJpbWFyeVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVElUWV9GSUxURVJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uW10ge1ByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LHN1YkVudGl0aWVzLmZpZWxkMixzdWJFbnRpdGllcy5wcm9wZXJ0eTIsc3ViRW50aXRpZXMucHJvcGVydHkxLCIKKyAgICAgICAgICAgICAgICArICJzdWJFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcy5wcm9wZXJ0eSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUFubm90YXRpb25zRGVmYXVsdFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5USVRZX0ZJTFRFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bXSB7bmV3IERlZmF1bHRGaWx0ZXJpbmdTY29wZSgpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoZmllbGRzLCBlcXVhbFRvKCIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5QW5ub3RhdGlvbnNJbnZhbGlkVmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5USVRZX0ZJTFRFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bXSB7Q3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuSU5TVEFOQ0V9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChmaWVsZHMsIGVxdWFsVG8oIiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uUHJpbWFyeVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENvbmZpZ3VyYXRpb24oImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LHN1YkVudGl0aWVzLmZpZWxkMixzdWJFbnRpdGllcy5wcm9wZXJ0eTIsc3ViRW50aXRpZXMucHJvcGVydHkxLCIKKyAgICAgICAgICAgICAgICArICJzdWJFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcy5wcm9wZXJ0eSIsIFByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbkRlZmF1bHRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDb25maWd1cmF0aW9uKCIiLCBuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25NdWx0aXBsZVZpZXdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDb25maWd1cmF0aW9uKCJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxzdWJFbnRpdGllcy5maWVsZDIsc3ViRW50aXRpZXMucHJvcGVydHkyLHN1YkVudGl0aWVzLnByb3BlcnR5MSwiCisgICAgICAgICAgICAgICAgICAgICAgICArICJzdWJFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcy5wcm9wZXJ0eSIsIFByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKSwKKyAgICAgICAgICAgICAgICBDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDb25maWd1cmF0aW9uKGZpbmFsIFN0cmluZyBleHBlY3RlZCwgZmluYWwgQW5ub3RhdGlvbi4uLiBhbm5vdGF0aW9ucykgeworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuRU5USVRZX0ZJTFRFUklOR19TQ09QRSwgYW5ub3RhdGlvbnMubGVuZ3RoID09IDEgPyBhbm5vdGF0aW9uc1swXSA6IGFubm90YXRpb25zKTsKKyAgICAgICAgY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZykKKyAgICAgICAgICAgICAgICAudGFyZ2V0KGdldEJhc2VVcmkoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSgpLCBFTlRJVFlfRklMVEVSSU5HKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgZXhwZWN0ZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCAiaW52YWxpZF92YWx1ZSIpOworICAgICAgICBjb25maWd1cmVDbGllbnQoY29uZmlnKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0KKyAgICAgICAgICAgICAgICBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpCisgICAgICAgICAgICAgICAgICAgICAgICAudGFyZ2V0KGdldEJhc2VVcmkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkoKSwgRU5USVRZX0ZJTFRFUklORyksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChmaWVsZHMsIGVxdWFsVG8oIiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlBbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCBTZWNvbmRhcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKSk7CisgICAgICAgIGNvbmZpZ3VyZUNsaWVudChjb25maWcpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpCisgICAgICAgICAgICAgICAgLnRhcmdldChnZXRCYXNlVXJpKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5USVRZX0ZJTFRFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IscHJvcGVydHksbWFueUVudGl0aWVzLnByb3BlcnR5MSxtYW55RW50aXRpZXMuZmllbGQxLG9uZUVudGl0aWVzLmZpZWxkMiwiCisgICAgICAgICAgICAgICAgKyAib25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLnByb3BlcnR5MSxvbmVFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcyIKKyAgICAgICAgICAgICAgICArICIucHJvcGVydHkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nT25DbGFzc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdPbkNsYXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMmMyNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nT25DbGFzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFVzZS1jYXNlcyB3aXRoIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMgb24gY2xhc3MuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlGaWx0ZXJpbmdPbkNsYXNzVGVzdCBleHRlbmRzIEVudGl0eUZpbHRlcmluZ1Rlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAvLyBSZXNvdXJjZXMuCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC8vIFByb3ZpZGVycy4KKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRmlsdGVyaW5nTWVzc2FnZUJvZHlQcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBDb25zdW1lcygiZW50aXR5L2ZpbHRlcmluZyIpCisgICAgQFByb2R1Y2VzKCJlbnRpdHkvZmlsdGVyaW5nIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJPbmVGaWx0ZXJpbmdFbnRpdHkiKQorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3IikKKyAgICAgICAgcHVibGljIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgZ2V0T25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJPbmVGaWx0ZXJpbmdFbnRpdHkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RPbmVGaWx0ZXJpbmdFbnRpdHkoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0Vmlld1Jlc3BvbnNlIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldE9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3UmVzcG9uc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkobmV3IE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkoKSwgbmV3IEFubm90YXRpb25bXSB7bmV3IERlZmF1bHRGaWx0ZXJpbmdTY29wZSgpfSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXciKQorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3IikKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3IikKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBnZXRNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzIikKKyAgICAgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiT25lRmlsdGVyaW5nRW50aXR5IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IscHJvcGVydHksc3ViRW50aXRpZXMuZmllbGQyLHN1YkVudGl0aWVzLnByb3BlcnR5MixzdWJFbnRpdGllcy5wcm9wZXJ0eTEsIgorICAgICAgICAgICAgICAgICsgInN1YkVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzLnByb3BlcnR5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25DbGFzc0RlZmF1bHRWaWV3UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgIiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uQ2xhc3NEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgIiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVmlld3NPbkNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPbkNsYXNzKCk7CisgICAgICAgIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPbkNsYXNzRGVmYXVsdFZpZXcoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXciKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMucHJvcGVydHkxLG1hbnlFbnRpdGllcy5maWVsZDEsb25lRW50aXRpZXMuZmllbGQyLCIKKyAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLG9uZUVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzIgorICAgICAgICAgICAgICAgICsgIi5wcm9wZXJ0eSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXciKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMuZmllbGQyLG1hbnlFbnRpdGllcy5wcm9wZXJ0eTIsbWFueUVudGl0aWVzLmZpZWxkMSwiCisgICAgICAgICAgICAgICAgKyAib25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzLnByb3BlcnR5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMuZmllbGQyLG1hbnlFbnRpdGllcy5wcm9wZXJ0eTIsbWFueUVudGl0aWVzLnByb3BlcnR5MSwiCisgICAgICAgICAgICAgICAgKyAibWFueUVudGl0aWVzLmZpZWxkMSxvbmVFbnRpdGllcy5maWVsZDIsb25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLnByb3BlcnR5MSxvbmVFbnRpdGllcy5maWVsZDEsIgorICAgICAgICAgICAgICAgICsgImRlZmF1bHRFbnRpdGllcy5maWVsZCxkZWZhdWx0RW50aXRpZXMucHJvcGVydHkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjYwM2FiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5PbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBVc2UtY2FzZXMgd2l0aCBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zIG9uIHByb3BlcnRpZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXNUZXN0IGV4dGVuZHMgRW50aXR5RmlsdGVyaW5nVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLy8gUHJvdmlkZXJzLgorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJlbnRpdHkvZmlsdGVyaW5nIikKKyAgICBAUHJvZHVjZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eSIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkgZ2V0T25lRmlsdGVyaW5nRW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3IikKKyAgICAgICAgcHVibGljIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0T25lRmlsdGVyaW5nRW50aXR5KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0Vmlld1Jlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KG5ldyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkoKSwgbmV3IEFubm90YXRpb25bXSB7bmV3IERlZmF1bHRGaWx0ZXJpbmdTY29wZSgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3IikKKyAgICAgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXciKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSBnZXRNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3IikKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cyIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoIk9uZUZpbHRlcmluZ0VudGl0eSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LHN1YkVudGl0aWVzLmZpZWxkMixzdWJFbnRpdGllcy5wcm9wZXJ0eTIsc3ViRW50aXRpZXMucHJvcGVydHkxLCIKKyAgICAgICAgICAgICAgICArICJzdWJFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcy5wcm9wZXJ0eSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc0RlZmF1bHRWaWV3UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzRGVmYXVsdFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXciKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG9uZUVudGl0aWVzLmZpZWxkMixvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLCIKKyAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcy5wcm9wZXJ0eSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXciKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMuZmllbGQyLG1hbnlFbnRpdGllcy5wcm9wZXJ0eTIsbWFueUVudGl0aWVzLmZpZWxkMSwiCisgICAgICAgICAgICAgICAgKyAib25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLmZpZWxkMSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlEZWZhdWx0VmlldyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMuZmllbGQyLG1hbnlFbnRpdGllcy5wcm9wZXJ0eTIsbWFueUVudGl0aWVzLnByb3BlcnR5MSwiCisgICAgICAgICAgICAgICAgKyAibWFueUVudGl0aWVzLmZpZWxkMSxvbmVFbnRpdGllcy5maWVsZDIsb25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLnByb3BlcnR5MSxvbmVFbnRpdGllcy5maWVsZDEsIgorICAgICAgICAgICAgICAgICsgImRlZmF1bHRFbnRpdGllcy5maWVsZCxkZWZhdWx0RW50aXRpZXMucHJvcGVydHkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nU2NvcGVzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1Njb3Blc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjkxMGZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1Njb3Blc1Rlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5Db21wbGV4RW50aXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEVudGl0eUZpbHRlcmluZ1Njb3Blc1Rlc3QgZXh0ZW5kcyBFbnRpdHlGaWx0ZXJpbmdUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLy8gUmVzb3VyY2VzLgorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAvLyBQcm92aWRlcnMuCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEZpbHRlcmluZ01lc3NhZ2VCb2R5UHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIEBQcm9kdWNlcygiZW50aXR5L2ZpbHRlcmluZyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgQ29tcGxleEVudGl0eSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhFbnRpdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW1hcnkgLT4gRGVmYXVsdCAtPiBQcmltYXJ5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUZpbHRlcmluZ1Njb3BlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiYWNjZXNzb3IscHJvcGVydHksZmllbGQuZmllbGQsZmllbGQuYWNjZXNzb3IsZmllbGQucHJvcGVydHkuYWNjZXNzb3IsZmllbGQucHJvcGVydHkucHJvcGVydHkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDgzMDNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5NYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFN1aXRlLmNsYXNzKQorQFN1aXRlLlN1aXRlQ2xhc3Nlcyh7CisgICAgICAgIEVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuQ29uZmlndXJhdGlvblNlcnZlclRlc3QuY2xhc3MsCisgICAgICAgIEVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuQ29uZmlndXJhdGlvbkRlZmF1bHRWaWV3U2VydmVyVGVzdC5jbGFzcywKKyAgICAgICAgRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5Bbm5vdGF0aW9uc1NlcnZlclRlc3QuY2xhc3MsCisgICAgICAgIEVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuQW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvblNlcnZlclRlc3QuY2xhc3MKK30pCitwdWJsaWMgY2xhc3MgRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFByb2R1Y2VzKCJlbnRpdHkvZmlsdGVyaW5nIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjb25maWd1cmF0aW9uIikKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UiKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0Q29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhbm5vdGF0aW9ucyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKSwgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLm9rKCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShuZXcgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5KCksIG5ldyBBbm5vdGF0aW9uW10ge1ByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYW5ub3RhdGlvbnNPdmVyUmVzb3VyY2UiKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRBbm5vdGF0aW9uc092ZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKSwgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uT3ZlclJlc291cmNlIikKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKSwgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWx0ZXJpbmdSZXNvdXJjZUNvbmZpZyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgICAgICBwcml2YXRlIEZpbHRlcmluZ1Jlc291cmNlQ29uZmlnKCkgeworICAgICAgICAgICAgLy8gUmVzb3VyY2VzLgorICAgICAgICAgICAgcmVnaXN0ZXIoUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgICAgICAvLyBQcm92aWRlcnMuCisgICAgICAgICAgICByZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyKEZpbHRlcmluZ01lc3NhZ2VCb2R5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uU2VydmVyVGVzdCBleHRlbmRzIEVudGl0eUZpbHRlcmluZ1Rlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsdGVyaW5nUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEUsIFByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiY29uZmlndXJhdGlvbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMucHJvcGVydHkxLG1hbnlFbnRpdGllcy5maWVsZDEsb25lRW50aXRpZXMuZmllbGQyLCIKKyAgICAgICAgICAgICAgICAgICAgKyAib25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLnByb3BlcnR5MSxvbmVFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiLnByb3BlcnR5Iik7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiY29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMucHJvcGVydHkxLG1hbnlFbnRpdGllcy5maWVsZDEsb25lRW50aXRpZXMuZmllbGQyLCIKKyAgICAgICAgICAgICAgICAgICAgKyAib25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLnByb3BlcnR5MSxvbmVFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiLnByb3BlcnR5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ3VyYXRpb25EZWZhdWx0Vmlld1NlcnZlclRlc3QgZXh0ZW5kcyBFbnRpdHlGaWx0ZXJpbmdUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmluZ1Jlc291cmNlQ29uZmlnKCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiY29uZmlndXJhdGlvbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbnNTZXJ2ZXJUZXN0IGV4dGVuZHMgRW50aXR5RmlsdGVyaW5nVGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJpbmdSZXNvdXJjZUNvbmZpZygpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJhbm5vdGF0aW9ucyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMucHJvcGVydHkxLG1hbnlFbnRpdGllcy5maWVsZDEsb25lRW50aXRpZXMuZmllbGQyLCIKKyAgICAgICAgICAgICAgICAgICAgKyAib25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLnByb3BlcnR5MSxvbmVFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiLnByb3BlcnR5Iik7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnNPdmVyUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoImFubm90YXRpb25zT3ZlclJlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5wcm9wZXJ0eTEsbWFueUVudGl0aWVzLmZpZWxkMSxvbmVFbnRpdGllcy5maWVsZDIsIgorICAgICAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLG9uZUVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzIgorICAgICAgICAgICAgICAgICAgICArICIucHJvcGVydHkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvblNlcnZlclRlc3QgZXh0ZW5kcyBFbnRpdHlGaWx0ZXJpbmdUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmluZ1Jlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCBuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoImFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb24iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IscHJvcGVydHksbWFueUVudGl0aWVzLnByb3BlcnR5MSxtYW55RW50aXRpZXMuZmllbGQxLG9uZUVudGl0aWVzLmZpZWxkMiwiCisgICAgICAgICAgICAgICAgICAgICsgIm9uZUVudGl0aWVzLnByb3BlcnR5MixvbmVFbnRpdGllcy5wcm9wZXJ0eTEsb25lRW50aXRpZXMuZmllbGQxLGRlZmF1bHRFbnRpdGllcy5maWVsZCxkZWZhdWx0RW50aXRpZXMiCisgICAgICAgICAgICAgICAgICAgICsgIi5wcm9wZXJ0eSIpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoImFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IscHJvcGVydHksbWFueUVudGl0aWVzLnByb3BlcnR5MSxtYW55RW50aXRpZXMuZmllbGQxLG9uZUVudGl0aWVzLmZpZWxkMiwiCisgICAgICAgICAgICAgICAgICAgICsgIm9uZUVudGl0aWVzLnByb3BlcnR5MixvbmVFbnRpdGllcy5wcm9wZXJ0eTEsb25lRW50aXRpZXMuZmllbGQxLGRlZmF1bHRFbnRpdGllcy5maWVsZCxkZWZhdWx0RW50aXRpZXMiCisgICAgICAgICAgICAgICAgICAgICsgIi5wcm9wZXJ0eSIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1MGUwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBDb21tb24gcGFyZW50IGNsYXNzIGZvciBFbnRpdHkgRmlsdGVyaW5nIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCithYnN0cmFjdCBjbGFzcyBFbnRpdHlGaWx0ZXJpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgKGZpbHRlcmVkKSBmaWVsZHMgb2YgZ2l2ZW4gc3RyaW5ncyBhcmUgZXF1YWwgKGZpZWxkcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0dWFsIGFjdHVhbCBmaWVsZHMgZnJvbSByZXNwb25zZSByZWNlaXZlZCBmcm9tIHNlcnZlci4KKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWQgZXhwZWN0ZWQgZmllbGRzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGFzc2VydFNhbWVGaWVsZHMoZmluYWwgU3RyaW5nIGFjdHVhbCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkKSB7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFjdHVhbFNldCA9IEFycmF5cy5zdHJlYW0oYWN0dWFsLnNwbGl0KCIsIikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gZXhwZWN0ZWRTZXQgPSBBcnJheXMuc3RyZWFtKGV4cGVjdGVkLnNwbGl0KCIsIikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbFNldCwgZXF1YWxUbyhleHBlY3RlZFNldCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9GaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRmlsdGVyaW5nTWVzc2FnZUJvZHlQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYjZiYTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRmlsdGVyaW5nTWVzc2FnZUJvZHlQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRmlsdGVyaW5nSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RHcmFwaDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuT2JqZWN0UHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorQENvbnN1bWVzKCJlbnRpdHkvZmlsdGVyaW5nIikKK0BQcm9kdWNlcygiZW50aXR5L2ZpbHRlcmluZyIpCitwdWJsaWMgY2xhc3MgRmlsdGVyaW5nTWVzc2FnZUJvZHlQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPE9iamVjdD4sIE1lc3NhZ2VCb2R5V3JpdGVyPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRmlsdGVyaW5nTWVzc2FnZUJvZHlQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgamF2YXguaW5qZWN0LlByb3ZpZGVyPE9iamVjdFByb3ZpZGVyPE9iamVjdEdyYXBoPj4gcHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzcyAhPSB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3MgIT0gdHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIE9iamVjdCBvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHJlYWRGcm9tKGZpbmFsIENsYXNzPE9iamVjdD4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdEdyYXBoIG9iamVjdEdyYXBoID0gcHJvdmlkZXIuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEZpbHRlcmluZ09iamVjdChGaWx0ZXJpbmdIZWxwZXIuZ2V0RW50aXR5Q2xhc3MoZ2VuZXJpY1R5cGUpLCBmYWxzZSwgYW5ub3RhdGlvbnMpOworCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0R3JhcGhUb1N0cmluZyhvYmplY3RHcmFwaCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBkdXJpbmcgcmVhZGluZyBhbiBvYmplY3QgZ3JhcGguIiwgdCk7CisgICAgICAgICAgICByZXR1cm4gIkVSUk9SOiAiICsgdC5nZXRNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE9iamVjdCBvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT2JqZWN0R3JhcGggb2JqZWN0R3JhcGggPSBwcm92aWRlci5nZXQoKQorICAgICAgICAgICAgICAgIC5nZXRGaWx0ZXJpbmdPYmplY3QoRmlsdGVyaW5nSGVscGVyLmdldEVudGl0eUNsYXNzKGdlbmVyaWNUeXBlKSwgdHJ1ZSwgYW5ub3RhdGlvbnMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUob2JqZWN0R3JhcGhUb1N0cmluZyhvYmplY3RHcmFwaCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBkdXJpbmcgd3JpdGluZyBhbiBvYmplY3QgZ3JhcGguIiwgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgb2JqZWN0R3JhcGhUb1N0cmluZyhmaW5hbCBPYmplY3RHcmFwaCBvYmplY3RHcmFwaCkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZmllbGQgOiBvYmplY3RHcmFwaFRvRmllbGRzKCIiLCBvYmplY3RHcmFwaCkpIHsKKyAgICAgICAgICAgIGlmICghZmllbGQuY29udGFpbnMoIlRyYW5zaWVudCIpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGZpZWxkKS5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBzYi5kZWxldGUoc2IubGVuZ3RoKCkgLSAxLCBzYi5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IG9iamVjdEdyYXBoVG9GaWVsZHMoZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgT2JqZWN0R3JhcGggb2JqZWN0R3JhcGgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIC8vIEZpZWxkcy4KKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZmllbGQgOiBvYmplY3RHcmFwaC5nZXRGaWVsZHMoKSkgeworICAgICAgICAgICAgZmllbGRzLmFkZChwcmVmaXggKyBmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdEdyYXBoPiBlbnRyeSA6IG9iamVjdEdyYXBoLmdldFN1YmdyYXBocygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpZWxkcy5hZGRBbGwob2JqZWN0R3JhcGhUb0ZpZWxkcyhwcmVmaXggKyBlbnRyeS5nZXRLZXkoKSArICIuIiwgZW50cnkuZ2V0VmFsdWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvUHJpbWFyeURldGFpbGVkVmlldy5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL1ByaW1hcnlEZXRhaWxlZFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBhMzQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL1ByaW1hcnlEZXRhaWxlZFZpZXcuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitARW50aXR5RmlsdGVyaW5nCitwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5RGV0YWlsZWRWaWV3IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPFByaW1hcnlEZXRhaWxlZFZpZXc+IGltcGxlbWVudHMgUHJpbWFyeURldGFpbGVkVmlldyB7CisKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBQcmltYXJ5RGV0YWlsZWRWaWV3IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL1NlY29uZGFyeURldGFpbGVkVmlldy5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL1NlY29uZGFyeURldGFpbGVkVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDIwNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvU2Vjb25kYXJ5RGV0YWlsZWRWaWV3LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLkZJRUxEfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorQEVudGl0eUZpbHRlcmluZworcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5RGV0YWlsZWRWaWV3IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPFNlY29uZGFyeURldGFpbGVkVmlldz4gaW1wbGVtZW50cyBTZWNvbmRhcnlEZXRhaWxlZFZpZXcgeworCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU2Vjb25kYXJ5RGV0YWlsZWRWaWV3IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL1RlcnRpYXJ5RGV0YWlsZWRWaWV3LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvVGVydGlhcnlEZXRhaWxlZFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjlhNTEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL1RlcnRpYXJ5RGV0YWlsZWRWaWV3LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLkZJRUxEfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorQEVudGl0eUZpbHRlcmluZworcHVibGljIEBpbnRlcmZhY2UgVGVydGlhcnlEZXRhaWxlZFZpZXcgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8VGVydGlhcnlEZXRhaWxlZFZpZXc+IGltcGxlbWVudHMgVGVydGlhcnlEZXRhaWxlZFZpZXcgeworCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGVydGlhcnlEZXRhaWxlZFZpZXcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0NvbXBsZXhFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vQ29tcGxleEVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTM2YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0NvbXBsZXhFbnRpdHkuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkF1dG9EZXRlY3Q7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbklnbm9yZTsKKworLyoqCisgKiBQcmltYXJ5IGRldGFpbGVkIHZpZXcgT05MWS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCisvLyBFbnRpdHkgRmlsdGVyaW5nLgorQFByaW1hcnlEZXRhaWxlZFZpZXcKK3B1YmxpYyBjbGFzcyBDb21wbGV4RW50aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGxleEVudGl0eSBJTlNUQU5DRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIElOU1RBTkNFID0gbmV3IENvbXBsZXhFbnRpdHkoKTsKKyAgICAgICAgSU5TVEFOQ0UuZmllbGQgPSBDb21wbGV4U3ViRW50aXR5LklOU1RBTkNFOworICAgICAgICBJTlNUQU5DRS5wcm9wZXJ0eSA9ICJwcm9wZXJ0eSI7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgQ29tcGxleFN1YkVudGl0eSBmaWVsZDsKKworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OworCisgICAgQFhtbFRyYW5zaWVudAorICAgIEBKc29uSWdub3JlCisgICAgcHVibGljIFN0cmluZyBhY2Nlc3NvclRyYW5zaWVudDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NvclRyYW5zaWVudCA9PSBudWxsID8gcHJvcGVydHkgKyBwcm9wZXJ0eSA6IGFjY2Vzc29yVHJhbnNpZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKGZpbmFsIFN0cmluZyBhY2Nlc3NvcikgeworICAgICAgICBhY2Nlc3NvclRyYW5zaWVudCA9IGFjY2Vzc29yOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vQ29tcGxleFN1YkVudGl0eS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9Db21wbGV4U3ViRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3NmUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vQ29tcGxleFN1YkVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CisKKy8qKgorICogRGVmYXVsdCB2aWV3IE9OTFkuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BKc29uQXV0b0RldGVjdChmaWVsZFZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSwgZ2V0dGVyVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZKQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKQorcHVibGljIGNsYXNzIENvbXBsZXhTdWJFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wbGV4U3ViRW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgQ29tcGxleFN1YkVudGl0eSgpOworICAgICAgICBJTlNUQU5DRS5maWVsZCA9ICJmaWVsZCI7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5ID0gQ29tcGxleFN1YlN1YkVudGl0eS5JTlNUQU5DRTsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgZmllbGQ7CisKKyAgICBwcml2YXRlIENvbXBsZXhTdWJTdWJFbnRpdHkgcHJvcGVydHk7CisKKyAgICBAWG1sVHJhbnNpZW50CisgICAgQEpzb25JZ25vcmUKKyAgICBwdWJsaWMgU3RyaW5nIGFjY2Vzc29yVHJhbnNpZW50OworCisgICAgcHVibGljIENvbXBsZXhTdWJTdWJFbnRpdHkgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBDb21wbGV4U3ViU3ViRW50aXR5IHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gYWNjZXNzb3JUcmFuc2llbnQgPT0gbnVsbCA/IGZpZWxkICsgZmllbGQgOiBhY2Nlc3NvclRyYW5zaWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihmaW5hbCBTdHJpbmcgYWNjZXNzb3IpIHsKKyAgICAgICAgYWNjZXNzb3JUcmFuc2llbnQgPSBhY2Nlc3NvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0NvbXBsZXhTdWJTdWJFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vQ29tcGxleFN1YlN1YkVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzA5ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0NvbXBsZXhTdWJTdWJFbnRpdHkuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlNlY29uZGFyeURldGFpbGVkVmlldzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CisKKy8qKgorICogTWl4ZWQgdmlld3MuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BKc29uQXV0b0RldGVjdChmaWVsZFZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSwgZ2V0dGVyVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZKQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKQorcHVibGljIGNsYXNzIENvbXBsZXhTdWJTdWJFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wbGV4U3ViU3ViRW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgQ29tcGxleFN1YlN1YkVudGl0eSgpOworICAgICAgICBJTlNUQU5DRS5maWVsZCA9ICJmaWVsZCI7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5ID0gInByb3BlcnR5IjsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudAorICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgU3RyaW5nIGZpZWxkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKyAgICBAWG1sVHJhbnNpZW50CisgICAgQEpzb25JZ25vcmUKKyAgICBwdWJsaWMgU3RyaW5nIGFjY2Vzc29yVHJhbnNpZW50OworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gYWNjZXNzb3JUcmFuc2llbnQgPT0gbnVsbCA/IGZpZWxkICsgZmllbGQgOiBhY2Nlc3NvclRyYW5zaWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihmaW5hbCBTdHJpbmcgYWNjZXNzb3IpIHsKKyAgICAgICAgYWNjZXNzb3JUcmFuc2llbnQgPSBhY2Nlc3NvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0RlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZDM4ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0RlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uQXV0b0RldGVjdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCitwdWJsaWMgY2xhc3MgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgSU5TVEFOQ0U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkID0gdHJ1ZTsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkgPSAyMEw7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgYm9vbGVhbiBmaWVsZDsKKyAgICBwcml2YXRlIExvbmcgcHJvcGVydHk7CisKKyAgICBwdWJsaWMgTG9uZyBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIExvbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vRW1wdHlFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vRW1wdHlFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgzODljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9FbXB0eUVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRW1wdHlFbnRpdHkgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9GaWx0ZXJlZENsYXNzRW50aXR5LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0ZpbHRlcmVkQ2xhc3NFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWVjNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9GaWx0ZXJlZENsYXNzRW50aXR5LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW47CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuVGVydGlhcnlEZXRhaWxlZFZpZXc7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uQXV0b0RldGVjdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCisvLyBFbnRpdHkgRmlsdGVyaW5nLgorQFRlcnRpYXJ5RGV0YWlsZWRWaWV3CitwdWJsaWMgY2xhc3MgRmlsdGVyZWRDbGFzc0VudGl0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgSU5TVEFOQ0U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBJTlNUQU5DRSA9IG5ldyBGaWx0ZXJlZENsYXNzRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkID0gNDA7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5ID0gInByb3BlcnR5IjsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBpbnQgZmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL01hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9NYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjIxZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9NYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlNlY29uZGFyeURldGFpbGVkVmlldzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BKc29uQXV0b0RldGVjdChmaWVsZFZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSwgZ2V0dGVyVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZKQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKQorLy8gRW50aXR5IEZpbHRlcmluZy4KK0BQcmltYXJ5RGV0YWlsZWRWaWV3CitAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CitwdWJsaWMgY2xhc3MgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkID0gNTA7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5ID0gInByb3BlcnR5IjsKKyAgICAgICAgSU5TVEFOQ0UuZGVmYXVsdEVudGl0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LklOU1RBTkNFKTsKKyAgICAgICAgSU5TVEFOQ0Uub25lRW50aXRpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KE9uZUZpbHRlcmluZ1N1YkVudGl0eS5JTlNUQU5DRSk7CisgICAgICAgIElOU1RBTkNFLm1hbnlFbnRpdGllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuSU5TVEFOQ0UpOworICAgICAgICBJTlNUQU5DRS5maWx0ZXJlZCA9IEZpbHRlcmVkQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgaW50IGZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OworCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgTGlzdDxEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5PiBkZWZhdWx0RW50aXRpZXM7CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBMaXN0PE9uZUZpbHRlcmluZ1N1YkVudGl0eT4gb25lRW50aXRpZXM7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgTGlzdDxNYW55RmlsdGVyaW5nc1N1YkVudGl0eT4gbWFueUVudGl0aWVzOworCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZDsKKworICAgIEBYbWxUcmFuc2llbnQKKyAgICBASnNvbklnbm9yZQorICAgIHB1YmxpYyBTdHJpbmcgYWNjZXNzb3JUcmFuc2llbnQ7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gYWNjZXNzb3JUcmFuc2llbnQgPT0gbnVsbCA/IHByb3BlcnR5ICsgcHJvcGVydHkgOiBhY2Nlc3NvclRyYW5zaWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihmaW5hbCBTdHJpbmcgYWNjZXNzb3IpIHsKKyAgICAgICAgYWNjZXNzb3JUcmFuc2llbnQgPSBhY2Nlc3NvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL01hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL01hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5Yjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlNlY29uZGFyeURldGFpbGVkVmlldzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BKc29uQXV0b0RldGVjdChmaWVsZFZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSwgZ2V0dGVyVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZKQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKQorcHVibGljIGNsYXNzIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkgSU5TVEFOQ0U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBJTlNUQU5DRSA9IG5ldyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSgpOworICAgICAgICBJTlNUQU5DRS5maWVsZCA9IDkwOworICAgICAgICBJTlNUQU5DRS5wcm9wZXJ0eSA9ICJwcm9wZXJ0eSI7CisgICAgICAgIElOU1RBTkNFLmRlZmF1bHRFbnRpdGllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5JTlNUQU5DRSk7CisgICAgICAgIElOU1RBTkNFLm9uZUVudGl0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChPbmVGaWx0ZXJpbmdTdWJFbnRpdHkuSU5TVEFOQ0UpOworICAgICAgICBJTlNUQU5DRS5tYW55RW50aXRpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LklOU1RBTkNFKTsKKyAgICAgICAgSU5TVEFOQ0UuZmlsdGVyZWQgPSBGaWx0ZXJlZENsYXNzRW50aXR5LklOU1RBTkNFOworICAgIH0KKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIGludCBmaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKworICAgIEBYbWxFbGVtZW50CisgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgTGlzdDxEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5PiBkZWZhdWx0RW50aXRpZXM7CisKKyAgICBAWG1sRWxlbWVudAorICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBMaXN0PE9uZUZpbHRlcmluZ1N1YkVudGl0eT4gb25lRW50aXRpZXM7CisKKyAgICBAWG1sRWxlbWVudAorICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgTGlzdDxNYW55RmlsdGVyaW5nc1N1YkVudGl0eT4gbWFueUVudGl0aWVzOworCisgICAgQFhtbEVsZW1lbnQKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZDsKKworICAgIEBYbWxUcmFuc2llbnQKKyAgICBASnNvbklnbm9yZQorICAgIHB1YmxpYyBTdHJpbmcgYWNjZXNzb3JUcmFuc2llbnQ7CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gYWNjZXNzb3JUcmFuc2llbnQgPT0gbnVsbCA/IHByb3BlcnR5ICsgcHJvcGVydHkgOiBhY2Nlc3NvclRyYW5zaWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihmaW5hbCBTdHJpbmcgYWNjZXNzb3IpIHsKKyAgICAgICAgYWNjZXNzb3JUcmFuc2llbnQgPSBhY2Nlc3NvcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL01hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL01hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyNmFiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlNlY29uZGFyeURldGFpbGVkVmlldzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworCisvKioKKyogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCitwdWJsaWMgY2xhc3MgTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYW55RmlsdGVyaW5nc1N1YkVudGl0eSBJTlNUQU5DRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIElOU1RBTkNFID0gbmV3IE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkMSA9IDYwOworICAgICAgICBJTlNUQU5DRS5maWVsZDIgPSA3MDsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkxID0gInByb3BlcnR5MSI7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5MiA9ICJwcm9wZXJ0eTIiOworICAgIH0KKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIGludCBmaWVsZDE7CisKKyAgICBAWG1sRWxlbWVudAorICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgaW50IGZpZWxkMjsKKworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHkxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShmaW5hbCBTdHJpbmcgcHJvcGVydHkxKSB7CisgICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOworICAgIH0KKworICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsKKyAgICB9CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihmaW5hbCBTdHJpbmcgcHJvcGVydHkyKSB7CisgICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTm9uRW1wdHlFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTm9uRW1wdHlFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYwMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9Ob25FbXB0eUVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTm9uRW1wdHlFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOb25FbXB0eUVudGl0eSBJTlNUQU5DRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIElOU1RBTkNFID0gbmV3IE5vbkVtcHR5RW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLnNldFZhbHVlKCJmb28iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBFbXB0eUVudGl0eSBnZXRFbXB0eUVudGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9PbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL09uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWJlOWZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9PbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uQXV0b0RldGVjdDsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSWdub3JlOworCisvKioKKyogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCisvLyBFbnRpdHkgRmlsdGVyaW5nLgorQFByaW1hcnlEZXRhaWxlZFZpZXcKK3B1YmxpYyBjbGFzcyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBJTlNUQU5DRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIElOU1RBTkNFID0gbmV3IE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgSU5TVEFOQ0UuZmllbGQgPSAxMDsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkgPSAicHJvcGVydHkiOworICAgICAgICBJTlNUQU5DRS5kZWZhdWx0RW50aXRpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuSU5TVEFOQ0UpOworICAgICAgICBJTlNUQU5DRS5zdWJFbnRpdGllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoT25lRmlsdGVyaW5nU3ViRW50aXR5LklOU1RBTkNFKTsKKyAgICAgICAgSU5TVEFOQ0UuZmlsdGVyZWQgPSBGaWx0ZXJlZENsYXNzRW50aXR5LklOU1RBTkNFOworICAgIH0KKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIGludCBmaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKworICAgIHByaXZhdGUgTGlzdDxEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5PiBkZWZhdWx0RW50aXRpZXM7CisgICAgcHJpdmF0ZSBMaXN0PE9uZUZpbHRlcmluZ1N1YkVudGl0eT4gc3ViRW50aXRpZXM7CisKKyAgICBwcml2YXRlIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQ7CisKKyAgICBAWG1sVHJhbnNpZW50CisgICAgQEpzb25JZ25vcmUKKyAgICBwdWJsaWMgU3RyaW5nIGFjY2Vzc29yVHJhbnNpZW50OworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8RGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eT4gZ2V0RGVmYXVsdEVudGl0aWVzKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdEVudGl0aWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRFbnRpdGllcyhmaW5hbCBMaXN0PERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk+IGRlZmF1bHRFbnRpdGllcykgeworICAgICAgICB0aGlzLmRlZmF1bHRFbnRpdGllcyA9IGRlZmF1bHRFbnRpdGllczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxPbmVGaWx0ZXJpbmdTdWJFbnRpdHk+IGdldFN1YkVudGl0aWVzKCkgeworICAgICAgICByZXR1cm4gc3ViRW50aXRpZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3ViRW50aXRpZXMoZmluYWwgTGlzdDxPbmVGaWx0ZXJpbmdTdWJFbnRpdHk+IHN1YkVudGl0aWVzKSB7CisgICAgICAgIHRoaXMuc3ViRW50aXRpZXMgPSBzdWJFbnRpdGllczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gYWNjZXNzb3JUcmFuc2llbnQgPT0gbnVsbCA/IHByb3BlcnR5ICsgcHJvcGVydHkgOiBhY2Nlc3NvclRyYW5zaWVudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NvcihmaW5hbCBTdHJpbmcgYWNjZXNzb3IpIHsKKyAgICAgICAgYWNjZXNzb3JUcmFuc2llbnQgPSBhY2Nlc3NvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsdGVyZWRDbGFzc0VudGl0eSBnZXRGaWx0ZXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlcmVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcmVkKGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQpIHsKKyAgICAgICAgdGhpcy5maWx0ZXJlZCA9IGZpbHRlcmVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL09uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzODA5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL09uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkF1dG9EZXRlY3Q7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbklnbm9yZTsKKworLyoqCisqIEBhdXRob3IgTWljaGFsIEdhamRvcworKi8KK0BKc29uQXV0b0RldGVjdChmaWVsZFZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSwgZ2V0dGVyVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZKQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKQorcHVibGljIGNsYXNzIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSBJTlNUQU5DRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIElOU1RBTkNFID0gbmV3IE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSgpOworICAgICAgICBJTlNUQU5DRS5maWVsZCA9IDgwOworICAgICAgICBJTlNUQU5DRS5wcm9wZXJ0eSA9ICJwcm9wZXJ0eSI7CisgICAgICAgIElOU1RBTkNFLmRlZmF1bHRFbnRpdGllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5JTlNUQU5DRSk7CisgICAgICAgIElOU1RBTkNFLnN1YkVudGl0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChPbmVGaWx0ZXJpbmdTdWJFbnRpdHkuSU5TVEFOQ0UpOworICAgICAgICBJTlNUQU5DRS5maWx0ZXJlZCA9IEZpbHRlcmVkQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgaW50IGZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OworCisgICAgcHJpdmF0ZSBMaXN0PERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk+IGRlZmF1bHRFbnRpdGllczsKKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBMaXN0PE9uZUZpbHRlcmluZ1N1YkVudGl0eT4gc3ViRW50aXRpZXM7CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHByaXZhdGUgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZDsKKworICAgIEBYbWxUcmFuc2llbnQKKyAgICBASnNvbklnbm9yZQorICAgIHB1YmxpYyBTdHJpbmcgYWNjZXNzb3JUcmFuc2llbnQ7CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHVibGljIExpc3Q8RGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eT4gZ2V0RGVmYXVsdEVudGl0aWVzKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdEVudGl0aWVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRFbnRpdGllcyhmaW5hbCBMaXN0PERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk+IGRlZmF1bHRFbnRpdGllcykgeworICAgICAgICB0aGlzLmRlZmF1bHRFbnRpdGllcyA9IGRlZmF1bHRFbnRpdGllczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxPbmVGaWx0ZXJpbmdTdWJFbnRpdHk+IGdldFN1YkVudGl0aWVzKCkgeworICAgICAgICByZXR1cm4gc3ViRW50aXRpZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3ViRW50aXRpZXMoZmluYWwgTGlzdDxPbmVGaWx0ZXJpbmdTdWJFbnRpdHk+IHN1YkVudGl0aWVzKSB7CisgICAgICAgIHRoaXMuc3ViRW50aXRpZXMgPSBzdWJFbnRpdGllczsKKyAgICB9CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NvclRyYW5zaWVudCA9PSBudWxsID8gcHJvcGVydHkgKyBwcm9wZXJ0eSA6IGFjY2Vzc29yVHJhbnNpZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKGZpbmFsIFN0cmluZyBhY2Nlc3NvcikgeworICAgICAgICBhY2Nlc3NvclRyYW5zaWVudCA9IGFjY2Vzc29yOworICAgIH0KKworICAgIHB1YmxpYyBGaWx0ZXJlZENsYXNzRW50aXR5IGdldEZpbHRlcmVkKCkgeworICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyZWQoZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCkgeworICAgICAgICB0aGlzLmZpbHRlcmVkID0gZmlsdGVyZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9PbmVGaWx0ZXJpbmdTdWJFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vT25lRmlsdGVyaW5nU3ViRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5Y2EwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vT25lRmlsdGVyaW5nU3ViRW50aXR5LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW47CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuUHJpbWFyeURldGFpbGVkVmlldzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworCisvKioKKyogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCitwdWJsaWMgY2xhc3MgT25lRmlsdGVyaW5nU3ViRW50aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT25lRmlsdGVyaW5nU3ViRW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgT25lRmlsdGVyaW5nU3ViRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkMSA9IDIwOworICAgICAgICBJTlNUQU5DRS5maWVsZDIgPSAzMDsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkxID0gInByb3BlcnR5MSI7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5MiA9ICJwcm9wZXJ0eTIiOworICAgIH0KKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIGludCBmaWVsZDE7CisKKyAgICBAWG1sRWxlbWVudAorICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHVibGljIGludCBmaWVsZDI7CisKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTE7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkyOworCisgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5MTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eTEoZmluYWwgU3RyaW5nIHByb3BlcnR5MSkgeworICAgICAgICB0aGlzLnByb3BlcnR5MSA9IHByb3BlcnR5MTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5MigpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5MjsKKyAgICB9CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MihmaW5hbCBTdHJpbmcgcHJvcGVydHkyKSB7CisgICAgICAgIHRoaXMucHJvcGVydHkyID0gcHJvcGVydHkyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbXB0eUVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbXB0eUVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmVlNDJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVtcHR5RW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkVtcHR5RW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5Ob25FbXB0eUVudGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSW5jbHVkZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5TZXJpYWxpemF0aW9uRmVhdHVyZTsKKworLyoqCisgKiBVc2UtY2FzZXMgdG8gY2hlY2sgd2hldGhlciBlbXB0eSBjbGFzcyBjYXVzZXMgcHJvYmxlbXMgKEpFUlNFWS0yODI0IHJlcHJvZHVjZXIpLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEpzb25FbXB0eUVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzW10+IHByb3ZpZGVycygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXSB7e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJub25FbXB0eUVudGl0eSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIE5vbkVtcHR5RW50aXR5IG5vbkVtcHR5RW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIE5vbkVtcHR5RW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImVtcHR5RW50aXR5IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgRW1wdHlFbnRpdHkgZW1wdHlFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5RW50aXR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSnNvbkVtcHR5RW50aXR5VGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQ29udGV4dFJlc29sdmVyPE9iamVjdE1hcHBlcj4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0TWFwcGVyIGdldENvbnRleHQoZmluYWwgQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RNYXBwZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJlKFNlcmlhbGl6YXRpb25GZWF0dXJlLkZBSUxfT05fRU1QVFlfQkVBTlMsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkluY2x1c2lvbihKc29uSW5jbHVkZS5JbmNsdWRlLk5PTl9OVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkVtcHR5RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE5vbkVtcHR5RW50aXR5IGVudGl0eSA9IHRhcmdldCgibm9uRW1wdHlFbnRpdHkiKS5yZXF1ZXN0KCkuZ2V0KE5vbkVtcHR5RW50aXR5LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRWYWx1ZSgpLCBpcygiZm9vIikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRFbXB0eUVudGl0eSgpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoImVtcHR5RW50aXR5IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygie30iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ0NsaWVudFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdDbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4MGMyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdDbGllbnRUZXN0LmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuanNvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLkRlZmF1bHRGaWx0ZXJpbmdTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlNlY29uZGFyeURldGFpbGVkVmlldzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uRmlsdGVyZWRDbGFzc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5NYW55RmlsdGVyaW5nc1N1YkVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uT25lRmlsdGVyaW5nU3ViRW50aXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEpzb25FbnRpdHlGaWx0ZXJpbmdDbGllbnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW10ge3tNb3h5SnNvbkZlYXR1cmUuY2xhc3N9LCB7SmFja3NvbkZlYXR1cmUuY2xhc3N9fSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgcHVibGljIENsYXNzPEZlYXR1cmU+IGZpbHRlcmluZ1Byb3ZpZGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAvLyBSZXNvdXJjZXMuCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykucmVnaXN0ZXIoZmlsdGVyaW5nUHJvdmlkZXIpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5QW5ub3RhdGlvbnNQcmltYXJ5VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGVudGl0eSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uW10ge1ByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3RQcmltYXJ5Vmlld0VudGl0eShlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUFubm90YXRpb25zRGVmYXVsdFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LklOU1RBTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbltdIHtuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIF90ZXN0RW1wdHlFbnRpdHkoZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlBbm5vdGF0aW9uc0ludmFsaWRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5JTlNUQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bXSB7Q3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuSU5TVEFOQ0V9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIF90ZXN0RW1wdHlFbnRpdHkoZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uUHJpbWFyeVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RQcmltYXJ5Vmlld0VudGl0eShyZXRyaWV2ZUVudGl0eShQcmltYXJ5RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uRGVmYXVsdFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RFbXB0eUVudGl0eShyZXRyaWV2ZUVudGl0eShuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uTXVsdGlwbGVWaWV3cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFByaW1hcnlWaWV3RW50aXR5KHJldHJpZXZlRW50aXR5KFByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKSwgQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuSU5TVEFOQ0UpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgcmV0cmlldmVFbnRpdHkoZmluYWwgQW5ub3RhdGlvbi4uLiBhbm5vdGF0aW9ucykgeworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuRU5USVRZX0ZJTFRFUklOR19TQ09QRSwgYW5ub3RhdGlvbnMubGVuZ3RoID09IDEgPyBhbm5vdGF0aW9uc1swXSA6IGFubm90YXRpb25zKTsKKyAgICAgICAgY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisKKyAgICAgICAgcmV0dXJuIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZykKKyAgICAgICAgICAgICAgICAudGFyZ2V0KGdldEJhc2VVcmkoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LklOU1RBTkNFLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCAiaW52YWxpZF92YWx1ZSIpOworICAgICAgICBjb25maWd1cmVDbGllbnQoY29uZmlnKTsKKworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGVudGl0eSA9CisgICAgICAgICAgICAgICAgQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlnKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRhcmdldChnZXRCYXNlVXJpKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LmNsYXNzKTsKKworICAgICAgICBfdGVzdEVtcHR5RW50aXR5KGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5QW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuRU5USVRZX0ZJTFRFUklOR19TQ09QRSwgU2Vjb25kYXJ5RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCkpOworICAgICAgICBjb25maWd1cmVDbGllbnQoY29uZmlnKTsKKworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZW50aXR5ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlnKQorICAgICAgICAgICAgICAgIC50YXJnZXQoZ2V0QmFzZVVyaSgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uW10ge1ByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDUwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5maWx0ZXJlZDsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSBkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5LmRlZmF1bHRFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgb25lRmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5Lm9uZUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDMwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc1N1YkVudGl0eSBtYW55RmlsdGVyaW5nc1N1YkVudGl0eSA9IGVudGl0eS5tYW55RW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMSwgaXMoNjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDIsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgaXMoInByb3BlcnR5MSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdEVtcHR5RW50aXR5KGZpbmFsIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIC8vIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5nZXRGaWx0ZXJlZCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZWZhdWx0RW50aXRpZXMoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRTdWJFbnRpdGllcygpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UHJpbWFyeVZpZXdFbnRpdHkoZmluYWwgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoMTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmdldEZpbHRlcmVkKCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5maWVsZCwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQsIGlzKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5KCksIGlzKDIwTCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRTdWJFbnRpdGllcygpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCkuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMSwgaXMoMjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQyLCBpcygzMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgaXMoInByb3BlcnR5MSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ09uQ2xhc3NUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW50aXR5RmlsdGVyaW5nT25DbGFzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMThlZWVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ09uQ2xhc3NUZXN0LmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuanNvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuRGVmYXVsdEZpbHRlcmluZ1Njb3BlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuU2Vjb25kYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5EZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5GaWx0ZXJlZENsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5NYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5PbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5PbmVGaWx0ZXJpbmdTdWJFbnRpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVXNlLWNhc2VzIHdpdGggZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyBvbiBjbGFzcywgSlNPTiBvdXRwdXQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSnNvbkVudGl0eUZpbHRlcmluZ09uQ2xhc3NUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW10ge3tNb3h5SnNvbkZlYXR1cmUuY2xhc3N9LCB7SmFja3NvbkZlYXR1cmUuY2xhc3N9fSk7CisgICAgfQorCisgICAgcHVibGljIEpzb25FbnRpdHlGaWx0ZXJpbmdPbkNsYXNzVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKSk7CisKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eSIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGdldE9uZUZpbHRlcmluZ0VudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXciKQorICAgICAgICBwdWJsaWMgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE9uZUZpbHRlcmluZ0VudGl0eShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3UmVzcG9uc2UiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0T25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LklOU1RBTkNFLCBuZXcgQW5ub3RhdGlvbltdIHtuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCl9KQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXciKQorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3IikKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3IikKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBnZXRNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5JTlNUQU5DRTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzIikKKyAgICAgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzKCkgeworICAgICAgICAgICAgcmV0dXJuIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5JTlNUQU5DRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk9uZUZpbHRlcmluZ0VudGl0eSIpLnJlcXVlc3QoKS5nZXQoT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoMTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmdldEZpbHRlcmVkKCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5maWVsZCwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQsIGlzKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5KCksIGlzKDIwTCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRTdWJFbnRpdGllcygpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCkuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMSwgaXMoMjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQyLCBpcygzMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgaXMoInByb3BlcnR5MSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25DbGFzc0RlZmF1bHRWaWV3UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3UmVzcG9uc2UiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5nZXRGaWx0ZXJlZCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZWZhdWx0RW50aXRpZXMoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRTdWJFbnRpdGllcygpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25DbGFzc0RlZmF1bHRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldyIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgbnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmdldEZpbHRlcmVkKCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVZpZXdzT25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25DbGFzcygpOworICAgICAgICB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25DbGFzc0RlZmF1bHRWaWV3KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoNTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZGVmYXVsdEVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygyMEwpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkub25lRW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDEsIGlzKDIwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMiwgaXMoMzApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBpcygicHJvcGVydHkyIikpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5IG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5ID0gZW50aXR5Lm1hbnlFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZmllbGQxLCBpcyg2MCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMiwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldyIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDUwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5maWx0ZXJlZDsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSBkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5LmRlZmF1bHRFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgb25lRmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5Lm9uZUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkgbWFueUZpbHRlcmluZ3NTdWJFbnRpdHkgPSBlbnRpdHkubWFueUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDEsIGlzKDYwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZmllbGQyLCBpcyg3MCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgbnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cyIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDUwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5maWx0ZXJlZDsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSBkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5LmRlZmF1bHRFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgb25lRmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5Lm9uZUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDMwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc1N1YkVudGl0eSBtYW55RmlsdGVyaW5nc1N1YkVudGl0eSA9IGVudGl0eS5tYW55RW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMSwgaXMoNjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDIsIGlzKDcwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxMDdiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXNUZXN0LmphdmEKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuanNvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuRGVmYXVsdEZpbHRlcmluZ1Njb3BlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuU2Vjb25kYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5EZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5GaWx0ZXJlZENsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5NYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTWFueUZpbHRlcmluZ3NTdWJFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uT25lRmlsdGVyaW5nU3ViRW50aXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFVzZS1jYXNlcyB3aXRoIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMgb24gcHJvcGVydGllcywgSlNPTiBvdXRwdXQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSnNvbkVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzW10+IHByb3ZpZGVycygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXSB7e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSnNvbkVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc1Rlc3QoZmluYWwgQ2xhc3M8RmVhdHVyZT4gZmlsdGVyaW5nUHJvdmlkZXIpIHsKKyAgICAgICAgc3VwZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcikpOworCisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJPbmVGaWx0ZXJpbmdFbnRpdHkiKQorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5IGdldE9uZUZpbHRlcmluZ0VudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldyIpCisgICAgICAgIHB1YmxpYyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkgZ2V0T25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE9uZUZpbHRlcmluZ0VudGl0eShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3UmVzcG9uc2UiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0T25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkuSU5TVEFOQ0UsIG5ldyBBbm5vdGF0aW9uW10ge25ldyBEZWZhdWx0RmlsdGVyaW5nU2NvcGUoKX0pCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldyIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSBnZXRNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3IikKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlEZWZhdWx0VmlldyIpCisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSBnZXRNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MiKQorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSBnZXRNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cygpIHsKKyAgICAgICAgICAgIHJldHVybiBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eS5JTlNUQU5DRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJPbmVGaWx0ZXJpbmdFbnRpdHkiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcyg4MCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgaXMoInByb3BlcnR5cHJvcGVydHkiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIGlzKCJwcm9wZXJ0eSIpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZ2V0RmlsdGVyZWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCkuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5nZXREZWZhdWx0RW50aXRpZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKS5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nU3ViRW50aXR5IG9uZUZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5nZXRTdWJFbnRpdGllcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDMwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXNEZWZhdWx0Vmlld1Jlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3UmVzcG9uc2UiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcyg4MCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgbnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmdldEZpbHRlcmVkKCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXNEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldyIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDgwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZ2V0RmlsdGVyZWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVmlld3NPblByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllcygpOworICAgICAgICB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzRGVmYXVsdFZpZXcoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldyIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcyg5MCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgaXMoInByb3BlcnR5cHJvcGVydHkiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIGlzKCJwcm9wZXJ0eSIpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZmlsdGVyZWQ7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5maWVsZCwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5kZWZhdWx0RW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQsIGlzKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5KCksIGlzKDIwTCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5vbmVFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5vbmVFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nU3ViRW50aXR5IG9uZUZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5vbmVFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMSwgaXMoMjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQyLCBpcygzMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgaXMoInByb3BlcnR5MSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDkwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5maWx0ZXJlZDsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgb25lRmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5Lm9uZUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkgbWFueUZpbHRlcmluZ3NTdWJFbnRpdHkgPSBlbnRpdHkubWFueUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDEsIGlzKDYwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZmllbGQyLCBpcyg3MCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXciKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoOTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDkwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5maWx0ZXJlZDsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSBkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5LmRlZmF1bHRFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgb25lRmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5Lm9uZUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDMwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc1N1YkVudGl0eSBtYW55RmlsdGVyaW5nc1N1YkVudGl0eSA9IGVudGl0eS5tYW55RW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMSwgaXMoNjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDIsIGlzKDcwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ1Njb3Blc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdTY29wZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiYTUxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdTY29wZXNUZXN0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5Db21wbGV4RW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5Db21wbGV4U3ViRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5Db21wbGV4U3ViU3ViRW50aXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEpzb25FbnRpdHlGaWx0ZXJpbmdTY29wZXNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW117e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSnNvbkVudGl0eUZpbHRlcmluZ1Njb3Blc1Rlc3QoZmluYWwgQ2xhc3M8RmVhdHVyZT4gZmlsdGVyaW5nUHJvdmlkZXIpIHsKKyAgICAgICAgc3VwZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcikpOworCisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBDb21wbGV4RW50aXR5IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBDb21wbGV4RW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbWFyeSAtPiBEZWZhdWx0IC0+IFByaW1hcnkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5RmlsdGVyaW5nU2NvcGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbXBsZXhFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChDb21wbGV4RW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBDb21wbGV4RW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIENvbXBsZXhTdWJFbnRpdHkKKyAgICAgICAgZmluYWwgQ29tcGxleFN1YkVudGl0eSBzdWJFbnRpdHkgPSBlbnRpdHkuZmllbGQ7CisgICAgICAgIGFzc2VydFRoYXQoc3ViRW50aXR5LCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoc3ViRW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygiZmllbGRmaWVsZCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJFbnRpdHkuZmllbGQsIGlzKCJmaWVsZCIpKTsKKworICAgICAgICAvLyBDb21wbGV4U3ViU3ViRW50aXR5CisgICAgICAgIGZpbmFsIENvbXBsZXhTdWJTdWJFbnRpdHkgc3ViU3ViRW50aXR5ID0gZW50aXR5LmZpZWxkLmdldFByb3BlcnR5KCk7CisgICAgICAgIGFzc2VydFRoYXQoc3ViU3ViRW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygiZmllbGRmaWVsZCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KHN1YlN1YkVudGl0eS5maWVsZCwgbnVsbFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdTZXJ2ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTdiN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmpzb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5EZWZhdWx0RmlsdGVyaW5nU2NvcGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuUHJpbWFyeURldGFpbGVkVmlldzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5TZWNvbmRhcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkZpbHRlcmVkQ2xhc3NFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTWFueUZpbHRlcmluZ3NTdWJFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk9uZUZpbHRlcmluZ1N1YkVudGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5udWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoU3VpdGUuY2xhc3MpCitAU3VpdGUuU3VpdGVDbGFzc2VzKHsKKyAgICAgICAgSnNvbkVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuQ29uZmlndXJhdGlvblNlcnZlclRlc3QuY2xhc3MsCisgICAgICAgIEpzb25FbnRpdHlGaWx0ZXJpbmdTZXJ2ZXJUZXN0LkNvbmZpZ3VyYXRpb25EZWZhdWx0Vmlld1NlcnZlclRlc3QuY2xhc3MsCisgICAgICAgIEpzb25FbnRpdHlGaWx0ZXJpbmdTZXJ2ZXJUZXN0LkFubm90YXRpb25zU2VydmVyVGVzdC5jbGFzcywKKyAgICAgICAgSnNvbkVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuQW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvblNlcnZlclRlc3QuY2xhc3MKK30pCitwdWJsaWMgY2xhc3MgSnNvbkVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY29uZmlndXJhdGlvbiIpCisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjb25maWd1cmF0aW9uT3ZlclJlc291cmNlIikKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldENvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYW5ub3RhdGlvbnMiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLm9rKCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsIG5ldyBBbm5vdGF0aW9uW10ge1ByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRBbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5vaygpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LklOU1RBTkNFLCBuZXcgQW5ub3RhdGlvbltdIHtQcmltYXJ5RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9KQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFubm90YXRpb25zT3ZlclJlc291cmNlIikKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QW5ub3RhdGlvbnNPdmVyUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLm9rKCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsIG5ldyBBbm5vdGF0aW9uW10ge1ByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSIpCisgICAgICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLm9rKCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsIG5ldyBBbm5vdGF0aW9uW10ge1ByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ3VyYXRpb25TZXJ2ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIlByb3ZpZGVyOiB7MH0iKQorICAgICAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzW10+IHByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW10ge3tNb3h5SnNvbkZlYXR1cmUuY2xhc3N9LCB7SmFja3NvbkZlYXR1cmUuY2xhc3N9fSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvblNlcnZlclRlc3QoZmluYWwgQ2xhc3M8RmVhdHVyZT4gZmlsdGVyaW5nUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCBQcmltYXJ5RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCkpKTsKKworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgX3Rlc3RFbnRpdHkodGFyZ2V0KCJjb25maWd1cmF0aW9uIikucmVxdWVzdCgpLmdldChNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uT3ZlclJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfdGVzdEVudGl0eSh0YXJnZXQoImNvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ3VyYXRpb25EZWZhdWx0Vmlld1NlcnZlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Q2xhc3NbXT4gcHJvdmlkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXSB7e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uRGVmYXVsdFZpZXdTZXJ2ZXJUZXN0KGZpbmFsIENsYXNzPEZlYXR1cmU+IGZpbHRlcmluZ1Byb3ZpZGVyKSB7CisgICAgICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKSk7CisKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoImNvbmZpZ3VyYXRpb24iKS5yZXF1ZXN0KCkuZ2V0KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eQorICAgICAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDApKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBudWxsVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZmlsdGVyZWQ7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcywgbnVsbFZhbHVlKCkpOworCisgICAgICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5CisgICAgICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc1NlcnZlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Q2xhc3NbXT4gcHJvdmlkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXSB7e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBbm5vdGF0aW9uc1NlcnZlclRlc3QoZmluYWwgQ2xhc3M8RmVhdHVyZT4gZmlsdGVyaW5nUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykucmVnaXN0ZXIoZmlsdGVyaW5nUHJvdmlkZXIpKTsKKworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF90ZXN0RW50aXR5KHRhcmdldCgiYW5ub3RhdGlvbnMiKS5yZXF1ZXN0KCkuZ2V0KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25zT3ZlclJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfdGVzdEVudGl0eSh0YXJnZXQoImFubm90YXRpb25zT3ZlclJlc291cmNlIikucmVxdWVzdCgpLmdldChNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uU2VydmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQ2xhc3NbXVtdIHt7TW94eUpzb25GZWF0dXJlLmNsYXNzfSwge0phY2tzb25GZWF0dXJlLmNsYXNzfX0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb25TZXJ2ZXJUZXN0KGZpbmFsIENsYXNzPEZlYXR1cmU+IGZpbHRlcmluZ1Byb3ZpZGVyKSB7CisgICAgICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcikKKyAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuRU5USVRZX0ZJTFRFUklOR19TQ09QRSwgbmV3IERlZmF1bHRGaWx0ZXJpbmdTY29wZSgpKSk7CisKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF90ZXN0RW50aXR5KHRhcmdldCgiYW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbiIpLnJlcXVlc3QoKS5nZXQoTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgX3Rlc3RFbnRpdHkodGFyZ2V0KCJhbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uT3ZlclJlc291cmNlIikucmVxdWVzdCgpLmdldChNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgX3Rlc3RFbnRpdHkoZmluYWwgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGVudGl0eSkgeworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDUwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5maWx0ZXJlZDsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSBkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5LmRlZmF1bHRFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgb25lRmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5Lm9uZUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDMwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc1N1YkVudGl0eSBtYW55RmlsdGVyaW5nc1N1YkVudGl0eSA9IGVudGl0eS5tYW55RW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMSwgaXMoNjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDIsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgaXMoInByb3BlcnR5MSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL01veHlFbnRpdHlGaWx0ZXJpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Nb3h5RW50aXR5RmlsdGVyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZmFiZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Nb3h5RW50aXR5RmlsdGVyaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmpzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTW94eUVudGl0eUZpbHRlcmluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFhtbEVsZW1lbnRFbnRpdHkgZ2V0WG1sQXR0cmlidXRlRW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBYbWxFbGVtZW50RW50aXR5KG5ldyBYbWxBdHRyaWJ1dGVFbnRpdHkoImZvbyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWG1sRWxlbWVudEVudGl0eSB7CisKKyAgICAgICAgQFhtbEVsZW1lbnQKKyAgICAgICAgcHJpdmF0ZSBYbWxBdHRyaWJ1dGVFbnRpdHkgdmFsdWU7CisKKyAgICAgICAgcHVibGljIFhtbEVsZW1lbnRFbnRpdHkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFhtbEVsZW1lbnRFbnRpdHkoZmluYWwgWG1sQXR0cmlidXRlRW50aXR5IHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWG1sQXR0cmlidXRlRW50aXR5IGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgWG1sQXR0cmlidXRlRW50aXR5IHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAWG1sUm9vdEVsZW1lbnQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFhtbEF0dHJpYnV0ZUVudGl0eSB7CisKKyAgICAgICAgQFhtbEF0dHJpYnV0ZQorICAgICAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGU7CisKKyAgICAgICAgcHVibGljIFhtbEF0dHJpYnV0ZUVudGl0eSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYbWxBdHRyaWJ1dGVFbnRpdHkoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLy8gRmVhdHVyZXMuCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFhtbEF0dHJpYnV0ZUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBYbWxFbGVtZW50RW50aXR5IGVudGl0eSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoWG1sRWxlbWVudEVudGl0eS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0VmFsdWUoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRWYWx1ZSgpLmdldEF0dHJpYnV0ZSgpLCBlcXVhbFRvKCJmb28iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0Fic3RyYWN0SnNvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9BYnN0cmFjdEpzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjNWFmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9BYnN0cmFjdEpzb25UZXN0LmphdmEKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uSmF4YkNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBDb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgSlNPTiB0ZXN0cyB0aGF0IGFyZSB1c2luZyBtdWx0aXBsZSBKU09OIHByb3ZpZGVycyAoZS5nLiBNT1h5LCBKYWNrc29uLCBKZXR0aXNvbikuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpzb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUUgPSAib3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5LyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RKc29uVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogSGVscGVyIGNsYXNzIHJlcHJlc2VudGluZyBjb25maWd1cmF0aW9uIGZvciBvbmUgdGVzdCBjYXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgSnNvblRlc3RTZXR1cCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PltdIHRlc3RDbGFzc2VzOworCisgICAgICAgIHByb3RlY3RlZCBKc29uVGVzdFNldHVwKGZpbmFsIENsYXNzPD8+IHRlc3RDbGFzcywgZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHRoaXMobmV3IENsYXNzPD8+W10ge3Rlc3RDbGFzc30sIGpzb25Qcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgSnNvblRlc3RTZXR1cChmaW5hbCBDbGFzczw/PltdIHRlc3RDbGFzc2VzLCBmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlcikgeworICAgICAgICAgICAgdGhpcy50ZXN0Q2xhc3NlcyA9IHRlc3RDbGFzc2VzOworICAgICAgICAgICAgdGhpcy5qc29uUHJvdmlkZXIgPSBqc29uUHJvdmlkZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSnNvblRlc3RQcm92aWRlciBnZXRKc29uUHJvdmlkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4ganNvblByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNldDxPYmplY3Q+IGdldFByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uUHJvdmlkZXIuZ2V0UHJvdmlkZXJzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RW50aXR5Q2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gdGVzdENsYXNzZXNbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRUZXN0Q2xhc3NlcygpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXN0Q2xhc3NlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGdldEVudGl0eUNsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoImNyZWF0ZVRlc3RJbnN0YW5jZSIpLmludm9rZShudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEpBWEJDb250ZXh0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEpBWEJDb250ZXh0IGNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PENsYXNzPD8+PiB0eXBlczsKKworICAgICAgICBwdWJsaWMgSkFYQkNvbnRleHRSZXNvbHZlcihmaW5hbCBKZXR0aXNvbkNvbmZpZyBqc29uQ29uZmlndXJhdGlvbiwgZmluYWwgQ2xhc3M8Pz5bXSBjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZvck1veHlQcm92aWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLnR5cGVzID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KGNsYXNzZXMpKTsKKworICAgICAgICAgICAgaWYgKGpzb25Db25maWd1cmF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgSmV0dGlzb25KYXhiQ29udGV4dChqc29uQ29uZmlndXJhdGlvbiwgY2xhc3Nlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGZvck1veHlQcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBKQVhCQ29udGV4dEZhY3RvcnkuY3JlYXRlQ29udGV4dChjbGFzc2VzLCBuZXcgSGFzaE1hcCgpKSA6IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKGNsYXNzZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRDb250ZXh0KGZpbmFsIENsYXNzPD8+IG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAodHlwZXMuY29udGFpbnMob2JqZWN0VHlwZSkpID8gY29udGV4dCA6IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBKQVgtUlMge0BsaW5rIEFwcGxpY2F0aW9ufSBmb3IgZ2l2ZW4ge0BsaW5rIEpzb25UZXN0U2V0dXB9LiBUaGUge0BsaW5rIEFwcGxpY2F0aW9ufSB3aWxsCisgICAgICogY29udGFpbiBvbmUgcmVzb3VyY2UgdGhhdCBjYW4gYmUgYWNjZXNzZWQgdmlhIHtAY29kZSBQT1NUfSBtZXRob2QgYXQge0Bjb2RlIDxqc29uUHJvdmlkZXJOYW1lPi88ZW50aXR5Q2xhc3NOYW1lPn0gcGF0aC4KKyAgICAgKiBUaGUgcmVzb3VyY2UgYWxzbyBjaGVja3Mgd2hldGhlciBpcyB0aGUgaW5jb21pbmcgSlNPTiBzYW1lIGFzIHRoZSBvbmUgc3RvcmVkIGluIGEgYXBwcm9wcmlhdGUgZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqc29uVGVzdFNldHVwIGNvbmZpZ3VyYXRpb24gdG8gY3JlYXRlIGEgSkFYLVJTIHtAbGluayBBcHBsaWNhdGlvbn0gZm9yLgorICAgICAqIEByZXR1cm4gYW4ge0BsaW5rIEFwcGxpY2F0aW9ufSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbiBjb25maWd1cmVKYXhyc0FwcGxpY2F0aW9uKGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXJOYW1lID0gZ2V0UHJvdmlkZXJQYXRoUGFydChqc29uVGVzdFNldHVwKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlc3ROYW1lID0gZ2V0RW50aXR5UGF0aFBhcnQoanNvblRlc3RTZXR1cCk7CisKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyCisgICAgICAgICAgICAgICAgLnBhdGgoIi8iICsgcHJvdmlkZXJOYW1lICsgIi8iICsgdGVzdE5hbWUpCisgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiUE9TVCIpCisgICAgICAgICAgICAgICAgLmNvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgLnByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250YWluZXJSZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0ID0gKENvbnRhaW5lclJlcXVlc3QpIGNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgSlNPTiBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcHJldmlvdXMgdmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclJlcXVlc3QuYnVmZmVyRW50aXR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBqc29uID0gSnNvblRlc3RIZWxwZXIuZ2V0UmVzb3VyY2VBc1N0cmluZyhQS0dfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTmFtZSArICJfIiArIHRlc3ROYW1lICsgKG1veHlKYXhiUHJvdmlkZXIoKSB8fCBydW5uaW5nT25KZGs3QW5kTGF0ZXIoKSA/ICJfTU9YeSIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmpzb24iKS50cmltKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBjb250YWluZXJSZXF1ZXN0LmdldEVudGl0eVN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXRyaWV2ZWRKc29uID0gSnNvblRlc3RIZWxwZXIuZ2V0RW50aXR5QXNTdHJpbmcoZW50aXR5U3RyZWFtKS50cmltKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLnJlc2V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQVhCLVJJIGFuZCBNT1h5IGdlbmVyYXRlIG5hbWVzcGFjZSBwcmVmaXhlcyBkaWZmZXJlbnRseSAtIHVuaWZ5IHRoZW0gKG5zMS9uczIgaW50byBuczApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25UZXN0U2V0dXAuZ2V0SnNvblByb3ZpZGVyKCkgaW5zdGFuY2VvZiBKc29uVGVzdFByb3ZpZGVyLkpldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJpZXZlZEpzb24uY29udGFpbnMoIlwibnMxXCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IGpzb24ucmVwbGFjZSgibnMxIiwgIm5zMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVkSnNvbiA9IHJldHJpZXZlZEpzb24ucmVwbGFjZSgibnMxIiwgIm5zMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHJpZXZlZEpzb24uY29udGFpbnMoIlwibnMyXCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IGpzb24ucmVwbGFjZSgibnMyIiwgIm5zMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVkSnNvbiA9IHJldHJpZXZlZEpzb24ucmVwbGFjZSgibnMyIiwgIm5zMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFqc29uLmVxdWFscyhyZXRyaWV2ZWRKc29uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIkV4cGVjdGVkOiAiICsganNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiQWN0dWFsOiAgICIgKyByZXRyaWV2ZWRKc29uKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIntcImVycm9yXCI6XCJKU09OIHZhbHVlcyBkb2Vzbid0IG1hdGNoLlwifSIpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygie1wiZXJyb3JcIjpcIkNhbm5vdCBmaW5kIG9yaWdpbmFsIEpTT04gZmlsZS5cIn0iKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdGVzdEJlYW4gPSBjb250YWluZXJSZXF1ZXN0LnJlYWRFbnRpdHkoanNvblRlc3RTZXR1cC5nZXRFbnRpdHlDbGFzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayh0ZXN0QmVhbikuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoanNvblRlc3RTZXR1cC5nZXRKc29uUHJvdmlkZXIoKS5nZXRGZWF0dXJlKCkpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVySW5zdGFuY2VzKGdldEpheGJDb250ZXh0UmVzb2x2ZXIoanNvblRlc3RTZXR1cCkpOworCisgICAgICAgIGlmIChqc29uVGVzdFNldHVwLmdldFByb3ZpZGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVySW5zdGFuY2VzKGpzb25UZXN0U2V0dXAuZ2V0UHJvdmlkZXJzKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEpBWEJDb250ZXh0UmVzb2x2ZXIgZ2V0SmF4YkNvbnRleHRSZXNvbHZlcihmaW5hbCBKc29uVGVzdFNldHVwIGpzb25UZXN0U2V0dXApIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVKYXhiQ29udGV4dFJlc29sdmVyKGpzb25UZXN0U2V0dXAuZ2V0SnNvblByb3ZpZGVyKCksIGpzb25UZXN0U2V0dXAuZ2V0VGVzdENsYXNzZXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcnVubmluZ09uSmRrN0FuZExhdGVyKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgamF2YVZlcnNpb24gPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KCJqYXZhLnZlcnNpb24iKSk7CisgICAgICAgIGZpbmFsIGludCB2ZXJzaW9uID0gSW50ZWdlci52YWx1ZU9mKGphdmFWZXJzaW9uLnNwbGl0KCJcXC4iKVsxXSk7CisKKyAgICAgICAgcmV0dXJuIHZlcnNpb24gPj0gNzsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1veHlKYXhiUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dEZhY3RvcnkiLmVxdWFscygKKyAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KCJqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dCIpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBlbnRpdHkgcGF0aCBwYXJ0IGZvciBnaXZlbiB7QGxpbmsgSnNvblRlc3RTZXR1cH0gKGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkpLgorICAgICAqCisgICAgICogQHJldHVybiBlbnRpdHkgcGF0aCBwYXJ0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEVudGl0eVBhdGhQYXJ0KGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cCkgeworICAgICAgICByZXR1cm4ganNvblRlc3RTZXR1cC5nZXRFbnRpdHlDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyB7QGxpbmsgQ29udGV4dFJlc29sdmVyfSBvZiB7QGxpbmsgSkFYQkNvbnRleHR9IGluc3RhbmNlIGZvciBnaXZlbiB7QGxpbmsgSnNvblRlc3RQcm92aWRlcn0gYW5kIGFuIGVudGl0eQorICAgICAqIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGpzb25Qcm92aWRlciBwcm92aWRlciB0byBjcmVhdGUgYSBjb250ZXh0IHJlc29sdmVyIGZvci4KKyAgICAgKiBAcGFyYW0gY2xhenogICAgICAgIEpBWEIgZWxlbWVudCBjbGFzcyBmb3IgSkFYQiBjb250ZXh0LgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgSkFYQiBjb250ZXh0IHJlc29sdmVyLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBjcmVhdGlvbiBvZiB7QGNvZGUgSkFYQkNvbnRleHRSZXNvbHZlcn0gZmFpbHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBKQVhCQ29udGV4dFJlc29sdmVyIGNyZWF0ZUpheGJDb250ZXh0UmVzb2x2ZXIoZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenopIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlSmF4YkNvbnRleHRSZXNvbHZlcihqc29uUHJvdmlkZXIsIG5ldyBDbGFzczw/PltdIHtjbGF6en0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IHtAbGluayBDb250ZXh0UmVzb2x2ZXJ9IG9mIHtAbGluayBKQVhCQ29udGV4dH0gaW5zdGFuY2UgZm9yIGdpdmVuIHtAbGluayBKc29uVGVzdFByb3ZpZGVyfSBhbmQgYW4gZW50aXR5CisgICAgICogY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqc29uUHJvdmlkZXIgcHJvdmlkZXIgdG8gY3JlYXRlIGEgY29udGV4dCByZXNvbHZlciBmb3IuCisgICAgICogQHBhcmFtIGNsYXNzZXMgICAgICBKQVhCIGVsZW1lbnQgY2xhc3NlcyBmb3IgSkFYQiBjb250ZXh0LgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgSkFYQiBjb250ZXh0IHJlc29sdmVyLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBjcmVhdGlvbiBvZiB7QGNvZGUgSkFYQkNvbnRleHRSZXNvbHZlcn0gZmFpbHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBKQVhCQ29udGV4dFJlc29sdmVyIGNyZWF0ZUpheGJDb250ZXh0UmVzb2x2ZXIoZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uUHJvdmlkZXIsIGZpbmFsIENsYXNzPD8+W10gY2xhc3NlcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEpBWEJDb250ZXh0UmVzb2x2ZXIoanNvblByb3ZpZGVyLmdldENvbmZpZ3VyYXRpb24oKSwgY2xhc3NlcywKKyAgICAgICAgICAgICAgICBqc29uUHJvdmlkZXIgaW5zdGFuY2VvZiBKc29uVGVzdFByb3ZpZGVyLk1veHlKc29uVGVzdFByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RKc29uVGVzdChmaW5hbCBKc29uVGVzdFNldHVwIGpzb25UZXN0U2V0dXApIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcihjb25maWd1cmVKYXhyc0FwcGxpY2F0aW9uKGpzb25UZXN0U2V0dXApKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICB0aGlzLmpzb25UZXN0U2V0dXAgPSBqc29uVGVzdFNldHVwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgZW50aXR5IHBhdGggcGFydCBmb3IgY3VycmVudCB0ZXN0IGNhc2UgKGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkpLgorICAgICAqCisgICAgICogQHJldHVybiBlbnRpdHkgcGF0aCBwYXJ0LgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RW50aXR5UGF0aFBhcnQoKSB7CisgICAgICAgIHJldHVybiBnZXRFbnRpdHlQYXRoUGFydChqc29uVGVzdFNldHVwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHByb3ZpZGVyIHBhdGggcGFydCBmb3IgY3VycmVudCB0ZXN0IGNhc2UgKGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgSnNvblRlc3RQcm92aWRlcn0pLgorICAgICAqCisgICAgICogQHJldHVybiBwcm92aWRlciBwYXRoIHBhcnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm92aWRlclBhdGhQYXJ0KCkgeworICAgICAgICByZXR1cm4gZ2V0UHJvdmlkZXJQYXRoUGFydChqc29uVGVzdFNldHVwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHByb3ZpZGVyIHBhdGggcGFydCBmb3IgZ2l2ZW4ge0BsaW5rIEpzb25UZXN0U2V0dXB9IChiYXNlZCBvbiB0aGUgbmFtZSBvZiB0aGUge0BsaW5rIEpzb25UZXN0UHJvdmlkZXJ9KS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJvdmlkZXIgcGF0aCBwYXJ0LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFByb3ZpZGVyUGF0aFBhcnQoZmluYWwgSnNvblRlc3RTZXR1cCBqc29uVGVzdFNldHVwKSB7CisgICAgICAgIHJldHVybiBqc29uVGVzdFNldHVwLmpzb25Qcm92aWRlci5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSnNvblRlc3RTZXR1cCBnZXRKc29uVGVzdFNldHVwKCkgeworICAgICAgICByZXR1cm4ganNvblRlc3RTZXR1cDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoZ2V0SnNvblRlc3RTZXR1cCgpLmdldEpzb25Qcm92aWRlcigpLmdldEZlYXR1cmUoKSk7CisKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGdldEpheGJDb250ZXh0UmVzb2x2ZXIoanNvblRlc3RTZXR1cCkpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIGFkZGl0aW9uYWwgcHJvdmlkZXJzLgorICAgICAgICBpZiAoZ2V0SnNvblRlc3RTZXR1cCgpLmdldFByb3ZpZGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHByb3ZpZGVyIDogZ2V0SnNvblRlc3RTZXR1cCgpLmdldFByb3ZpZGVycygpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPYmplY3QgZW50aXR5ID0gZ2V0SnNvblRlc3RTZXR1cCgpLmdldFRlc3RFbnRpdHkoKTsKKworICAgICAgICBmaW5hbCBPYmplY3QgcmVjZWl2ZWRFbnRpdHkgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5wYXRoKGdldFByb3ZpZGVyUGF0aFBhcnQoKSkKKyAgICAgICAgICAgICAgICAucGF0aChnZXRFbnRpdHlQYXRoUGFydCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PVVURi04IikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KGVudGl0eSwgImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiKSwgZ2V0SnNvblRlc3RTZXR1cCgpLmdldEVudGl0eUNsYXNzKCkpOworCisgICAgICAgIC8vIFByaW50IG91dCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRlc3QgY2FzZSBhcyB0aGVyZSBpcyBubyB3YXkgdG8gcmVuYW1lIGdlbmVyYXRlZCBKVW5pdCB0ZXN0cyBhdCB0aGUgbW9tZW50LgorICAgICAgICAvLyBUT0RPIHJlbW92ZSBvbmNlIEpVbml0IHN1cHBvcnRzIHBhcmFtZXRlcml6ZWQgdGVzdHMgd2l0aCBjdXN0b20gbmFtZXMKKyAgICAgICAgLy8gVE9ETyAoc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjUwODk0L2NoYW5nZS10ZXN0LW5hbWUtb2YtcGFyYW1ldGVyaXplZC10ZXN0cworICAgICAgICAvLyBUT0RPIG9yIGh0dHBzOi8vZ2l0aHViLmNvbS9LZW50QmVjay9qdW5pdC9wdWxsLzM5MykKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIiVzIC0gJXM6IFJlY2VpdmVkIEpTT04gZW50aXR5IGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgSlNPTiBlbnRpdHkgY29udGVudC4iLAorICAgICAgICAgICAgICAgIGdldEpzb25UZXN0U2V0dXAoKS5nZXRKc29uUHJvdmlkZXIoKS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICBnZXRKc29uVGVzdFNldHVwKCkuZ2V0RW50aXR5Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLCBlbnRpdHksIHJlY2VpdmVkRW50aXR5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vR2VuZXJpY1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9HZW5lcmljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2Y1YjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vR2VuZXJpY1Rlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQ29sb3JIb2xkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkplcnNleTExOTlMaXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBVbmlnbm9yZSB3aGVuIHlvdSBuZWVkIHRvIHJ1biBhIHNwZWNpZmljIHRlc3QuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BJZ25vcmUoIlVuaWdub3JlIG9ubHkgd2hlbiB5b3UgbmVlZCB0byBydW4gYSBzcGVjaWZpYyB0ZXN0LiIpCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEdlbmVyaWNUZXN0IGV4dGVuZHMgQWJzdHJhY3RKc29uVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKCkKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SnNvblRlc3RTZXR1cFtdPiBnZW5lcmF0ZVRlc3RDYXNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMaXN0PEpzb25UZXN0U2V0dXBbXT4ganNvblRlc3RTZXR1cHMgPSBuZXcgTGlua2VkTGlzdDxKc29uVGVzdFNldHVwW10+KCk7CisgICAgICAgIGZpbmFsIENsYXNzPD8+W10gY2xhc3NlcyA9IHtKZXJzZXkxMTk5TGlzdC5jbGFzcywgQ29sb3JIb2xkZXIuY2xhc3N9OworCisgICAgICAgIGZvciAoSnNvblRlc3RQcm92aWRlciBqc29uUHJvdmlkZXIgOiBuZXcgSnNvblRlc3RQcm92aWRlcltde25ldyBKc29uVGVzdFByb3ZpZGVyLk1veHlKc29uVGVzdFByb3ZpZGVyKCl9KSB7CisgICAgICAgICAgICBqc29uVGVzdFNldHVwcy5hZGQobmV3IEpzb25UZXN0U2V0dXBbXXtuZXcgSnNvblRlc3RTZXR1cChjbGFzc2VzLCBqc29uUHJvdmlkZXIpfSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ganNvblRlc3RTZXR1cHM7CisgICAgfQorCisgICAgcHVibGljIEdlbmVyaWNUZXN0KGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGpzb25UZXN0U2V0dXApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0luaGVyaXRhbmNlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0luaGVyaXRhbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MWQxNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSW5oZXJpdGFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkFuaW1hbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQW5pbWFsTGlzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQ2F0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Eb2c7CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBJbmhlcml0YW5jZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25UZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMoKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxKc29uVGVzdFNldHVwW10+IGdlbmVyYXRlVGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8SnNvblRlc3RTZXR1cFtdPiBqc29uVGVzdFNldHVwcyA9IG5ldyBMaW5rZWRMaXN0PEpzb25UZXN0U2V0dXBbXT4oKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz5bXSBjbGFzc2VzID0ge0FuaW1hbExpc3QuY2xhc3MsIEFuaW1hbC5jbGFzcywgRG9nLmNsYXNzLCBDYXQuY2xhc3N9OworCisgICAgICAgIGZvciAoZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uUHJvdmlkZXIgOiBKc29uVGVzdFByb3ZpZGVyLkpBWEJfUFJPVklERVJTKSB7CisgICAgICAgICAgICAvLyBUT0RPIC0gcmVtb3ZlIHRoZSBjb25kaXRpb24gYWZ0ZXIganNvbmIgcG9seW1vcnBoaWMgYWRhcHRlciBpcyBpbXBsZW1lbnRlZAorICAgICAgICAgICAgaWYgKCEoanNvblByb3ZpZGVyIGluc3RhbmNlb2YgSnNvblRlc3RQcm92aWRlci5Kc29uYlRlc3RQcm92aWRlcikpIHsKKyAgICAgICAgICAgICAgICBqc29uVGVzdFNldHVwcy5hZGQobmV3IEpzb25UZXN0U2V0dXBbXXtuZXcgSnNvblRlc3RTZXR1cChjbGFzc2VzLCBqc29uUHJvdmlkZXIpfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ganNvblRlc3RTZXR1cHM7CisgICAgfQorCisgICAgcHVibGljIEluaGVyaXRhbmNlVGVzdChmaW5hbCBKc29uVGVzdFNldHVwIGpzb25UZXN0U2V0dXApIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcihqc29uVGVzdFNldHVwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KYWNrc29uMUpzb25WaWV3VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0phY2tzb24xSnNvblZpZXdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxZGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KYWNrc29uMUpzb25WaWV3VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uMS5KYWNrc29uMUZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5hbm5vdGF0ZS5Kc29uVmlldzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMTg3OC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEphY2tzb24xSnNvblZpZXdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MsIEphY2tzb24xRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEphY2tzb24xRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVWaWV3IHt9CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXRhaWxlZFZpZXcge30KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEVudGl0eSB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0RW50aXR5IEVOVElUWSA9IG5ldyBUZXN0RW50aXR5KCJzaW1wbGUiLCAiZGV0YWlsZWQiKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0RW50aXR5IERFVEFJTEVEID0gbmV3IFRlc3RFbnRpdHkobnVsbCwgImRldGFpbGVkIik7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2ltcGxlOworICAgICAgICBwcml2YXRlIFN0cmluZyBkZXRhaWxlZDsKKworICAgICAgICBwdWJsaWMgVGVzdEVudGl0eSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0RW50aXR5KGZpbmFsIFN0cmluZyBzaW1wbGUsIGZpbmFsIFN0cmluZyBkZXRhaWxlZCkgeworICAgICAgICAgICAgdGhpcy5zaW1wbGUgPSBzaW1wbGU7CisgICAgICAgICAgICB0aGlzLmRldGFpbGVkID0gZGV0YWlsZWQ7CisgICAgICAgIH0KKworICAgICAgICBASnNvblZpZXcoU2ltcGxlVmlldy5jbGFzcykKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gc2ltcGxlOworICAgICAgICB9CisKKyAgICAgICAgQEpzb25WaWV3KERldGFpbGVkVmlldy5jbGFzcykKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXRhaWxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXRhaWxlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFRlc3RFbnRpdHkgdGhhdCA9IChUZXN0RW50aXR5KSBvOworCisgICAgICAgICAgICBpZiAoZGV0YWlsZWQgIT0gbnVsbCA/ICFkZXRhaWxlZC5lcXVhbHModGhhdC5kZXRhaWxlZCkgOiB0aGF0LmRldGFpbGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2ltcGxlICE9IG51bGwgPyAhc2ltcGxlLmVxdWFscyh0aGF0LnNpbXBsZSkgOiB0aGF0LnNpbXBsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IHNpbXBsZSAhPSBudWxsID8gc2ltcGxlLmhhc2hDb2RlKCkgOiAwOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoZGV0YWlsZWQgIT0gbnVsbCA/IGRldGFpbGVkLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgIEBQYXRoKCJhc3luYyIpCisgICAgICAgIEBKc29uVmlldyhEZXRhaWxlZFZpZXcuY2xhc3MpCisgICAgICAgIHB1YmxpYyB2b2lkIGdldEFzeW5jKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVzdW1lKFRlc3RFbnRpdHkuRU5USVRZKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICBAUGF0aCgic3luYyIpCisgICAgICAgIEBKc29uVmlldyhEZXRhaWxlZFZpZXcuY2xhc3MpCisgICAgICAgIHB1YmxpYyBUZXN0RW50aXR5IGdldFN5bmMoKSB7CisgICAgICAgICAgICByZXR1cm4gVGVzdEVudGl0eS5FTlRJVFk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic3luYyIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFRlc3RFbnRpdHkuY2xhc3MpLCBpcyhUZXN0RW50aXR5LkRFVEFJTEVEKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhc3luYyIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoVGVzdEVudGl0eS5jbGFzcyksIGlzKFRlc3RFbnRpdHkuREVUQUlMRUQpKTsKKworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KYWNrc29uSnNvblZpZXdUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmFja3Nvbkpzb25WaWV3VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzhkZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmFja3Nvbkpzb25WaWV3VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25WaWV3OworCisvKioKKyAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0xODc4LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmFja3Nvbkpzb25WaWV3VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzLCBKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVZpZXcge30KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERldGFpbGVkVmlldyB7fQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RW50aXR5IHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3RFbnRpdHkgRU5USVRZID0gbmV3IFRlc3RFbnRpdHkoInNpbXBsZSIsICJkZXRhaWxlZCIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3RFbnRpdHkgREVUQUlMRUQgPSBuZXcgVGVzdEVudGl0eShudWxsLCAiZGV0YWlsZWQiKTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBzaW1wbGU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRldGFpbGVkOworCisgICAgICAgIHB1YmxpYyBUZXN0RW50aXR5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkoZmluYWwgU3RyaW5nIHNpbXBsZSwgZmluYWwgU3RyaW5nIGRldGFpbGVkKSB7CisgICAgICAgICAgICB0aGlzLnNpbXBsZSA9IHNpbXBsZTsKKyAgICAgICAgICAgIHRoaXMuZGV0YWlsZWQgPSBkZXRhaWxlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBKc29uVmlldyhTaW1wbGVWaWV3LmNsYXNzKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGU7CisgICAgICAgIH0KKworICAgICAgICBASnNvblZpZXcoRGV0YWlsZWRWaWV3LmNsYXNzKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGRldGFpbGVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgVGVzdEVudGl0eSB0aGF0ID0gKFRlc3RFbnRpdHkpIG87CisKKyAgICAgICAgICAgIGlmIChkZXRhaWxlZCAhPSBudWxsID8gIWRldGFpbGVkLmVxdWFscyh0aGF0LmRldGFpbGVkKSA6IHRoYXQuZGV0YWlsZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaW1wbGUgIT0gbnVsbCA/ICFzaW1wbGUuZXF1YWxzKHRoYXQuc2ltcGxlKSA6IHRoYXQuc2ltcGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc2ltcGxlICE9IG51bGwgPyBzaW1wbGUuaGFzaENvZGUoKSA6IDA7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChkZXRhaWxlZCAhPSBudWxsID8gZGV0YWlsZWQuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgQFBhdGgoImFzeW5jIikKKyAgICAgICAgQEpzb25WaWV3KERldGFpbGVkVmlldy5jbGFzcykKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0QXN5bmMoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICByZXNwb25zZS5yZXN1bWUoVGVzdEVudGl0eS5FTlRJVFkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgIEBQYXRoKCJzeW5jIikKKyAgICAgICAgQEpzb25WaWV3KERldGFpbGVkVmlldy5jbGFzcykKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkgZ2V0U3luYygpIHsKKyAgICAgICAgICAgIHJldHVybiBUZXN0RW50aXR5LkVOVElUWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoVGVzdEVudGl0eS5jbGFzcyksIGlzKFRlc3RFbnRpdHkuREVUQUlMRUQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFzeW5jIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShUZXN0RW50aXR5LmNsYXNzKSwgaXMoVGVzdEVudGl0eS5ERVRBSUxFRCkpOworCisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pheGJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmF4YlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTUwMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pheGJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Bbm90aGVyQXJyYXlUZXN0QmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQXR0ckFuZENoYXJEYXRhQmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuRW1wdHlFbGVtZW50QmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkVuY29kZWRDb250ZW50QmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuRmFrZUFycmF5QmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuSW50QXJyYXk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5Lkxpc3RBbmROb25MaXN0QmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuTGlzdEVtcHR5QmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuTGlzdFdyYXBwZXJCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5NeVJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5OYW1lc3BhY2VCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuTnVsbFN0cmluZ0JlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LlBlcnNvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuUHVyZUNoYXJEYXRhQmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuUmVnaXN0ZXJNZXNzYWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5TaW1wbGVCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LlNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LlRyZWVNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuVHdvTGlzdHNXcmFwcGVyQmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuVXNlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuVXNlclRhYmxlOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSmF4YlRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25UZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gQ0xBU1NFUyA9IHsKKyAgICAgICAgICAgIEFub3RoZXJBcnJheVRlc3RCZWFuLmNsYXNzLAorICAgICAgICAgICAgQXR0ckFuZENoYXJEYXRhQmVhbi5jbGFzcywKKyAgICAgICAgICAgIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuY2xhc3MsCisgICAgICAgICAgICBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5jbGFzcywKKyAgICAgICAgICAgIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmNsYXNzLAorICAgICAgICAgICAgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuY2xhc3MsCisgICAgICAgICAgICBFbXB0eUVsZW1lbnRCZWFuLmNsYXNzLAorICAgICAgICAgICAgRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uY2xhc3MsCisgICAgICAgICAgICBFbmNvZGVkQ29udGVudEJlYW4uY2xhc3MsCisgICAgICAgICAgICBGYWtlQXJyYXlCZWFuLmNsYXNzLAorICAgICAgICAgICAgSW50QXJyYXkuY2xhc3MsCisgICAgICAgICAgICBMaXN0QW5kTm9uTGlzdEJlYW4uY2xhc3MsCisgICAgICAgICAgICBMaXN0RW1wdHlCZWFuLmNsYXNzLAorICAgICAgICAgICAgTGlzdFdyYXBwZXJCZWFuLmNsYXNzLAorICAgICAgICAgICAgTXlSZXNwb25zZS5jbGFzcywKKyAgICAgICAgICAgIE5hbWVzcGFjZUJlYW4uY2xhc3MsCisgICAgICAgICAgICBOYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5jbGFzcywKKyAgICAgICAgICAgIE51bGxTdHJpbmdCZWFuLmNsYXNzLAorICAgICAgICAgICAgUGVyc29uLmNsYXNzLAorICAgICAgICAgICAgUHVyZUNoYXJEYXRhQmVhbi5jbGFzcywKKyAgICAgICAgICAgIFJlZ2lzdGVyTWVzc2FnZS5jbGFzcywKKyAgICAgICAgICAgIFNpbXBsZUJlYW4uY2xhc3MsCisgICAgICAgICAgICBTaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuY2xhc3MsCisgICAgICAgICAgICBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuY2xhc3MsCisgICAgICAgICAgICBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5jbGFzcywKKyAgICAgICAgICAgIFRyZWVNb2RlbC5jbGFzcywKKyAgICAgICAgICAgIFR3b0xpc3RzV3JhcHBlckJlYW4uY2xhc3MsCisgICAgICAgICAgICBVc2VyLmNsYXNzLAorICAgICAgICAgICAgVXNlclRhYmxlLmNsYXNzCisgICAgfTsKKworICAgIHB1YmxpYyBKYXhiVGVzdChmaW5hbCBKc29uVGVzdFNldHVwIGpzb25UZXN0U2V0dXApIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcihqc29uVGVzdFNldHVwKTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKCkKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SnNvblRlc3RTZXR1cFtdPiBnZXRKc29uUHJvdmlkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8SnNvblRlc3RTZXR1cFtdPiBqc29uVGVzdFNldHVwcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBmb3IgKGZpbmFsIEpzb25UZXN0UHJvdmlkZXIganNvblByb3ZpZGVyIDogSnNvblRlc3RQcm92aWRlci5KQVhCX1BST1ZJREVSUykgeworICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcyA6IENMQVNTRVMpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIC0gcmVtb3ZlIHRoZSBjb25kaXRpb24gYWZ0ZXIganNvbmIgcG9seW1vcnBoaWMgYWRhcHRlciBpcyBpbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIGlmICghKGpzb25Qcm92aWRlciBpbnN0YW5jZW9mIEpzb25UZXN0UHJvdmlkZXIuSnNvbmJUZXN0UHJvdmlkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIGpzb25UZXN0U2V0dXBzLmFkZChuZXcgSnNvblRlc3RTZXR1cFtde25ldyBKc29uVGVzdFNldHVwKGVudGl0eUNsYXNzLCBqc29uUHJvdmlkZXIpfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGpzb25UZXN0U2V0dXBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KZXJzZXkxMTk5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0plcnNleTExOTlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNkZWM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KZXJzZXkxMTk5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFkYXB0ZXIuSnNvbmJBZGFwdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkNvbG9ySG9sZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5KZXJzZXkxMTk5TGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEplcnNleTExOTlUZXN0IGV4dGVuZHMgQWJzdHJhY3RKc29uVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKCkKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SnNvblRlc3RTZXR1cFtdPiBnZW5lcmF0ZVRlc3RDYXNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMaXN0PEpzb25UZXN0U2V0dXBbXT4ganNvblRlc3RTZXR1cHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZpbmFsIENsYXNzPD8+W10gY2xhc3NlcyA9IHtKZXJzZXkxMTk5TGlzdC5jbGFzcywgQ29sb3JIb2xkZXIuY2xhc3N9OworCisgICAgICAgIGZvciAoZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uUHJvdmlkZXIgOiBKc29uVGVzdFByb3ZpZGVyLkpBWEJfUFJPVklERVJTKSB7CisgICAgICAgICAgICBqc29uVGVzdFNldHVwcy5hZGQobmV3IEpzb25UZXN0U2V0dXBbXXtuZXcgSnNvblRlc3RTZXR1cChjbGFzc2VzLCBqc29uUHJvdmlkZXIpfSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ganNvblRlc3RTZXR1cHM7CisgICAgfQorCisgICAgcHVibGljIEplcnNleTExOTlUZXN0KGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGpzb25UZXN0U2V0dXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSB7QGxpbmsgSnNvbmJBZGFwdGVyfSB0byBwcm92aWRlIEpTT05CIHdpdGggdGhlIHR5cGUgaGlkZGVuIGJlaGluZCB0aGUgZ2VuZXJpYyBPYmplY3QgYXJyYXkgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgSmVyc2V5MTE5OUxpc3QjZ2V0T2JqZWN0cygpfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNvbmJPYmplY3RUb0NvbG9ySG9sZGVyQWRhcHRlciBpbXBsZW1lbnRzIEpzb25iQWRhcHRlcjxPYmplY3RbXSwgQ29sb3JIb2xkZXJbXT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sb3JIb2xkZXJbXSBhZGFwdFRvSnNvbihPYmplY3RbXSBvKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKG8sIG8ubGVuZ3RoLCBDb2xvckhvbGRlcltdLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0W10gYWRhcHRGcm9tSnNvbihDb2xvckhvbGRlcltdIGNvbG9ySG9sZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBjb2xvckhvbGRlcjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0plcnNleTE4MzVUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmVyc2V5MTgzNVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDcyYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0plcnNleTE4MzVUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LlNpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW47CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBSZXByb2R1Y2libGUgdGVzdCBjYXNlIGZvciBKRVJTRVktMTgzNS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEplcnNleTE4MzVUZXN0IGV4dGVuZHMgQWJzdHJhY3RKc29uVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKCkKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SnNvblRlc3RTZXR1cFtdPiBnZW5lcmF0ZVRlc3RDYXNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMaXN0PEpzb25UZXN0U2V0dXBbXT4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8SnNvblRlc3RTZXR1cFtdPigpOworICAgICAgICByZXN1bHQuYWRkKG5ldyBKc29uVGVzdFNldHVwW10ge25ldyBKc29uVGVzdFNldHVwKG5ldyBDbGFzczw/PltdIHtTaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuLmNsYXNzfSwKKyAgICAgICAgICAgICAgICBuZXcgSnNvblRlc3RQcm92aWRlci5KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXIoKSl9KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgSmVyc2V5MTgzNVRlc3QoZmluYWwgSnNvblRlc3RTZXR1cCBqc29uVGVzdFNldHVwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoanNvblRlc3RTZXR1cCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25Qcm9jZXNzaW5nRGlzYWJsZWRUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblByb2Nlc3NpbmdEaXNhYmxlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2E0ZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25Qcm9jZXNzaW5nRGlzYWJsZWRUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguanNvbi5Kc29uOworaW1wb3J0IGphdmF4Lmpzb24uSnNvbk9iamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkludGVybmFsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uUHJvY2Vzc2luZ0Rpc2FibGVkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fT0JKRUNUX1NUUiA9ICJ7XCJmb29cIjpcImJhclwifSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNvbk9iamVjdCBKU09OX09CSkVDVCA9IEpzb24uY3JlYXRlUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoSlNPTl9PQkpFQ1RfU1RSKSkucmVhZE9iamVjdCgpOworCisgICAgQFBhdGgoIi8iKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImpzb25PYmplY3QiKQorICAgICAgICBwdWJsaWMgSnNvbk9iamVjdCBwb3N0SnNvbk9iamVjdChmaW5hbCBKc29uT2JqZWN0IGpzb25PYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uT2JqZWN0OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUsIHRydWUpCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG90aGVyIEpTT04gcHJvdmlkZXJzIGFyZSBkaXNhYmxlZCBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShJbnRlcm5hbFByb3BlcnRpZXMuSlNPTl9GRUFUVVJFX1NFUlZFUiwgIkpzb25Qcm9jZXNzaW5nIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbk9iamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9PQkpFQ1QpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDE1LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25Qcm9jZXNzaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25Qcm9jZXNzaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWY1MjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblByb2Nlc3NpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5qc29uLkpzb247CitpbXBvcnQgamF2YXguanNvbi5Kc29uQXJyYXk7CitpbXBvcnQgamF2YXguanNvbi5Kc29uTnVtYmVyOworaW1wb3J0IGphdmF4Lmpzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25TdHJpbmc7CitpbXBvcnQgamF2YXguanNvbi5Kc29uU3RydWN0dXJlOworaW1wb3J0IGphdmF4Lmpzb24uSnNvblZhbHVlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuanNvbnAuSnNvblByb2Nlc3NpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5KU09OUDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworLy8gQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBKc29uUHJvY2Vzc2luZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX09CSkVDVF9TVFIxID0gIntcImZvb1wiOlwiYmFyXCJ9IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RfU1RSMiA9ICJ7XCJmb29cIjogMTIzNDV9IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9BUlJBWV9TVFIxID0gIlsiICsgSlNPTl9PQkpFQ1RfU1RSMSArICIsIiArIEpTT05fT0JKRUNUX1NUUjEgKyAiXSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQVJSQVlfU1RSMiA9ICJbIiArIEpTT05fT0JKRUNUX1NUUjIgKyAiLCIgKyBKU09OX09CSkVDVF9TVFIyICsgIl0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FSUkFZX1ZBTFVFX1NUUiA9ICJbbnVsbF0iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNvbk9iamVjdCBKU09OX09CSkVDVCA9IEpzb24uY3JlYXRlUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoSlNPTl9PQkpFQ1RfU1RSMSkpLnJlYWRPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc29uQXJyYXkgSlNPTl9BUlJBWSA9IEpzb24uY3JlYXRlUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoSlNPTl9BUlJBWV9TVFIxKSkucmVhZEFycmF5KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNvbkFycmF5IEpTT05fQVJSQVlfVkFMVUUgPSBKc29uLmNyZWF0ZVJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKEpTT05fQVJSQVlfVkFMVUVfU1RSKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVhZEFycmF5KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc29uVmFsdWUgSlNPTl9WQUxVRV9CT09MID0gSnNvblZhbHVlLlRSVUU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNvblN0cmluZyBKU09OX1ZBTFVFX1NUUklORyA9IEpzb24uY3JlYXRlUmVhZGVyKAorICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcihKU09OX0FSUkFZX1NUUjEpKS5yZWFkQXJyYXkoKS5nZXRKc29uT2JqZWN0KDApLmdldEpzb25TdHJpbmcoImZvbyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzb25OdW1iZXIgSlNPTl9WQUxVRV9OVU1CRVIgPSBKc29uLmNyZWF0ZVJlYWRlcigKKyAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoSlNPTl9BUlJBWV9TVFIyKSkucmVhZEFycmF5KCkuZ2V0SnNvbk9iamVjdCgwKS5nZXRKc29uTnVtYmVyKCJmb28iKTsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgianNvbk9iamVjdCIpCisgICAgICAgIHB1YmxpYyBKc29uT2JqZWN0IHBvc3RKc29uT2JqZWN0KGZpbmFsIEpzb25PYmplY3QganNvbk9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIGpzb25PYmplY3Q7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgianNvblN0cnVjdHVyZSIpCisgICAgICAgIHB1YmxpYyBKc29uU3RydWN0dXJlIHBvc3RKc29uU3RydWN0dXJlKGZpbmFsIEpzb25TdHJ1Y3R1cmUganNvblN0cnVjdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuIGpzb25TdHJ1Y3R1cmU7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgianNvbkFycmF5IikKKyAgICAgICAgcHVibGljIEpzb25BcnJheSBwb3N0SnNvbkFycmF5KGZpbmFsIEpzb25BcnJheSBqc29uQXJyYXkpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uQXJyYXk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgianNvblZhbHVlIikKKyAgICAgICAgcHVibGljIEpzb25WYWx1ZSBwb3N0SnNvblZhbHVlKGZpbmFsIEpzb25WYWx1ZSBqc29uVmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgianNvblN0cmluZyIpCisgICAgICAgIHB1YmxpYyBKc29uU3RyaW5nIHBvc3RKc29uU3RyaW5nKGZpbmFsIEpzb25TdHJpbmcganNvblN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIGpzb25TdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgianNvbk51bWJlciIpCisgICAgICAgIHB1YmxpYyBKc29uVmFsdWUgcG9zdEpzb25OdW1iZXIoZmluYWwgSnNvbk51bWJlciBqc29uTnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4ganNvbk51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQEpTT05QCisgICAgICAgIEBQYXRoKCJqc29uT2JqZWN0V2l0aFBhZGRpbmciKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKQorICAgICAgICBwdWJsaWMgSnNvbk9iamVjdCBnZXRKc29uT2JqZWN0V2l0aFBhZGRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gSlNPTl9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGRpc2FibGUgYXV0by1kaXNjb3ZlcnkgKE1PWHksIEJlYW5WYWxpZGF0aW9uLCAuLi4pIGFuZCByZWdpc3RlciBWYWxpZGF0aW9uRmVhdHVyZS4KKyAgICAgICAgICAgICAgICAucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUsIHRydWUpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEpzb25Qcm9jZXNzaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbk9iamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9PQkpFQ1QpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9PQkpFQ1QsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvbk9iamVjdC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3RBc1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVF9TVFIxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpTT05fT0JKRUNULCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25PYmplY3QuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0UGx1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2Zvbytqc29uIikucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX09CSkVDVCwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uT2JqZWN0LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbk9iamVjdEFzU3RyaW5nUGx1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKEpTT05fT0JKRUNUX1NUUjEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9PQkpFQ1QsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvbk9iamVjdC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3RXcm9uZ1RhcmdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0QXNTdHJpbmdXcm9uZ1RhcmdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9PQkpFQ1RfU1RSMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0V3JvbmdFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25PYmplY3QiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKEpTT05fQVJSQVkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbk9iamVjdEFzU3RyaW5nV3JvbmdFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25PYmplY3QiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWV9TVFIxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3RXcm9uZ01lZGlhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0QXNTdHJpbmdXcm9uZ01lZGlhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKEpTT05fT0JKRUNUX1NUUjEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uQXJyYXkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKEpTT05fQVJSQVkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9BUlJBWSwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uQXJyYXkuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXlBc1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWV9TVFIxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpTT05fQVJSQVksIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvbkFycmF5LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkFycmF5UGx1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vK2pzb24iKS5wb3N0KEVudGl0eS5qc29uKEpTT05fQVJSQVkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9BUlJBWSwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uQXJyYXkuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXlBc1N0cmluZ1BsdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25BcnJheSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWV9TVFIxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpTT05fQVJSQVksIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvbkFycmF5LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkFycmF5V3JvbmdUYXJnZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25PYmplY3QiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKEpTT05fQVJSQVkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkFycmF5QXNTdHJpbmdXcm9uZ1RhcmdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX0FSUkFZX1NUUjEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkFycmF5V3JvbmdFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25BcnJheSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9PQkpFQ1QpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkFycmF5QXNTdHJpbmdXcm9uZ0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9PQkpFQ1RfU1RSMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXlXcm9uZ01lZGlhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKS5wb3N0KEVudGl0eS5qc29uKEpTT05fQVJSQVkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkFycmF5dEFzU3RyaW5nV3JvbmdNZWRpYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25BcnJheSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWV9TVFIxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25BcnJheVZhbHVlRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uQXJyYXkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKEpTT05fQVJSQVlfVkFMVUUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9BUlJBWV9WQUxVRSwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uQXJyYXkuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uU3RydWN0dXJlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25TdHJ1Y3R1cmUiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKEpTT05fQVJSQVkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9BUlJBWSwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uU3RydWN0dXJlLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvblN0cnVjdHVyZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvblN0cnVjdHVyZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9PQkpFQ1QpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9PQkpFQ1QsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvblN0cnVjdHVyZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25WYWx1ZUJvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25WYWx1ZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKEpTT05fVkFMVUVfQk9PTCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX1ZBTFVFX0JPT0wsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvblZhbHVlLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvblZhbHVlU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uU3RyaW5nIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKEpTT05fVkFMVUVfU1RSSU5HKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpTT05fVkFMVUVfU1RSSU5HLCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25TdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uVmFsdWVTdHJpbmdBc1ZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uVmFsdWUiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX1ZBTFVFX1NUUklORykpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX1ZBTFVFX1NUUklORywgcmVzcG9uc2UucmVhZEVudGl0eShKc29uU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvblZhbHVlU3RyaW5nQXNTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25WYWx1ZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKCJcIlJlZCA1XCIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWQgNSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvblN0cmluZy5jbGFzcykuZ2V0U3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25WYWx1ZU51bWJlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk51bWJlciIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX1ZBTFVFX05VTUJFUikpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX1ZBTFVFX05VTUJFUiwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uTnVtYmVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvblZhbHVlTnVtYmVyQXNWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvblZhbHVlIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9WQUxVRV9OVU1CRVIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9WQUxVRV9OVU1CRVIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvbk51bWJlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3RXaXRoUGFkZGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdFdpdGhQYWRkaW5nIikucmVxdWVzdCgiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoSlNPTlAuREVGQVVMVF9DQUxMQkFDSyArICIoIiArIEpTT05fT0JKRUNUX1NUUjEgKyAiKSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblRlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uVGVzdEhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MDZjZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblRlc3RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSnNvblRlc3RIZWxwZXIgeworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VBc1N0cmluZyhTdHJpbmcgcHJlZml4LCBTdHJpbmcgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRFbnRpdHlBc1N0cmluZyhUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlQXNTdHJlYW0ocHJlZml4ICsgcmVzb3VyY2UpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnRpdHlBc1N0cmluZyhJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBjaGFyW10gYyA9IG5ldyBjaGFyWzEwMjRdOworICAgICAgICBpbnQgbDsKKyAgICAgICAgd2hpbGUgKChsID0gcmVhZGVyLnJlYWQoYykpICE9IC0xKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoYywgMCwgbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBjcmVhdGVUZXN0SW5zdGFuY2UoQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBjcmVhdGVNZXRob2QgPSBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZCgiY3JlYXRlVGVzdEluc3RhbmNlIik7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgICAgIHJldHVybiAoVCkgY3JlYXRlTWV0aG9kLmludm9rZShjbGF6eik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uRW1wdHkoZmluYWwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uID09IG51bGwgfHwgY29sbGVjdGlvbi5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gYm9vbGVhbiBhcmVDb2xsZWN0aW9uc0VxdWFsKGZpbmFsIENvbGxlY3Rpb248VD4gY29sbGVjdGlvbjEsIGZpbmFsIENvbGxlY3Rpb248VD4gY29sbGVjdGlvbjIpIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24xID09IGNvbGxlY3Rpb24yCisgICAgICAgICAgICAgICAgfHwgKGlzQ29sbGVjdGlvbkVtcHR5KGNvbGxlY3Rpb24xKSAmJiBpc0NvbGxlY3Rpb25FbXB0eShjb2xsZWN0aW9uMikpCisgICAgICAgICAgICAgICAgfHwgKGNvbGxlY3Rpb24xICE9IG51bGwgJiYgY29sbGVjdGlvbjEuZXF1YWxzKGNvbGxlY3Rpb24yKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXJyYXlFbXB0eShmaW5hbCBPYmplY3RbXSBhcnJheSkgeworICAgICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPT0gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBib29sZWFuIGFyZUFycmF5c0VxdWFsKGZpbmFsIFRbXSBhcnJheTEsIGZpbmFsIFRbXSBhcnJheTIpIHsKKyAgICAgICAgcmV0dXJuIGFycmF5MSA9PSBhcnJheTIKKyAgICAgICAgICAgICAgICB8fCAoaXNBcnJheUVtcHR5KGFycmF5MSkgJiYgaXNBcnJheUVtcHR5KGFycmF5MikpCisgICAgICAgICAgICAgICAgfHwgQXJyYXlzLmVxdWFscyhhcnJheTEsIGFycmF5Mik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblRlc3RQcm92aWRlci5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25UZXN0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzcyYjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25UZXN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5Kc29uYjsKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuSnNvbmJCdWlsZGVyOworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5Kc29uYkNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3NvbjEuSmFja3NvbjFGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qc29uYi5Kc29uQmluZGluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CisKKy8qKgorICogQ29tbW9uIGNsYXNzIGZvciBKU09OIHByb3ZpZGVycyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0ZXN0aW5nIEpTT04gY2FwYWJpbGl0aWVzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnNvblRlc3RQcm92aWRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248SnNvblRlc3RQcm92aWRlcj4gSkFYQl9QUk9WSURFUlMgPSBuZXcgTGlua2VkSGFzaFNldDxKc29uVGVzdFByb3ZpZGVyPigpIHt7CisgICAgICAgIGFkZChuZXcgSmFja3Nvbkpzb25UZXN0UHJvdmlkZXIoKSk7CisgICAgICAgIGFkZChuZXcgSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyKCkpOworICAgICAgICBhZGQobmV3IEpldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcigpKTsKKyAgICAgICAgYWRkKG5ldyBKZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyKCkpOworICAgICAgICBhZGQobmV3IE1veHlKc29uVGVzdFByb3ZpZGVyKCkpOworICAgICAgICBhZGQobmV3IEpzb25iVGVzdFByb3ZpZGVyKCkpOworICAgIH19OworCisgICAgLy8gIFRPRE8gYWRkIE1veHlKc29uVGVzdFByb3ZpZGVyIG9uY2UgTU9YeSBzdXBwb3J0cyBQT0pPCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEpzb25UZXN0UHJvdmlkZXI+IFBPSk9fUFJPVklERVJTID0gbmV3IExpbmtlZEhhc2hTZXQ8SnNvblRlc3RQcm92aWRlcj4oKSB7eworICAgICAgICBhZGQobmV3IEphY2tzb25Kc29uVGVzdFByb3ZpZGVyKCkpOworICAgICAgICBhZGQobmV3IEphY2tzb24xSnNvblRlc3RQcm92aWRlcigpKTsKKyAgICB9fTsKKworICAgIHByaXZhdGUgRmVhdHVyZSBmZWF0dXJlOworICAgIHByaXZhdGUgSmV0dGlzb25Db25maWcgY29uZmlndXJhdGlvbjsKKyAgICBwcml2YXRlIFNldDxPYmplY3Q+IHByb3ZpZGVycyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyIGV4dGVuZHMgSnNvblRlc3RQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIEpldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcigpIHsKKyAgICAgICAgICAgIGZpbmFsIEpldHRpc29uQ29uZmlnIGpzb25Db25maWd1cmF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgSmV0dGlzb25Db25maWcubWFwcGVkSmV0dGlzb24oKS54bWwySnNvbk5zKG5ldyBIYXNoTWFwPFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc+KCkge3sKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXQoImh0dHA6Ly9leGFtcGxlLmNvbSIsICJleGFtcGxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXQoImh0dHA6Ly90ZXN0LmpheGIuY29tIiwgImpheGIiKTsKKyAgICAgICAgICAgICAgICAgICAgfX0pLnNlcmlhbGl6ZUFzQXJyYXkoInNpbmdsZUl0ZW1MaXN0IikuYnVpbGQoKTsKKworICAgICAgICAgICAgc2V0RmVhdHVyZShuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworICAgICAgICAgICAgc2V0Q29uZmlndXJhdGlvbihqc29uQ29uZmlndXJhdGlvbik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlciBleHRlbmRzIEpzb25UZXN0UHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBKZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyKCkgeworICAgICAgICAgICAgc2V0RmVhdHVyZShuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworCisgICAgICAgICAgICBzZXRDb25maWd1cmF0aW9uKEpldHRpc29uQ29uZmlnLmJhZGdlckZpc2goKS5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb3h5SnNvblRlc3RQcm92aWRlciBleHRlbmRzIEpzb25UZXN0UHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBNb3h5SnNvblRlc3RQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHNldEZlYXR1cmUobmV3IE1veHlKc29uRmVhdHVyZSgpKTsKKyAgICAgICAgICAgIGdldFByb3ZpZGVycygpLmFkZChuZXcgTW94eUpzb25Db25maWd1cmF0aW9uQ29udGV4dFJlc29sdmVyKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIE1veHlKc29uQ29uZmlndXJhdGlvbkNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxNb3h5SnNvbkNvbmZpZz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTW94eUpzb25Db25maWcgZ2V0Q29udGV4dChmaW5hbCBDbGFzczw/PiBvYmplY3RUeXBlKSB7CisgICAgICAgICAgICBmaW5hbCBNb3h5SnNvbkNvbmZpZyBjb25maWd1cmF0aW9uID0gbmV3IE1veHlKc29uQ29uZmlnKCk7CisKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZXNwYWNlUHJlZml4TWFwcGVyID0gbmV3IEhhc2hNYXA8PigxKTsKKyAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcHBlci5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOworICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwcGVyLnB1dCgiaHR0cDovL2V4YW1wbGUuY29tIiwgImV4YW1wbGUiKTsKKyAgICAgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcHBlci5wdXQoImh0dHA6Ly90ZXN0LmpheGIuY29tIiwgImpheGIiKTsKKworICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXROYW1lc3BhY2VQcmVmaXhNYXBwZXIobmFtZXNwYWNlUHJlZml4TWFwcGVyKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0TmFtZXNwYWNlU2VwYXJhdG9yKCc6Jyk7CisKKyAgICAgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBKc29uYkNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxKc29uYj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSnNvbmIgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICBKc29uYkNvbmZpZyBjb25maWcgPSBuZXcgSnNvbmJDb25maWcoKTsKKyAgICAgICAgICAgIHJldHVybiBKc29uYkJ1aWxkZXIuY3JlYXRlKGNvbmZpZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEphY2tzb25Kc29uVGVzdFByb3ZpZGVyIGV4dGVuZHMgSnNvblRlc3RQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIEphY2tzb25Kc29uVGVzdFByb3ZpZGVyKCkgeworICAgICAgICAgICAgc2V0RmVhdHVyZShuZXcgSmFja3NvbkZlYXR1cmUoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyIGV4dGVuZHMgSnNvblRlc3RQcm92aWRlciB7CisgICAgICAgIHB1YmxpYyBKYWNrc29uMUpzb25UZXN0UHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzZXRGZWF0dXJlKG5ldyBKYWNrc29uMUZlYXR1cmUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzb25iVGVzdFByb3ZpZGVyIGV4dGVuZHMgSnNvblRlc3RQcm92aWRlciB7CisgICAgICAgIHB1YmxpYyBKc29uYlRlc3RQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHNldEZlYXR1cmUobmV3IEpzb25CaW5kaW5nRmVhdHVyZSgpKTsKKyAgICAgICAgICAgIGdldFByb3ZpZGVycygpLmFkZChuZXcgSnNvbmJDb250ZXh0UmVzb2x2ZXIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSmV0dGlzb25Db25maWcgZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q29uZmlndXJhdGlvbihmaW5hbCBKZXR0aXNvbkNvbmZpZyBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgcHVibGljIEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIGZlYXR1cmU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0RmVhdHVyZShmaW5hbCBGZWF0dXJlIGZlYXR1cmUpIHsKKyAgICAgICAgdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0UHJvdmlkZXJzKCkgeworICAgICAgICByZXR1cm4gcHJvdmlkZXJzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25XaXRoUGFkZGluZ0VuY29kaW5nRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25XaXRoUGFkZGluZ0VuY29kaW5nRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmU1MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvbldpdGhQYWRkaW5nRW5jb2RpbmdGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuRGVmbGF0ZUVuY29kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5HWmlwRW5jb2RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuSlNPTlA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuRW5jb2RpbmdGaWx0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0cywgdGhhdCBKU09OUCBjYWxsYmFjayB3cmFwcGluZyB0YWtlcyBwbGFjZXMgYmVmb3JlIHRoZSBldmVudHVhbCBlbnRpdHkgY29tcHJlc3Npb24uCisgKgorICogU2VlIGh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTI1MjQgZm9yIHRoZSBvcmlnaW5hbCBpc3N1ZSBkZXNjcmlwdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uV2l0aFBhZGRpbmdFbmNvZGluZ0ZpbHRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEVuY29kaW5nRmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihHWmlwRW5jb2Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRGVmbGF0ZUVuY29kZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJyZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJqc29ucCIpCisgICAgICAgIEBKU09OUChxdWVyeVBhcmFtID0gSlNPTlAuREVGQVVMVF9RVUVSWSkKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKQorICAgICAgICBwdWJsaWMgTWVzc2FnZSBnZXRIZWxsb0pzb25QKEBDb250ZXh0IGZpbmFsIEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJQYXJhbXMgPSBoZWFkZXJzLmdldFJlcXVlc3RIZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBrZXkgOiBoZWFkZXJQYXJhbXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oa2V5ICsgIjogIik7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiBoZWFkZXJQYXJhbXMuZ2V0KGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCh2YWx1ZSArICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxiXGIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZSgiSGVsbG8gd29ybGQgSnNvblAhIiwgIkVuZ2xpc2giKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdyZWV0aW5nOworICAgICAgICBwcml2YXRlIFN0cmluZyBsYW5ndWFnZTsKKworICAgICAgICBwdWJsaWMgTWVzc2FnZShmaW5hbCBTdHJpbmcgZ3JlZXRpbmcsIGZpbmFsIFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICAgICAgdGhpcy5ncmVldGluZyA9IGdyZWV0aW5nOworICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBncmVldGluZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbGFuZ3VhZ2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0R3ppcERlY29kaW5nKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvanNvbnAiKS5xdWVyeVBhcmFtKCJfX2NhbGxiYWNrIiwgImRpYWxvZyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEdaaXBFbmNvZGVyLmNsYXNzKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdC1FbmNvZGluZyIsICJnemlwIikuZ2V0KCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnemlwIiwgcmVzcG9uc2UuZ2V0SGVhZGVycygpLmdldEZpcnN0KCJDb250ZW50LUVuY29kaW5nIikpOworCisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LnN0YXJ0c1dpdGgoImRpYWxvZygiKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmNvbnRhaW5zKCJIZWxsbyB3b3JsZCBKc29uUCEiKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmNvbnRhaW5zKCJFbmdsaXNoIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3REZWZsYXRlRGVjb2RpbmcoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9qc29ucCIpLnF1ZXJ5UGFyYW0oIl9fY2FsbGJhY2siLCAiZGlhbG9nIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRGVmbGF0ZUVuY29kZXIuY2xhc3MpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiQWNjZXB0LUVuY29kaW5nIiwgImRlZmxhdGUiKS5nZXQoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmxhdGUiLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIkNvbnRlbnQtRW5jb2RpbmciKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuc3RhcnRzV2l0aCgiZGlhbG9nKCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoIkhlbGxvIHdvcmxkIEpzb25QISIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoIkVuZ2xpc2giKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25XaXRoUGFkZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uV2l0aFBhZGRpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmMzVkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uV2l0aFBhZGRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwyODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuSlNPTlA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmhhbWNyZXN0Lk1hdGNoZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuYWxsT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZW5kc1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuc3RhcnRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEpzb25XaXRoUGFkZGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKc29uQmVhbiB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXR0cmlidXRlOworCisgICAgICAgIHB1YmxpYyBKc29uQmVhbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKc29uQmVhbihmaW5hbCBTdHJpbmcgYXR0cikgeworICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBKc29uQmVhbiBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpzb25CZWFuKCJhdHRyIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZSkgeworICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgianNvbnAiKQorICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKc29uUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIlB1cmVKc29uIikKKyAgICAgICAgcHVibGljIEpzb25CZWFuIGdldFB1cmVKc29uKCkgeworICAgICAgICAgICAgcmV0dXJuIEpzb25CZWFuLmNyZWF0ZVRlc3RJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBASlNPTlAKKyAgICAgICAgQFBhdGgoIkpzb25XaXRoUGFkZGluZ0RlZmF1bHQiKQorICAgICAgICBwdWJsaWMgSnNvbkJlYW4gZ2V0SnNvbldpdGhQYWRkaW5nRGVmYXVsdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBKc29uQmVhbi5jcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQEpTT05QKHF1ZXJ5UGFyYW0gPSAiZXZhbCIpCisgICAgICAgIEBQYXRoKCJKc29uV2l0aFBhZGRpbmdRdWVyeUNhbGxiYWNrUGFyYW0iKQorICAgICAgICBwdWJsaWMgSnNvbkJlYW4gZ2V0SnNvbldpdGhQYWRkaW5nUXVlcnlDYWxsYmFja1BhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIEpzb25CZWFuLmNyZWF0ZVRlc3RJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBASlNPTlAoY2FsbGJhY2sgPSAicGFyc2UiLCBxdWVyeVBhcmFtID0gImV2YWwiKQorICAgICAgICBAUGF0aCgiSnNvbldpdGhQYWRkaW5nQ2FsbGJhY2tBbmRRdWVyeUNhbGxiYWNrUGFyYW0iKQorICAgICAgICBwdWJsaWMgSnNvbkJlYW4gZ2V0SnNvbldpdGhQYWRkaW5nQ2FsbGJhY2tBbmRRdWVyeUNhbGxiYWNrUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gSnNvbkJlYW4uY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBKU09OUChjYWxsYmFjayA9ICJldmFsIikKKyAgICAgICAgQFBhdGgoIkpzb25XaXRoUGFkZGluZ0NhbGxiYWNrIikKKyAgICAgICAgcHVibGljIEpzb25CZWFuIGdldEpzb25XaXRoUGFkZGluZ0NhbGxiYWNrKCkgeworICAgICAgICAgICAgcmV0dXJuIEpzb25CZWFuLmNyZWF0ZVRlc3RJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEpzb25UZXN0UHJvdmlkZXJbXT4gZ2V0SnNvblByb3ZpZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMaXN0PEpzb25UZXN0UHJvdmlkZXJbXT4gdGVzdFByb3ZpZGVycyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBmb3IgKGZpbmFsIEpzb25UZXN0UHJvdmlkZXIganNvblByb3ZpZGVyIDogSnNvblRlc3RQcm92aWRlci5KQVhCX1BST1ZJREVSUykgeworICAgICAgICAgICAgdGVzdFByb3ZpZGVycy5hZGQobmV3IEpzb25UZXN0UHJvdmlkZXJbXSB7anNvblByb3ZpZGVyfSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGVzdFByb3ZpZGVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEpzb25UZXN0UHJvdmlkZXIganNvblRlc3RQcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2U7CisKKyAgICBwdWJsaWMgSnNvbldpdGhQYWRkaW5nVGVzdChmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25UZXN0UHJvdmlkZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcihjb25maWd1cmVKYXhyc0FwcGxpY2F0aW9uKGpzb25UZXN0UHJvdmlkZXIpKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICB0aGlzLmpzb25UZXN0UHJvdmlkZXIgPSBqc29uVGVzdFByb3ZpZGVyOworICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIiVzOiBSZWNlaXZlZCBKU09OIGVudGl0eSBjb250ZW50IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIEpTT04gZW50aXR5IGNvbnRlbnQuIiwKKyAgICAgICAgICAgICAgICBqc29uVGVzdFByb3ZpZGVyLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoanNvblRlc3RQcm92aWRlci5nZXRGZWF0dXJlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZUpheHJzQXBwbGljYXRpb24oZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uVGVzdFByb3ZpZGVyKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJDbGFzc2VzKEpzb25SZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoanNvblRlc3RQcm92aWRlci5nZXRGZWF0dXJlKCkpOworCisgICAgICAgIGlmIChqc29uVGVzdFByb3ZpZGVyLmdldFByb3ZpZGVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVySW5zdGFuY2VzKGpzb25UZXN0UHJvdmlkZXIuZ2V0UHJvdmlkZXJzKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25wIikucGF0aCgiUHVyZUpzb24iKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpLCBlcXVhbFRvKCJhcHBsaWNhdGlvbi9qc29uIikpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChlcnJvck1lc3NhZ2UsIGVudGl0eSwgYWxsT2Yobm90KHN0YXJ0c1dpdGgoImNhbGxiYWNrKCIpKSwgbm90KGVuZHNXaXRoKCIpIikpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhKYXZhU2NyaXB0TWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29ucCIpLnBhdGgoIlB1cmVKc29uIikucmVxdWVzdCgiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IikuZ2V0KCk7CisKKyAgICAgICAgLy8gTWV0aG9kIGlzIGludm9rZWQgYnV0IHdlIGRvIG5vdCBoYXZlIGEgTUJXIGZvciBhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQuCisgICAgICAgIGlmIChqc29uVGVzdFByb3ZpZGVyLmdldEZlYXR1cmUoKS5nZXRDbGFzcygpID09IEphY2tzb25GZWF0dXJlLmNsYXNzKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg1MDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgiSnNvbldpdGhQYWRkaW5nRGVmYXVsdCIsICJjYWxsYmFjayIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCJKc29uV2l0aFBhZGRpbmdRdWVyeUNhbGxiYWNrUGFyYW0iLCAiZXZhbCIsICJwYXJzZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbURlZmF1bHRRdWVyeVBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbSIsICJjYWxsYmFjayIsICJwYXJzZSIsICJjYWxsYmFjayIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbURlZmF1bHRDYWxsYmFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCJKc29uV2l0aFBhZGRpbmdRdWVyeUNhbGxiYWNrUGFyYW0iLCBudWxsLCAiY2FsbGJhY2siKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uV2l0aFBhZGRpbmdRdWVyeUNhbGxiYWNrUGFyYW1OZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCJKc29uV2l0aFBhZGRpbmdRdWVyeUNhbGxiYWNrUGFyYW0iLCAiY2FsbCIsICJwYXJzZSIsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ0NhbGxiYWNrQW5kUXVlcnlDYWxsYmFja1BhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ0NhbGxiYWNrQW5kUXVlcnlDYWxsYmFja1BhcmFtIiwgImV2YWwiLCAicnVuIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhQYWRkaW5nQ2FsbGJhY2tBbmRRdWVyeUNhbGxiYWNrUGFyYW1OZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCJKc29uV2l0aFBhZGRpbmdDYWxsYmFja0FuZFF1ZXJ5Q2FsbGJhY2tQYXJhbSIsICJldmFsIiwgInJ1biIsICJwYXJzZSIsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ0NhbGxiYWNrQW5kUXVlcnlDYWxsYmFja1BhcmFtRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCJKc29uV2l0aFBhZGRpbmdDYWxsYmFja0FuZFF1ZXJ5Q2FsbGJhY2tQYXJhbSIsICJldmFseCIsICJwYXJzZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ0NhbGxiYWNrQW5kUXVlcnlDYWxsYmFja1BhcmFtRGVmYXVsdE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ0NhbGxiYWNrQW5kUXVlcnlDYWxsYmFja1BhcmFtIiwgImV2YWx4IiwgInhsYXZlIiwgImV2YWwiLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uV2l0aFBhZGRpbmdDYWxsYmFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCJKc29uV2l0aFBhZGRpbmdDYWxsYmFjayIsICJldmFsIiwgImV2YWwiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uV2l0aFBhZGRpbmdDYWxsYmFja05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ0NhbGxiYWNrIiwgImV2YWwiLCAibGF2ZSIsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgY2FsbGJhY2spIHsKKyAgICAgICAgdGVzdChwYXRoLCBudWxsLCBudWxsLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3QoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBxdWVyeVBhcmFtTmFtZSwgZmluYWwgU3RyaW5nIGNhbGxiYWNrKSB7CisgICAgICAgIHRlc3QocGF0aCwgcXVlcnlQYXJhbU5hbWUsIGNhbGxiYWNrLCBjYWxsYmFjaywgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgcXVlcnlQYXJhbU5hbWUsIGZpbmFsIFN0cmluZyBjYWxsYmFjaywgZmluYWwgYm9vbGVhbiBpc05lZ2F0aXZlKSB7CisgICAgICAgIHRlc3QocGF0aCwgcXVlcnlQYXJhbU5hbWUsIGNhbGxiYWNrLCBjYWxsYmFjaywgaXNOZWdhdGl2ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3QoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBxdWVyeVBhcmFtTmFtZSwgZmluYWwgU3RyaW5nIHF1ZXJ5UGFyYW1WYWx1ZSwgZmluYWwgU3RyaW5nIGNhbGxiYWNrKSB7CisgICAgICAgIHRlc3QocGF0aCwgcXVlcnlQYXJhbU5hbWUsIHF1ZXJ5UGFyYW1WYWx1ZSwgY2FsbGJhY2ssIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nIHF1ZXJ5UGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgcXVlcnlQYXJhbVZhbHVlLCBmaW5hbCBTdHJpbmcgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc05lZ2F0aXZlKSB7CisKKyAgICAgICAgV2ViVGFyZ2V0IHRlbXBUYXJnZXQgPSB0YXJnZXQoImpzb25wIikucGF0aChwYXRoKTsKKyAgICAgICAgaWYgKHF1ZXJ5UGFyYW1OYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRlbXBUYXJnZXQgPSB0ZW1wVGFyZ2V0LnF1ZXJ5UGFyYW0ocXVlcnlQYXJhbU5hbWUsIHF1ZXJ5UGFyYW1WYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlbXBUYXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpLCBlcXVhbFRvKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAvLyBDaGVjayB0aGUgZW50aXR5LgorICAgICAgICBmaW5hbCBNYXRjaGVyPFN0cmluZz4gc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGgoY2FsbGJhY2sgKyAiKCIpOworICAgICAgICBmaW5hbCBNYXRjaGVyPFN0cmluZz4gZW5kc1dpdGggPSBlbmRzV2l0aCgiKSIpOworCisgICAgICAgIGZpbmFsIE1hdGNoZXI8U3RyaW5nPiBjYWxsYmFja01hdGNoZXIgPSBpc05lZ2F0aXZlID8gbm90KHN0YXJ0c1dpdGgpIDogc3RhcnRzV2l0aDsKKworICAgICAgICBhc3NlcnRUaGF0KGVycm9yTWVzc2FnZSwgZW50aXR5LCBhbGxPZihjYWxsYmFja01hdGNoZXIsIGVuZHNXaXRoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vUG9qb1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Qb2pvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDc1YjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vUG9qb1Rlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkucG9qby5Qb2pvQW5pbWFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5wb2pvLlBvam9BbmltYWxMaXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5wb2pvLlBvam9DYXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LnBvam8uUG9qb0RvZzsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFBvam9UZXN0IGV4dGVuZHMgQWJzdHJhY3RKc29uVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SnNvblRlc3RTZXR1cFtdPiBnZW5lcmF0ZVRlc3RDYXNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMaXN0PEpzb25UZXN0U2V0dXBbXT4ganNvblRlc3RTZXR1cHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZpbmFsIENsYXNzPD8+W10gY2xhc3NlcyA9IHtQb2pvQW5pbWFsTGlzdC5jbGFzcywgUG9qb0FuaW1hbC5jbGFzcywgUG9qb0RvZy5jbGFzcywgUG9qb0NhdC5jbGFzc307CisKKyAgICAgICAgZm9yIChmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlciA6IEpzb25UZXN0UHJvdmlkZXIuUE9KT19QUk9WSURFUlMpIHsKKyAgICAgICAgICAgIGpzb25UZXN0U2V0dXBzLmFkZChuZXcgSnNvblRlc3RTZXR1cFtdeworICAgICAgICAgICAgICAgICAgICBuZXcgSnNvblRlc3RTZXR1cChjbGFzc2VzLCBqc29uUHJvdmlkZXIpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uVGVzdFNldHVwczsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9qb1Rlc3QoZmluYWwgSnNvblRlc3RTZXR1cCBqc29uVGVzdFNldHVwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoanNvblRlc3RTZXR1cCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0FuaW1hbC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9BbmltYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDczNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9BbmltYWwuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCisvLyBKYWNrc29uIDEKK0BvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uVHlwZUluZm8oCisgICAgICAgIHVzZSA9IG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25UeXBlSW5mby5JZC5OQU1FLAorICAgICAgICBpbmNsdWRlID0gb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblR5cGVJbmZvLkFzLlBST1BFUlRZKQorQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25TdWJUeXBlcyh7CisgICAgICAgIEBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uU3ViVHlwZXMuVHlwZSh2YWx1ZSA9IENhdC5jbGFzcyksCisgICAgICAgIEBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uU3ViVHlwZXMuVHlwZSh2YWx1ZSA9IERvZy5jbGFzcykgfSkKKy8vIEphY2tzb24gMgorQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25UeXBlSW5mbygKKyAgICAgICAgdXNlID0gY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblR5cGVJbmZvLklkLk5BTUUsCisgICAgICAgIGluY2x1ZGUgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uVHlwZUluZm8uQXMuUFJPUEVSVFkpCitAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblN1YlR5cGVzKHsKKyAgICAgICAgQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25TdWJUeXBlcy5UeXBlKHZhbHVlID0gQ2F0LmNsYXNzKSwKKyAgICAgICAgQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25TdWJUeXBlcy5UeXBlKHZhbHVlID0gRG9nLmNsYXNzKSB9KQorLy8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJhbmltYWwiKQorcHVibGljIGNsYXNzIEFuaW1hbCB7CisKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgQW5pbWFsKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBbmltYWwoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFuaW1hbCBvdGhlciA9IChBbmltYWwpIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLm5hbWUgPT0gbnVsbCkgPyAob3RoZXIubmFtZSAhPSBudWxsKSA6ICF0aGlzLm5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNjcgKiBoYXNoICsgKHRoaXMubmFtZSAhPSBudWxsID8gdGhpcy5uYW1lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInsgXCJuYW1lXCI6XCIlc1wifSIsIG5hbWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9BbmltYWxMaXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0FuaW1hbExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ3ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9BbmltYWxMaXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiYW5pbWFsTGlzdCIpCitwdWJsaWMgY2xhc3MgQW5pbWFsTGlzdCB7CisKKyAgICBwdWJsaWMgTGlzdDxBbmltYWw+IGFuaW1hbHM7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIEFuaW1hbExpc3QgYUxpc3QgPSBuZXcgQW5pbWFsTGlzdCgpOworICAgICAgICBhTGlzdC5hbmltYWxzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBhTGlzdC5hbmltYWxzLmFkZChuZXcgRG9nKCJGaWZpIikpOworICAgICAgICBhTGlzdC5hbmltYWxzLmFkZChuZXcgQ2F0KCJEYWlzeSIpKTsKKyAgICAgICAgcmV0dXJuIGFMaXN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQW5pbWFsTGlzdCBvdGhlciA9IChBbmltYWxMaXN0KSBvYmo7CisgICAgICAgIGlmICh0aGlzLmFuaW1hbHMgIT0gb3RoZXIuYW5pbWFscyAmJiAodGhpcy5hbmltYWxzID09IG51bGwgfHwgIXRoaXMuYW5pbWFscy5lcXVhbHMob3RoZXIuYW5pbWFscykpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gODkgKiBoYXNoICsgKHRoaXMuYW5pbWFscyAhPSBudWxsID8gdGhpcy5hbmltYWxzLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChhbmltYWxzICE9IG51bGwpID8gYW5pbWFscy50b1N0cmluZygpIDogbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQW5vdGhlckFuaW1hbC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Bbm90aGVyQW5pbWFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxYmJmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQW5vdGhlckFuaW1hbC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiYW5pbWFsIikKK3B1YmxpYyBjbGFzcyBBbm90aGVyQW5pbWFsIHsKKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBBbm90aGVyQW5pbWFsKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBbm90aGVyQW5pbWFsKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBbm90aGVyQW5pbWFsIG90aGVyID0gKEFub3RoZXJBbmltYWwpIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLm5hbWUgPT0gbnVsbCkgPyAob3RoZXIubmFtZSAhPSBudWxsKSA6ICF0aGlzLm5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNjcgKiBoYXNoICsgKHRoaXMubmFtZSAhPSBudWxsID8gdGhpcy5uYW1lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInsgXCJuYW1lXCI6XCIlc1wifSIsIG5hbWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYWE2NjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Fub3RoZXJBcnJheVRlc3RCZWFuLmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJUcmFuc2llbnQ7CitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJWaXNpYmlsaXR5OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiU2ltcGxpZmlhYmxlSWZTdGF0ZW1lbnQiLCAiU3RyaW5nRXF1YWxpdHkifSkKK0BYbWxSb290RWxlbWVudCgpCitASnNvbmJWaXNpYmlsaXR5KEN1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5LmNsYXNzKQorcHVibGljIGNsYXNzIEFub3RoZXJBcnJheVRlc3RCZWFuIHsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgQW5vdGhlckFycmF5VGVzdEJlYW4gb25lID0gbmV3IEFub3RoZXJBcnJheVRlc3RCZWFuKCk7CisgICAgICAgIEFub3RoZXJDYXQgYzEgPSBuZXcgQW5vdGhlckNhdCgiRm9vIiwgIktpdHR5Iik7CisgICAgICAgIG9uZS5hZGRDYXQoYzEpOworICAgICAgICBBbm90aGVyQ2F0IGMyID0gbmV3IEFub3RoZXJDYXQoIkJhciIsICJQdXNzIik7CisgICAgICAgIG9uZS5hZGRDYXQoYzIpOworCisgICAgICAgIG9uZS5zZXRQcm9wKCJ0ZXN0UHJvcCIpOworCisgICAgICAgIHJldHVybiBvbmU7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PEFub3RoZXJDYXQ+IGNhdHM7CisgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9wOworCisgICAgcHVibGljIEFub3RoZXJBcnJheVRlc3RCZWFuKCkgeworICAgICAgICB0aGlzLmNhdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDYXRzKExpc3Q8QW5vdGhlckNhdD4gY2F0cykgeworICAgICAgICB0aGlzLmNhdHMgPSBjYXRzOworICAgIH0KKworICAgIEBKc29uYlRyYW5zaWVudAorICAgIEBYbWxUcmFuc2llbnQKKyAgICBwdWJsaWMgTGlzdDxBbm90aGVyQ2F0PiBnZXRUaGVDYXRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jYXRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENhdChBbm90aGVyQ2F0IGMpIHsKKyAgICAgICAgdGhpcy5jYXRzLmFkZChjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3AoKSB7CisgICAgICAgIHJldHVybiBwcm9wOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3AoU3RyaW5nIHByb3ApIHsKKyAgICAgICAgdGhpcy5wcm9wID0gcHJvcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFub3RoZXJBcnJheVRlc3RCZWFuIG90aGVyID0gKEFub3RoZXJBcnJheVRlc3RCZWFuKSBvYmo7CisgICAgICAgIGlmICh0aGlzLnByb3AgIT0gb3RoZXIucHJvcCAmJiAodGhpcy5wcm9wID09IG51bGwgfHwgIXRoaXMucHJvcC5lcXVhbHMob3RoZXIucHJvcCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEpzb25UZXN0SGVscGVyLmFyZUNvbGxlY3Rpb25zRXF1YWwoY2F0cywgb3RoZXIuY2F0cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA1OworICAgICAgICBoYXNoID0gNzkgKiBoYXNoICsgKHRoaXMucHJvcCAhPSBudWxsID8gdGhpcy5wcm9wLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDc5ICogaGFzaCArICh0aGlzLmNhdHMgIT0gbnVsbCA/IHRoaXMuY2F0cy5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAobmV3IEZvcm1hdHRlcigpKS5mb3JtYXQoIkFBVEIoYT0lcywgY2Q9JXMpIiwgcHJvcCwgY2F0cykudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Fub3RoZXJDYXQuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQW5vdGhlckNhdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjYwZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Fub3RoZXJDYXQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKK0BYbWxSb290RWxlbWVudChuYW1lID0gImNhdCIpCitwdWJsaWMgY2xhc3MgQW5vdGhlckNhdCBleHRlbmRzIEFub3RoZXJBbmltYWwgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7CisKKyAgICBwdWJsaWMgQW5vdGhlckNhdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5vdGhlckNhdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5vdGhlckNhdChTdHJpbmcgbmFtZSwgU3RyaW5nIG5pY2tOYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tmlja05hbWUoU3RyaW5nIG5pY2tOYW1lKSB7CisgICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uaWNrTmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyBcImNhdFwiIDogJXMgLCAlc30iLCBzdXBlci50b1N0cmluZygpLCB0aGlzLm5pY2tOYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0F0dHJBbmRDaGFyRGF0YUJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQXR0ckFuZENoYXJEYXRhQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOWNiZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0F0dHJBbmRDaGFyRGF0YUJlYW4uamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSIsICJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAicGFyZW50IikKK3B1YmxpYyBjbGFzcyBBdHRyQW5kQ2hhckRhdGFCZWFuIHsKKworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgU3RyaW5nIGF0dHI7CisgICAgQFhtbFZhbHVlCisgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgQXR0ckFuZENoYXJEYXRhQmVhbiBpbnN0YW5jZSA9IG5ldyBBdHRyQW5kQ2hhckRhdGFCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLmF0dHIgPSAiYXZhbCI7CisgICAgICAgIGluc3RhbmNlLnZhbHVlID0gInB2YWwiOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBdHRyQW5kQ2hhckRhdGFCZWFuIG90aGVyID0gKEF0dHJBbmRDaGFyRGF0YUJlYW4pIG9iajsKKyAgICAgICAgaWYgKHRoaXMuYXR0ciAhPSBvdGhlci5hdHRyICYmICh0aGlzLmF0dHIgPT0gbnVsbCB8fCAhdGhpcy5hdHRyLmVxdWFscyhvdGhlci5hdHRyKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSBvdGhlci52YWx1ZSAmJiAodGhpcy52YWx1ZSA9PSBudWxsIHx8ICF0aGlzLnZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA1OworICAgICAgICBoYXNoID0gNzkgKiBoYXNoICsgKHRoaXMuYXR0ciAhPSBudWxsID8gdGhpcy5hdHRyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDc5ICogaGFzaCArICh0aGlzLnZhbHVlICE9IG51bGwgPyB0aGlzLnZhbHVlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRm9ybWF0dGVyKCkpLmZvcm1hdCgiQUNEKGE9JXMsIGNkPSVzKSIsIGF0dHIsIHZhbHVlKS50b1N0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9DYXQuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ2F0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2MmU4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ2F0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJjYXQiKQorcHVibGljIGNsYXNzIENhdCBleHRlbmRzIEFuaW1hbCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsKKworICAgIHB1YmxpYyBDYXQoKSB7CisgICAgfQorCisgICAgcHVibGljIENhdChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2F0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgbmlja05hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShmaW5hbCBTdHJpbmcgbmlja05hbWUpIHsKKyAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5pY2tOYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7IFwiY2F0XCIgOiAlcyAsICVzfSIsIHN1cGVyLnRvU3RyaW5nKCksIHRoaXMubmlja05hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29sb3IuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29sb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI3MmMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db2xvci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgZW51bSBDb2xvciB7CisgICAgUkVELAorICAgIEdSRUVOLAorICAgIEJMVUUKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29sb3JIb2xkZXIuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29sb3JIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWU1Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db2xvckhvbGRlci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLkpzb25UZXN0SGVscGVyOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgQ29sb3JIb2xkZXIgeworCisgICAgcHJpdmF0ZSBTZXQ8Q29sb3I+IGNvbG9yczsKKworICAgIHB1YmxpYyBDb2xvckhvbGRlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sb3JIb2xkZXIoZmluYWwgU2V0PENvbG9yPiBjb2xvcnMpIHsKKyAgICAgICAgdGhpcy5jb2xvcnMgPSBjb2xvcnM7CisgICAgfQorCisgICAgcHVibGljIFNldDxDb2xvcj4gZ2V0Q29sb3JzKCkgeworICAgICAgICByZXR1cm4gY29sb3JzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbG9ycyhmaW5hbCBTZXQ8Q29sb3I+IGNvbG9ycykgeworICAgICAgICB0aGlzLmNvbG9ycyA9IGNvbG9yczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb2xvckhvbGRlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbG9ySG9sZGVyIG90aGVyID0gKENvbG9ySG9sZGVyKSBvYmo7CisKKyAgICAgICAgcmV0dXJuIEpzb25UZXN0SGVscGVyLmFyZUNvbGxlY3Rpb25zRXF1YWwodGhpcy5jb2xvcnMsIG90aGVyLmNvbG9ycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbG9ycyA9PSBudWxsID8gc3VwZXIuaGFzaENvZGUoKSA6IDE5ICogY29sb3JzLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIoKS5mb3JtYXQoIkNIKCVzKSIsIGNvbG9ycykudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYmI0MWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJWaXNpYmlsaXR5OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSIsICJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQorQFhtbFJvb3RFbGVtZW50CitASnNvbmJWaXNpYmlsaXR5KEN1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5LmNsYXNzKQorcHVibGljIGNsYXNzIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMgeworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBTdHJpbmcgYTE7CisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBpbnQgYTI7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGxlcjE7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgTGlzdDxTaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXM+IGxpc3Q7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGxlcjI7CisgICAgQFhtbEVsZW1lbnQKKyAgICBTaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMgYjsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcyBpbnN0YW5jZSA9IG5ldyBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzKCk7CisgICAgICAgIGluc3RhbmNlLmExID0gImhlbGxvIGRvbGx5IjsKKyAgICAgICAgaW5zdGFuY2UuYTIgPSAzMTQxNTkyNjsKKyAgICAgICAgaW5zdGFuY2UuZmlsbGVyMSA9ICIxMTEiOworICAgICAgICBpbnN0YW5jZS5maWxsZXIyID0gIjIyMiI7CisgICAgICAgIGluc3RhbmNlLmIgPSBKc29uVGVzdEhlbHBlci5jcmVhdGVUZXN0SW5zdGFuY2UoU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmNsYXNzKTsKKyAgICAgICAgaW5zdGFuY2UubGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgaW5zdGFuY2UubGlzdC5hZGQoSnNvblRlc3RIZWxwZXIuY3JlYXRlVGVzdEluc3RhbmNlKFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5jbGFzcykpOworICAgICAgICBpbnN0YW5jZS5saXN0LmFkZChKc29uVGVzdEhlbHBlci5jcmVhdGVUZXN0SW5zdGFuY2UoU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmNsYXNzKSk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMgb3RoZXIgPSAoQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcykgb2JqOworICAgICAgICBpZiAodGhpcy5hMSAhPSBvdGhlci5hMSAmJiAodGhpcy5hMSA9PSBudWxsIHx8ICF0aGlzLmExLmVxdWFscyhvdGhlci5hMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYTIgIT0gb3RoZXIuYTIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5iICE9IG90aGVyLmIgJiYgKHRoaXMuYiA9PSBudWxsIHx8ICF0aGlzLmIuZXF1YWxzKG90aGVyLmIpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmZpbGxlcjEgIT0gb3RoZXIuZmlsbGVyMSAmJiAodGhpcy5maWxsZXIxID09IG51bGwgfHwgIXRoaXMuZmlsbGVyMS5lcXVhbHMob3RoZXIuZmlsbGVyMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZmlsbGVyMiAhPSBvdGhlci5maWxsZXIyICYmICh0aGlzLmZpbGxlcjIgPT0gbnVsbCB8fCAhdGhpcy5maWxsZXIyLmVxdWFscyhvdGhlci5maWxsZXIyKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5saXN0ICE9IG90aGVyLmxpc3QgJiYgKHRoaXMubGlzdCA9PSBudWxsIHx8ICF0aGlzLmxpc3QuZXF1YWxzKG90aGVyLmxpc3QpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmExICE9IG51bGwgPyB0aGlzLmExLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIHRoaXMuYTI7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5iICE9IG51bGwgPyB0aGlzLmIuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuZmlsbGVyMSAhPSBudWxsID8gdGhpcy5maWxsZXIxLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmZpbGxlcjIgIT0gbnVsbCA/IHRoaXMuZmlsbGVyMi5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5saXN0ICE9IG51bGwgPyB0aGlzLmxpc3QuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG5ldyBGb3JtYXR0ZXIoKSkuZm9ybWF0KCJDQldBKCVzLCVkLCVzKSIsIGExLCBhMiwgYikudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0N2NhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5hbm5vdGF0aW9uLkpzb25iVmlzaWJpbGl0eTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLkpzb25UZXN0SGVscGVyOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJTdHJpbmdFcXVhbGl0eSIpCitAWG1sUm9vdEVsZW1lbnQKK0BKc29uYlZpc2liaWxpdHkoQ3VzdG9tSnNvbmJWaXNpYmlsaXR5U3RyYXRlZ3kuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIgeworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBTdHJpbmcgYTE7CisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBpbnQgYTI7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGxlcjE7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgTGlzdDxTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGU+IGxpc3Q7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGxlcjI7CisgICAgQFhtbEVsZW1lbnQKKyAgICBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUgYjsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIgaW5zdGFuY2UgPSBuZXcgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIoKTsKKyAgICAgICAgaW5zdGFuY2UuYTEgPSAiaGVsbG8gZG9sbHkiOworICAgICAgICBpbnN0YW5jZS5hMiA9IDMxNDE1OTI2OworICAgICAgICBpbnN0YW5jZS5maWxsZXIxID0gIjExMSI7CisgICAgICAgIGluc3RhbmNlLmZpbGxlcjIgPSAiMjIyIjsKKyAgICAgICAgaW5zdGFuY2UuYiA9IEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuY2xhc3MpOworICAgICAgICBpbnN0YW5jZS5saXN0ID0gbmV3IExpbmtlZExpc3Q8U2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlPigpOworICAgICAgICBpbnN0YW5jZS5saXN0LmFkZChKc29uVGVzdEhlbHBlci5jcmVhdGVUZXN0SW5zdGFuY2UoU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmNsYXNzKSk7CisgICAgICAgIGluc3RhbmNlLmxpc3QuYWRkKEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuY2xhc3MpKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyIG90aGVyID0gKENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmExICE9IG90aGVyLmExICYmICh0aGlzLmExID09IG51bGwgfHwgIXRoaXMuYTEuZXF1YWxzKG90aGVyLmExKSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYTEgZGlmZmVycyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmEyICE9IG90aGVyLmEyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImEyIGRpZmZlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5iICE9IG90aGVyLmIgJiYgKHRoaXMuYiA9PSBudWxsIHx8ICF0aGlzLmIuZXF1YWxzKG90aGVyLmIpKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiIGRpZmZlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5maWxsZXIxICE9IG90aGVyLmZpbGxlcjEgJiYgKHRoaXMuZmlsbGVyMSA9PSBudWxsIHx8ICF0aGlzLmZpbGxlcjEuZXF1YWxzKG90aGVyLmZpbGxlcjEpKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmMSBkaWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZmlsbGVyMiAhPSBvdGhlci5maWxsZXIyICYmICh0aGlzLmZpbGxlcjIgPT0gbnVsbCB8fCAhdGhpcy5maWxsZXIyLmVxdWFscyhvdGhlci5maWxsZXIyKSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZjIgZGlmZmVycyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmxpc3QgIT0gb3RoZXIubGlzdCAmJiAodGhpcy5saXN0ID09IG51bGwgfHwgIXRoaXMubGlzdC5lcXVhbHMob3RoZXIubGlzdCkpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxpc3QgZGlmZmVycyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmExICE9IG51bGwgPyB0aGlzLmExLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIHRoaXMuYTI7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5iICE9IG51bGwgPyB0aGlzLmIuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuZmlsbGVyMSAhPSBudWxsID8gdGhpcy5maWxsZXIxLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmZpbGxlcjIgIT0gbnVsbCA/IHRoaXMuZmlsbGVyMi5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5saXN0ICE9IG51bGwgPyB0aGlzLmxpc3QuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQ0JXQTIoJXMsJWQsJXMsJXMpIiwgYTEsIGEyLCBiLCBsaXN0QXNTdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbGlzdEFzU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKGxpc3QgIT0gbnVsbCkgPyBsaXN0LnRvU3RyaW5nKCkgOiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2I2Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJWaXNpYmlsaXR5OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50CitASnNvbmJWaXNpYmlsaXR5KEN1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5LmNsYXNzKQorcHVibGljIGNsYXNzIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzIHsKKworICAgIEBYbWxFbGVtZW50CisgICAgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlIGIsIGM7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzIGluc3RhbmNlID0gbmV3IENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzKCk7CisgICAgICAgIGluc3RhbmNlLmIgPSBKc29uVGVzdEhlbHBlci5jcmVhdGVUZXN0SW5zdGFuY2UoU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmNsYXNzKTsKKyAgICAgICAgaW5zdGFuY2UuYyA9IEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuY2xhc3MpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMgb3RoZXIgPSAoQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMpIG9iajsKKyAgICAgICAgaWYgKHRoaXMuYiAhPSBvdGhlci5iICYmICh0aGlzLmIgPT0gbnVsbCB8fCAhdGhpcy5iLmVxdWFscyhvdGhlci5iKSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYiBkaWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYyAhPSBvdGhlci5jICYmICh0aGlzLmMgPT0gbnVsbCB8fCAhdGhpcy5jLmVxdWFscyhvdGhlci5jKSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYyBkaWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuYiAhPSBudWxsID8gdGhpcy5iLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmMgIT0gbnVsbCA/IHRoaXMuYy5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJDQldBMiglcywlcykiLCBiLCBjKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2NzRkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJWaXNpYmlsaXR5OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiU3RyaW5nRXF1YWxpdHkiLCAiUmVkdW5kYW50SWZTdGF0ZW1lbnQiLCAiTnVtYmVyRXF1YWxpdHkifSkKK0BYbWxSb290RWxlbWVudAorQEpzb25iVmlzaWJpbGl0eShDdXN0b21Kc29uYlZpc2liaWxpdHlTdHJhdGVneS5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNCB7CisKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIFN0cmluZyBhMTsKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIEludGVnZXIgYTI7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGxlcjE7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgTGlzdDxTaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXM+IGxpc3Q7CisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGxlcjI7CisgICAgQFhtbEVsZW1lbnQKKyAgICBTaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXMgYjsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQgaW5zdGFuY2UgPSBuZXcgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQoKTsKKyAgICAgICAgaW5zdGFuY2UuYiA9IG5ldyBTaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgaW5zdGFuY2UubGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0IG90aGVyID0gKENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0KSBvYmo7CisgICAgICAgIGlmICh0aGlzLmExICE9IG90aGVyLmExICYmICh0aGlzLmExID09IG51bGwgfHwgIXRoaXMuYTEuZXF1YWxzKG90aGVyLmExKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5hMiAhPSBvdGhlci5hMiAmJiAodGhpcy5hMiA9PSBudWxsIHx8ICF0aGlzLmEyLmVxdWFscyhvdGhlci5hMikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYiAhPSBvdGhlci5iICYmICh0aGlzLmIgPT0gbnVsbCB8fCAhdGhpcy5iLmVxdWFscyhvdGhlci5iKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5maWxsZXIxICE9IG90aGVyLmZpbGxlcjEgJiYgKHRoaXMuZmlsbGVyMSA9PSBudWxsIHx8ICF0aGlzLmZpbGxlcjEuZXF1YWxzKG90aGVyLmZpbGxlcjEpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmZpbGxlcjIgIT0gb3RoZXIuZmlsbGVyMiAmJiAodGhpcy5maWxsZXIyID09IG51bGwgfHwgIXRoaXMuZmlsbGVyMi5lcXVhbHMob3RoZXIuZmlsbGVyMikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFKc29uVGVzdEhlbHBlci5hcmVDb2xsZWN0aW9uc0VxdWFsKHRoaXMubGlzdCwgb3RoZXIubGlzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5hMSAhPSBudWxsID8gdGhpcy5hMS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyB0aGlzLmEyOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuYiAhPSBudWxsID8gdGhpcy5iLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmZpbGxlcjEgIT0gbnVsbCA/IHRoaXMuZmlsbGVyMS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5maWxsZXIyICE9IG51bGwgPyB0aGlzLmZpbGxlcjIuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMubGlzdCAhPSBudWxsID8gdGhpcy5saXN0Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRm9ybWF0dGVyKCkpLmZvcm1hdCgiQ0JXQTQoJXMsICVkLCAlcykiLCBhMSwgYTIsIGIpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9DdXN0b21Kc29uYlZpc2liaWxpdHlTdHJhdGVneS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9DdXN0b21Kc29uYlZpc2liaWxpdHlTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNjUzMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0N1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuY29uZmlnLlByb3BlcnR5VmlzaWJpbGl0eVN0cmF0ZWd5OworCisvKioKKyAqIEN1c3RvbSwgcGVybWlzc2l2ZSB7QGxpbmsgUHJvcGVydHlWaXNpYmlsaXR5U3RyYXRlZ3l9LgorICogPHA+CisgKiBVc2VkIHRvIGFsbG93IEpTT04tQiBwcm92aWRlciB0byAic2VlIiBwcm90ZWN0ZWQvcHJpdmF0ZSBmaWVsZHMgZm9yIHRlc3QgcHVycG9zZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21Kc29uYlZpc2liaWxpdHlTdHJhdGVneSBpbXBsZW1lbnRzIFByb3BlcnR5VmlzaWJpbGl0eVN0cmF0ZWd5IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZShGaWVsZCBmaWVsZCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoTWV0aG9kIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0RvZy5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Eb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGUyNjMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Eb2cuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKK0BYbWxSb290RWxlbWVudChuYW1lID0gImRvZyIpCitwdWJsaWMgY2xhc3MgRG9nIGV4dGVuZHMgQW5pbWFsIHsKKworICAgIHB1YmxpYyBEb2coKSB7CisgICAgfQorCisgICAgcHVibGljIERvZyhmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyBcImRvZ1wiIDogJXMgfSIsIHN1cGVyLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRW1wdHlFbGVtZW50QmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9FbXB0eUVsZW1lbnRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjMjFlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRW1wdHlFbGVtZW50QmVhbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgRW1wdHlFbGVtZW50QmVhbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nIG51bGxPbmx5ID0gbnVsbDsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgRW1wdHlFbGVtZW50QmVhbiByZXN1bHQgPSBuZXcgRW1wdHlFbGVtZW50QmVhbigpOworICAgICAgICByZXN1bHQubnVsbE9ubHkgPSBudWxsOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBFbXB0eUVsZW1lbnRCZWFuIG90aGVyID0gKEVtcHR5RWxlbWVudEJlYW4pIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLm51bGxPbmx5ID09IG51bGwpID8gKG90aGVyLm51bGxPbmx5ICE9IG51bGwpIDogIXRoaXMubnVsbE9ubHkuZXF1YWxzKG90aGVyLm51bGxPbmx5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMzsKKyAgICAgICAgaGFzaCA9IDEzICogaGFzaCArICh0aGlzLm51bGxPbmx5ICE9IG51bGwgPyB0aGlzLm51bGxPbmx5Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIntudWxsT25seTolc30iLCBudWxsT25seSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwYzI4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIEVtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuIHsKKworICAgIHB1YmxpYyBFbXB0eUVsZW1lbnRCZWFuIGVtcHR5QmVhbjsKKyAgICBwdWJsaWMgU3RyaW5nIGM7CisgICAgcHVibGljIFN0cmluZyBkOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBFbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbiByZXN1bHQgPSBuZXcgRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4oKTsKKyAgICAgICAgcmVzdWx0LmMgPSAiZm9vIjsKKyAgICAgICAgcmVzdWx0LmQgPSAiYmFyIjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEVtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuIG90aGVyID0gKEVtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmVtcHR5QmVhbiAhPSBvdGhlci5lbXB0eUJlYW4gJiYgKHRoaXMuZW1wdHlCZWFuID09IG51bGwgfHwgIXRoaXMuZW1wdHlCZWFuLmVxdWFscyhvdGhlci5lbXB0eUJlYW4pKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgodGhpcy5jID09IG51bGwpID8gKG90aGVyLmMgIT0gbnVsbCkgOiAhdGhpcy5jLmVxdWFscyhvdGhlci5jKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgodGhpcy5kID09IG51bGwpID8gKG90aGVyLmQgIT0gbnVsbCkgOiAhdGhpcy5kLmVxdWFscyhvdGhlci5kKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMzsKKyAgICAgICAgaGFzaCA9IDU5ICogaGFzaCArICh0aGlzLmVtcHR5QmVhbiAhPSBudWxsID8gdGhpcy5lbXB0eUJlYW4uaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gNTkgKiBoYXNoICsgKHRoaXMuYyAhPSBudWxsID8gdGhpcy5jLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDU5ICogaGFzaCArICh0aGlzLmQgIT0gbnVsbCA/IHRoaXMuZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7YzolcyxkOiVzfSIsIGMsIGQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9FbmNvZGVkQ29udGVudEJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRW5jb2RlZENvbnRlbnRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmZWVlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRW5jb2RlZENvbnRlbnRCZWFuLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiUmVkdW5kYW50SWZTdGF0ZW1lbnQiLCAiU3RyaW5nRXF1YWxpdHkifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIEVuY29kZWRDb250ZW50QmVhbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nIG9uZTsKKyAgICBwdWJsaWMgU3RyaW5nIHR3bzsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgRW5jb2RlZENvbnRlbnRCZWFuIGluc3RhbmNlID0gbmV3IEVuY29kZWRDb250ZW50QmVhbigpOworICAgICAgICBpbnN0YW5jZS5vbmUgPSAiXHRvbmVcblx0YmlnIjsKKyAgICAgICAgaW5zdGFuY2UudHdvID0gImhhZlx1MDEwQyI7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEVuY29kZWRDb250ZW50QmVhbiBvdGhlciA9IChFbmNvZGVkQ29udGVudEJlYW4pIG9iajsKKyAgICAgICAgaWYgKHRoaXMub25lICE9IG90aGVyLm9uZSAmJiAodGhpcy5vbmUgPT0gbnVsbCB8fCAhdGhpcy5vbmUuZXF1YWxzKG90aGVyLm9uZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudHdvICE9IG90aGVyLnR3byAmJiAodGhpcy50d28gPT0gbnVsbCB8fCAhdGhpcy50d28uZXF1YWxzKG90aGVyLnR3bykpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA1OworICAgICAgICBoYXNoID0gMTcgKiBoYXNoICsgKHRoaXMub25lICE9IG51bGwgPyB0aGlzLm9uZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyAodGhpcy50d28gIT0gbnVsbCA/IHRoaXMudHdvLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkVDQiglcywgJXMpIiwgb25lLCB0d28pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9GYWtlQXJyYXlCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Zha2VBcnJheUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDJjOWQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9GYWtlQXJyYXlCZWFuLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5hbm5vdGF0aW9uLkpzb25iVmlzaWJpbGl0eTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisvKioKKyAqIFRlc3QgY2FzZSBmb3IgaXNzdWUjMzEwLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiUmVkdW5kYW50SWZTdGF0ZW1lbnQiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0geworICAgICAgICAid2VpZ2h0IiwgImNvbG9yIiwgIm5hbWUiCit9KQorQFhtbFJvb3RFbGVtZW50KCkKK0BKc29uYlZpc2liaWxpdHkoQ3VzdG9tSnNvbmJWaXNpYmlsaXR5U3RyYXRlZ3kuY2xhc3MpCitwdWJsaWMgY2xhc3MgRmFrZUFycmF5QmVhbiB7CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHdlaWdodDsKKyAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUpCisgICAgcHJvdGVjdGVkIFN0cmluZyBjb2xvcjsKKyAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUpCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRXZWlnaHQoKSB7CisgICAgICAgIGlmICh3ZWlnaHQgPT0gbnVsbCkgeworICAgICAgICAgICAgd2VpZ2h0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMud2VpZ2h0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7CisgICAgICAgIHJldHVybiBjb2xvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5jb2xvciA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBGYWtlQXJyYXlCZWFuIHJlc3VsdCA9IG5ldyBGYWtlQXJyYXlCZWFuKCk7CisKKyAgICAgICAgcmVzdWx0LmdldFdlaWdodCgpLmFkZCgiMWtnIik7CisgICAgICAgIHJlc3VsdC5nZXRXZWlnaHQoKS5hZGQoIjJrZyIpOworICAgICAgICByZXN1bHQuc2V0Q29sb3IoInJlZCIpOworICAgICAgICByZXN1bHQuc2V0TmFtZSgiYnVtcGVyIik7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEZha2VBcnJheUJlYW4gb3RoZXIgPSAoRmFrZUFycmF5QmVhbikgb2JqOworICAgICAgICBpZiAodGhpcy53ZWlnaHQgIT0gb3RoZXIud2VpZ2h0ICYmICh0aGlzLndlaWdodCA9PSBudWxsIHx8ICF0aGlzLndlaWdodC5lcXVhbHMob3RoZXIud2VpZ2h0KSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRoaXMuY29sb3IgPT0gbnVsbCkgPyAob3RoZXIuY29sb3IgIT0gbnVsbCkgOiAhdGhpcy5jb2xvci5lcXVhbHMob3RoZXIuY29sb3IpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLm5hbWUgPT0gbnVsbCkgPyAob3RoZXIubmFtZSAhPSBudWxsKSA6ICF0aGlzLm5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMjkgKiBoYXNoICsgKHRoaXMud2VpZ2h0ICE9IG51bGwgPyB0aGlzLndlaWdodC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAyOSAqIGhhc2ggKyAodGhpcy5jb2xvciAhPSBudWxsID8gdGhpcy5jb2xvci5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAyOSAqIGhhc2ggKyAodGhpcy5uYW1lICE9IG51bGwgPyB0aGlzLm5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie25hbWU6JXMsIGNvbG9yOiVzLCB3ZWlnaHRzOiVzfSIsIG5hbWUsIGNvbG9yLCB3ZWlnaHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSW50QXJyYXkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSW50QXJyYXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI4NjVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9JbnRBcnJheS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxSb290RWxlbWVudChuYW1lID0gImludEFycmF5IikKK3B1YmxpYyBjbGFzcyBJbnRBcnJheSB7CisKKyAgICBwdWJsaWMgaW50W10gaW50QXJyYXk7CisKKyAgICBwdWJsaWMgSW50ZWdlcltdIGludGVnZXJBcnJheTsKKworICAgIHB1YmxpYyBpbnQgbnVtYmVyOworCisgICAgcHVibGljIEludEFycmF5KCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgSW50QXJyYXkgb3RoZXIgPSAoSW50QXJyYXkpIG9iajsKKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHRoaXMuaW50QXJyYXksIG90aGVyLmludEFycmF5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghQXJyYXlzLmRlZXBFcXVhbHModGhpcy5pbnRlZ2VyQXJyYXksIG90aGVyLmludGVnZXJBcnJheSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5udW1iZXIgIT0gb3RoZXIubnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gODkgKiBoYXNoICsgQXJyYXlzLmhhc2hDb2RlKHRoaXMuaW50QXJyYXkpOworICAgICAgICBoYXNoID0gODkgKiBoYXNoICsgQXJyYXlzLmRlZXBIYXNoQ29kZSh0aGlzLmludGVnZXJBcnJheSk7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyB0aGlzLm51bWJlcjsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInsgXCJpbnRBcnJheVwiOiVzLCBcImludGVnZXJBcnJheVwiOiVzLCBcIm51bWJlclwiOiVkfSIsIEFycmF5cy50b1N0cmluZyhpbnRBcnJheSksCisgICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGludGVnZXJBcnJheSksIG51bWJlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBJbnRBcnJheSByZXN1bHQgPSBuZXcgSW50QXJyYXkoKTsKKworICAgICAgICByZXN1bHQubnVtYmVyID0gODsKKyAgICAgICAgcmVzdWx0LmludEFycmF5ID0gbmV3IGludFtdezR9OworICAgICAgICByZXN1bHQuaW50ZWdlckFycmF5ID0gbmV3IEludGVnZXJbXXszfTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXJzZXkxMTk5TGlzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXJzZXkxMTk5TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOTM2MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0plcnNleTExOTlMaXN0LmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJUeXBlQWRhcHRlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSmVyc2V5MTE5OVRlc3Q7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiTnVtYmVyRXF1YWxpdHkiLCAiU2ltcGxpZmlhYmxlSWZTdGF0ZW1lbnQifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIEplcnNleTExOTlMaXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgZmluYWwgQ29sb3JIb2xkZXIgb2JqMSA9IG5ldyBDb2xvckhvbGRlcihFbnVtU2V0Lm9mKENvbG9yLlJFRCwgQ29sb3IuQkxVRSkpOworICAgICAgICBmaW5hbCBDb2xvckhvbGRlciBvYmoyID0gbmV3IENvbG9ySG9sZGVyKEVudW1TZXQub2YoQ29sb3IuR1JFRU4pKTsKKworICAgICAgICByZXR1cm4gbmV3IEplcnNleTExOTlMaXN0KG5ldyBPYmplY3RbXXtvYmoxLCBvYmoyfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3RbXSBvYmplY3RzOworICAgIHByaXZhdGUgSW50ZWdlciBvZmZzZXQ7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIHRvdGFsOworCisgICAgcHVibGljIEplcnNleTExOTlMaXN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBKZXJzZXkxMTk5TGlzdChmaW5hbCBPYmplY3RbXSBvYmplY3RzKSB7CisgICAgICAgIHRoaXMub2JqZWN0cyA9IG9iamVjdHM7CisgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKKyAgICAgICAgdGhpcy50b3RhbCA9IG9iamVjdHMubGVuZ3RoOworICAgIH0KKworICAgIC8vIEphY2tzb24gMQorICAgIEBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uVHlwZUluZm8oCisgICAgICAgICAgICB1c2UgPSBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uVHlwZUluZm8uSWQuTkFNRSwKKyAgICAgICAgICAgIGluY2x1ZGUgPSBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uVHlwZUluZm8uQXMuUFJPUEVSVFkpCisgICAgQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25TdWJUeXBlcyh7CisgICAgICAgICAgICBAb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblN1YlR5cGVzLlR5cGUodmFsdWUgPSBDb2xvckhvbGRlci5jbGFzcykKKyAgICB9KQorICAgIC8vIEphY2tzb24gMgorICAgIEBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uVHlwZUluZm8oCisgICAgICAgICAgICB1c2UgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uVHlwZUluZm8uSWQuTkFNRSwKKyAgICAgICAgICAgIGluY2x1ZGUgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uVHlwZUluZm8uQXMuUFJPUEVSVFkpCisgICAgQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25TdWJUeXBlcyh7CisgICAgICAgICAgICBAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblN1YlR5cGVzLlR5cGUodmFsdWUgPSBDb2xvckhvbGRlci5jbGFzcykKKyAgICB9KQorICAgIC8vIEpTT04tQgorICAgIEBKc29uYlR5cGVBZGFwdGVyKEplcnNleTExOTlUZXN0Lkpzb25iT2JqZWN0VG9Db2xvckhvbGRlckFkYXB0ZXIuY2xhc3MpCisgICAgcHVibGljIE9iamVjdFtdIGdldE9iamVjdHMoKSB7CisgICAgICAgIHJldHVybiBvYmplY3RzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9iamVjdHMoZmluYWwgT2JqZWN0W10gb2JqZWN0cykgeworICAgICAgICB0aGlzLm9iamVjdHMgPSBvYmplY3RzOworICAgIH0KKworICAgIHB1YmxpYyBJbnRlZ2VyIGdldE9mZnNldCgpIHsKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRPZmZzZXQoZmluYWwgSW50ZWdlciBvZmZzZXQpIHsKKyAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgZ2V0VG90YWwoKSB7CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbChmaW5hbCBJbnRlZ2VyIHRvdGFsKSB7CisgICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBKZXJzZXkxMTk5TGlzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEplcnNleTExOTlMaXN0IG90aGVyID0gKEplcnNleTExOTlMaXN0KSBvYmo7CisKKyAgICAgICAgaWYgKHRoaXMudG90YWwgIT0gb3RoZXIudG90YWwgJiYgKHRoaXMudG90YWwgPT0gbnVsbCB8fCAhdGhpcy50b3RhbC5lcXVhbHMob3RoZXIudG90YWwpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLm9mZnNldCAhPSBvdGhlci5vZmZzZXQgJiYgKHRoaXMub2Zmc2V0ID09IG51bGwgfHwgIXRoaXMub2Zmc2V0LmVxdWFscyhvdGhlci5vZmZzZXQpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHModGhpcy5vYmplY3RzLCBvdGhlci5vYmplY3RzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlcigpLmZvcm1hdCgiSmVyc2V5MTE5OUxpc3QoJXMsICVkLCAlZCkiLCBBcnJheXMudG9TdHJpbmcob2JqZWN0cyksIG9mZnNldCwgdG90YWwpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA0MzsKKyAgICAgICAgaGFzaCArPSAob2Zmc2V0ICE9IG51bGwgPyAxNyAqIG9mZnNldCA6IDApOworICAgICAgICBoYXNoICs9ICh0b3RhbCAhPSBudWxsID8gMTcgKiB0b3RhbCA6IDApOworICAgICAgICBoYXNoICs9IEFycmF5cy5oYXNoQ29kZShvYmplY3RzKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9MaXN0QW5kTm9uTGlzdEJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTGlzdEFuZE5vbkxpc3RCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0ZmJjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTGlzdEFuZE5vbkxpc3RCZWFuLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCIsICJTdHJpbmdFcXVhbGl0eSJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgTGlzdEFuZE5vbkxpc3RCZWFuIHsKKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gYTsKKyAgICBwdWJsaWMgU3RyaW5nIGQ7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIExpc3RBbmROb25MaXN0QmVhbiBpbnN0YW5jZSA9IG5ldyBMaXN0QW5kTm9uTGlzdEJlYW4oKTsKKyAgICAgICAgaW5zdGFuY2UuYSA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgaW5zdGFuY2UuYS5hZGQoIjEiKTsKKyAgICAgICAgaW5zdGFuY2UuZCA9ICIyIjsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTGlzdEFuZE5vbkxpc3RCZWFuIG90aGVyID0gKExpc3RBbmROb25MaXN0QmVhbikgb2JqOworICAgICAgICBpZiAodGhpcy5hICE9IG90aGVyLmEgJiYgKHRoaXMuYSA9PSBudWxsIHx8ICF0aGlzLmEuZXF1YWxzKG90aGVyLmEpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmQgIT0gb3RoZXIuZCAmJiAodGhpcy5kID09IG51bGwgfHwgIXRoaXMuZC5lcXVhbHMob3RoZXIuZCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNDcgKiBoYXNoICsgKHRoaXMuYSAhPSBudWxsID8gdGhpcy5hLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDQ3ICogaGFzaCArICh0aGlzLmQgIT0gbnVsbCA/IHRoaXMuZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9MaXN0RW1wdHlCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0xpc3RFbXB0eUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmY2MTNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9MaXN0RW1wdHlCZWFuLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLkpzb25UZXN0SGVscGVyOworCisvKioKKyAqIEBhdXRob3IgbWNoZW5yeWMKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAibGlzdEVtcHR5QmVhbiIpCitwdWJsaWMgY2xhc3MgTGlzdEVtcHR5QmVhbiB7CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBlbXB0eTsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgTGlzdEVtcHR5QmVhbiBpbnN0YW5jZSA9IG5ldyBMaXN0RW1wdHlCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLmVtcHR5ID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVtcHR5KExpc3Q8U3RyaW5nPiBlbXB0eSkgeworICAgICAgICB0aGlzLmVtcHR5ID0gZW1wdHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBMaXN0RW1wdHlCZWFuIG90aGVyID0gKExpc3RFbXB0eUJlYW4pIG9iajsKKyAgICAgICAgcmV0dXJuIHRoaXMuZW1wdHkgPT0gb3RoZXIuZW1wdHkKKyAgICAgICAgICAgICAgICB8fCAoSnNvblRlc3RIZWxwZXIuaXNDb2xsZWN0aW9uRW1wdHkodGhpcy5lbXB0eSkgJiYgSnNvblRlc3RIZWxwZXIuaXNDb2xsZWN0aW9uRW1wdHkob3RoZXIuZW1wdHkpKQorICAgICAgICAgICAgICAgIHx8ICh0aGlzLmVtcHR5ICE9IG51bGwgJiYgdGhpcy5lbXB0eS5lcXVhbHMob3RoZXIuZW1wdHkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKyAodGhpcy5lbXB0eSAhPSBudWxsID8gdGhpcy5lbXB0eS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAobmV3IEZvcm1hdHRlcigpKS5mb3JtYXQoIkx3TkIobj0lZCxpc051bGw6JXMpIiwgKGVtcHR5ICE9IG51bGwpID8gZW1wdHkuc2l6ZSgpIDogMCwgKGVtcHR5ID09IG51bGwpKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTGlzdFdyYXBwZXJCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0xpc3RXcmFwcGVyQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYmQyNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0xpc3RXcmFwcGVyQmVhbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxSb290RWxlbWVudChuYW1lID0gIml0ZW0iKQorcHVibGljIGNsYXNzIExpc3RXcmFwcGVyQmVhbiB7CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHByb3BlcnR5OworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IExpc3RXcmFwcGVyQmVhbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTGlzdFdyYXBwZXJCZWFuIG90aGVyID0gKExpc3RXcmFwcGVyQmVhbikgb2JqOworICAgICAgICBpZiAoKHRoaXMucHJvcGVydHkgIT0gb3RoZXIucHJvcGVydHkKKyAgICAgICAgICAgICAgICAmJiBKc29uVGVzdEhlbHBlci5pc0NvbGxlY3Rpb25FbXB0eSh0aGlzLnByb3BlcnR5KSAhPSBKc29uVGVzdEhlbHBlci5pc0NvbGxlY3Rpb25FbXB0eShvdGhlci5wcm9wZXJ0eSkpCisgICAgICAgICAgICAgICAgJiYgKHRoaXMucHJvcGVydHkgPT0gbnVsbCB8fCAhdGhpcy5wcm9wZXJ0eS5lcXVhbHMob3RoZXIucHJvcGVydHkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDIzICogaGFzaCArICh0aGlzLnByb3BlcnR5ICE9IG51bGwgPyB0aGlzLnByb3BlcnR5Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9NeUVycm9yLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L015RXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmFiODZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9NeUVycm9yLmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworLyoqCisgKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgorICogPHAvPgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqIDxwLz4KKyAqIDxwcmU+CisgKiAmbHQ7Y29tcGxleFR5cGU+CisgKiAgICZsdDtjb21wbGV4Q29udGVudD4KKyAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgorICogICAgICAgJmx0O3NlcXVlbmNlPgorICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPgorICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkZXNjIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+CisgKiAgICAgICAmbHQ7L3NlcXVlbmNlPgorICogICAgICZsdDsvcmVzdHJpY3Rpb24+CisgKiAgICZsdDsvY29tcGxleENvbnRlbnQ+CisgKiAmbHQ7L2NvbXBsZXhUeXBlPgorICogPC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0geworICAgICAgICAiaWQiLCAiZGVzYyIKK30pCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJteUVycm9yIikKK3B1YmxpYyBjbGFzcyBNeUVycm9yIHsKKworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlkOworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGRlc2M7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcworICAgICAqIHtAbGluayBTdHJpbmcgfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmlkID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlc2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjKCkgeworICAgICAgICByZXR1cm4gZGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcworICAgICAqIHtAbGluayBTdHJpbmcgfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMuZGVzYyA9IHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTXlFcnJvciBvdGhlciA9IChNeUVycm9yKSBvYmo7CisgICAgICAgIGlmICgodGhpcy5pZCA9PSBudWxsKSA/IChvdGhlci5pZCAhPSBudWxsKSA6ICF0aGlzLmlkLmVxdWFscyhvdGhlci5pZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRoaXMuZGVzYyA9PSBudWxsKSA/IChvdGhlci5kZXNjICE9IG51bGwpIDogIXRoaXMuZGVzYy5lcXVhbHMob3RoZXIuZGVzYykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5pZCAhPSBudWxsID8gdGhpcy5pZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5kZXNjICE9IG51bGwgPyB0aGlzLmRlc2MuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCJ7Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRJZCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgIHNiLmFwcGVuZChnZXREZXNjKCkpOworICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L015TWVzc2FnZS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9NeU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjNiNzYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9NeU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKiA8cC8+CisgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgorICogPHAvPgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9InRleHQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4KKyAqICAgICAgICZsdDsvc2VxdWVuY2U+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7CisgICAgICAgICJpZCIsICJ0ZXh0IgorfSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gIm15TWVzc2FnZSIpCitwdWJsaWMgY2xhc3MgTXlNZXNzYWdlIHsKKworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlkOworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcworICAgICAqIHtAbGluayBTdHJpbmcgfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmlkID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHRleHQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcworICAgICAqIHtAbGluayBTdHJpbmcgfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudGV4dCA9IHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTXlNZXNzYWdlIG90aGVyID0gKE15TWVzc2FnZSkgb2JqOworICAgICAgICBpZiAoKHRoaXMuaWQgPT0gbnVsbCkgPyAob3RoZXIuaWQgIT0gbnVsbCkgOiAhdGhpcy5pZC5lcXVhbHMob3RoZXIuaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLnRleHQgPT0gbnVsbCkgPyAob3RoZXIudGV4dCAhPSBudWxsKSA6ICF0aGlzLnRleHQuZXF1YWxzKG90aGVyLnRleHQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gNDcgKiBoYXNoICsgKHRoaXMuaWQgIT0gbnVsbCA/IHRoaXMuaWQuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gNDcgKiBoYXNoICsgKHRoaXMudGV4dCAhPSBudWxsID8gdGhpcy50ZXh0Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgieyIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0SWQoKSk7CisgICAgICAgIHNiLmFwcGVuZCgnLCcpOworICAgICAgICBzYi5hcHBlbmQoZ2V0VGV4dCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCd9Jyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTXlSZXNwb25zZS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9NeVJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmNTNkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTXlSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlZpc2liaWxpdHk7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworLyoqCisgKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgorICogPHAvPgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqIDxwLz4KKyAqIDxwcmU+CisgKiAmbHQ7Y29tcGxleFR5cGU+CisgKiAgICZsdDtjb21wbGV4Q29udGVudD4KKyAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgorICogICAgICAgJmx0O3NlcXVlbmNlPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vdGVzdC5qYXhiLmNvbX1teU1lc3NhZ2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3Rlc3QuamF4Yi5jb219bXlFcnJvciIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgorICogJmx0Oy9jb21wbGV4VHlwZT4KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgIm15TWVzc2FnZSIsICJteUVycm9yIgorfSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gIm15UmVzcG9uc2UiKQorQEpzb25iVmlzaWJpbGl0eShDdXN0b21Kc29uYlZpc2liaWxpdHlTdHJhdGVneS5jbGFzcykKK3B1YmxpYyBjbGFzcyBNeVJlc3BvbnNlIHsKKworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vdGVzdC5qYXhiLmNvbSIpCisgICAgcHJvdGVjdGVkIExpc3Q8TXlNZXNzYWdlPiBteU1lc3NhZ2U7CisgICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly90ZXN0LmpheGIuY29tIiwgcmVxdWlyZWQgPSB0cnVlKQorICAgIHByb3RlY3RlZCBNeUVycm9yIG15RXJyb3I7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbXlNZXNzYWdlIHByb3BlcnR5LgorICAgICAqIDxwLz4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgbXlNZXNzYWdlIHByb3BlcnR5LgorICAgICAqIDxwLz4KKyAgICAgKiA8cC8+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0TXlNZXNzYWdlKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqIDxwLz4KKyAgICAgKiA8cC8+CisgICAgICogPHAvPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIE15TWVzc2FnZSB9CisgICAgICovCisgICAgcHVibGljIExpc3Q8TXlNZXNzYWdlPiBnZXRNeU1lc3NhZ2UoKSB7CisgICAgICAgIGlmIChteU1lc3NhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbXlNZXNzYWdlID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMubXlNZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBteUVycm9yIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybiBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAgICAgIHtAbGluayBNeUVycm9yIH0KKyAgICAgKi8KKyAgICBwdWJsaWMgTXlFcnJvciBnZXRNeUVycm9yKCkgeworICAgICAgICByZXR1cm4gbXlFcnJvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbXlFcnJvciBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBhbGxvd2VkIG9iamVjdCBpcworICAgICAqIHtAbGluayBNeUVycm9yIH0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNeUVycm9yKE15RXJyb3IgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5teUVycm9yID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworCisgICAgICAgIE15UmVzcG9uc2UgbXlSZXNwb25zZSA9IG5ldyBNeVJlc3BvbnNlKCk7CisKKyAgICAgICAgTXlNZXNzYWdlIG1zZyA9IG5ldyBNeU1lc3NhZ2UoKTsKKyAgICAgICAgbXNnLnNldElkKCIwIik7CisgICAgICAgIG1zZy5zZXRUZXh0KCJvayIpOworICAgICAgICBNeU1lc3NhZ2UgbXNnMiA9IG5ldyBNeU1lc3NhZ2UoKTsKKyAgICAgICAgbXNnMi5zZXRJZCgiMSIpOworICAgICAgICBtc2cyLnNldFRleHQoIm9rIik7CisgICAgICAgIG15UmVzcG9uc2UuZ2V0TXlNZXNzYWdlKCkuYWRkKG1zZyk7CisgICAgICAgIG15UmVzcG9uc2UuZ2V0TXlNZXNzYWdlKCkuYWRkKG1zZzIpOworCisgICAgICAgIE15RXJyb3IgZXJyID0gbmV3IE15RXJyb3IoKTsKKyAgICAgICAgZXJyLnNldElkKCItMSIpOworICAgICAgICBlcnIuc2V0RGVzYygiZXJyb3IiKTsKKyAgICAgICAgbXlSZXNwb25zZS5zZXRNeUVycm9yKGVycik7CisgICAgICAgIHJldHVybiBteVJlc3BvbnNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTXlSZXNwb25zZSBvdGhlciA9IChNeVJlc3BvbnNlKSBvYmo7CisgICAgICAgIGlmICh0aGlzLm15TWVzc2FnZSAhPSBvdGhlci5teU1lc3NhZ2UgJiYgKHRoaXMubXlNZXNzYWdlID09IG51bGwgfHwgIXRoaXMubXlNZXNzYWdlLmVxdWFscyhvdGhlci5teU1lc3NhZ2UpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLm15RXJyb3IgIT0gb3RoZXIubXlFcnJvciAmJiAodGhpcy5teUVycm9yID09IG51bGwgfHwgIXRoaXMubXlFcnJvci5lcXVhbHMob3RoZXIubXlFcnJvcikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gOTcgKiBoYXNoICsgKHRoaXMubXlNZXNzYWdlICE9IG51bGwgPyB0aGlzLm15TWVzc2FnZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSA5NyAqIGhhc2ggKyAodGhpcy5teUVycm9yICE9IG51bGwgPyB0aGlzLm15RXJyb3IuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCJ7Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRNeU1lc3NhZ2UoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCIpOworICAgICAgICBzYi5hcHBlbmQoZ2V0TXlFcnJvcigpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJ9Iik7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTmFtZXNwYWNlQmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9OYW1lc3BhY2VCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYjJjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTmFtZXNwYWNlQmVhbi5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworCitAU3VwcHJlc3NXYXJuaW5ncyh7IlJlZHVuZGFudElmU3RhdGVtZW50IiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBOYW1lc3BhY2VCZWFuIHsKKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIFN0cmluZyBhOworCisgICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgcHVibGljIFN0cmluZyBiOworCisgICAgcHVibGljIE5hbWVzcGFjZUJlYW4oKSB7CisgICAgfQorCisgICAgcHVibGljIE5hbWVzcGFjZUJlYW4oU3RyaW5nIGEsIFN0cmluZyBiKSB7CisgICAgICAgIHRoaXMuYSA9IGE7CisgICAgICAgIHRoaXMuYiA9IGI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBOYW1lc3BhY2VCZWFuIG90aGVyID0gKE5hbWVzcGFjZUJlYW4pIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLmEgPT0gbnVsbCkgPyAob3RoZXIuYSAhPSBudWxsKSA6ICF0aGlzLmEuZXF1YWxzKG90aGVyLmEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLmIgPT0gbnVsbCkgPyAob3RoZXIuYiAhPSBudWxsKSA6ICF0aGlzLmIuZXF1YWxzKG90aGVyLmIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMzcgKiBoYXNoICsgKHRoaXMuYSAhPSBudWxsID8gdGhpcy5hLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDM3ICogaGFzaCArICh0aGlzLmIgIT0gbnVsbCA/IHRoaXMuYi5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1lc3BhY2VCZWFuKCJmb28iLCAiYmFyIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInthOiVzLCBiOiVzIiwgYSwgYik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyNTRmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiUmVkdW5kYW50SWZTdGF0ZW1lbnQifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIE5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlIHsKKworICAgIEBYbWxBdHRyaWJ1dGUobmFtZXNwYWNlID0gImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgcHVibGljIFN0cmluZyBhdHRyOworCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGE7CisKKyAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgICBwdWJsaWMgU3RyaW5nIGI7CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUoKSB7CisgICAgfQorCisgICAgcHVibGljIE5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlKFN0cmluZyBhdHRyLCBTdHJpbmcgYSwgU3RyaW5nIGIpIHsKKyAgICAgICAgdGhpcy5hdHRyID0gYXR0cjsKKyAgICAgICAgdGhpcy5hID0gYTsKKyAgICAgICAgdGhpcy5iID0gYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlIG90aGVyID0gKE5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlKSBvYmo7CisgICAgICAgIGlmICgodGhpcy5hdHRyID09IG51bGwpID8gKG90aGVyLmF0dHIgIT0gbnVsbCkgOiAhdGhpcy5hdHRyLmVxdWFscyhvdGhlci5hdHRyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgodGhpcy5hID09IG51bGwpID8gKG90aGVyLmEgIT0gbnVsbCkgOiAhdGhpcy5hLmVxdWFscyhvdGhlci5hKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgodGhpcy5iID09IG51bGwpID8gKG90aGVyLmIgIT0gbnVsbCkgOiAhdGhpcy5iLmVxdWFscyhvdGhlci5iKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDM3ICogaGFzaCArICh0aGlzLmF0dHIgIT0gbnVsbCA/IHRoaXMuYXR0ci5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAzNyAqIGhhc2ggKyAodGhpcy5hICE9IG51bGwgPyB0aGlzLmEuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMzcgKiBoYXNoICsgKHRoaXMuYiAhPSBudWxsID8gdGhpcy5iLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IE5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlKCJ2YWx1ZSIsICJmb28iLCAiYmFyIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInthdHRyOiVzLCBhOiVzLCBiOiVzIiwgYXR0ciwgYSwgYik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L051bGxTdHJpbmdCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L051bGxTdHJpbmdCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4NTVkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTnVsbFN0cmluZ0JlYW4uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBOdWxsU3RyaW5nQmVhbiB7CisKKyAgICBAWG1sRWxlbWVudChuaWxsYWJsZSA9IHRydWUpCisgICAgcHVibGljIFN0cmluZyBudWxsU3RyaW5nID0gIm5vdCBudWxsIHRvIHRlc3QgaWYgc2V0IHRvIG51bGwgd29ya3MiOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IE51bGxTdHJpbmdCZWFuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBOdWxsU3RyaW5nQmVhbiBvdGhlciA9IChOdWxsU3RyaW5nQmVhbikgb2JqOworICAgICAgICBpZiAoKHRoaXMubnVsbFN0cmluZyA9PSBudWxsKSA/IChvdGhlci5udWxsU3RyaW5nICE9IG51bGwpIDogIXRoaXMubnVsbFN0cmluZy5lcXVhbHMob3RoZXIubnVsbFN0cmluZykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5udWxsU3RyaW5nICE9IG51bGwgPyB0aGlzLm51bGxTdHJpbmcuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie251bGxTdHJpbmc6JXN9IiwgcXVvdGVEZWxpbWl0ZWRTdHJpbmdPck51bGwobnVsbFN0cmluZykpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHF1b3RlRGVsaW1pdGVkU3RyaW5nT3JOdWxsKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIChzdHJpbmcgPT0gbnVsbCkgPyAibnVsbCIgOiBTdHJpbmcuZm9ybWF0KCJcIiVzXCIiLCBzdHJpbmcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvUGVyc29uLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Nzg4NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1BlcnNvbi5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFdyYXBwZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5Kc29uVGVzdEhlbHBlcjsKKworLyoqCisgKiBAYXV0aG9yIEpheSBGZWVuYW4gKGpheS5mZWVuYW4gYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAicGVyc29uIikKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkKK0BYbWxUeXBlKHByb3BPcmRlciA9IHsibmFtZSIsICJjaGlsZHJlbiJ9KQorcHVibGljIGNsYXNzIFBlcnNvbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFBlcnNvbiBkYXVnaHRlciA9IG5ldyBQZXJzb24oKTsKKyAgICAgICAgZGF1Z2h0ZXIuc2V0TmFtZSgiSmlsbCBTY2htbyIpOworCisgICAgICAgIFBlcnNvbiBzb24gPSBuZXcgUGVyc29uKCk7CisgICAgICAgIHNvbi5zZXROYW1lKCJKYWNrIFNjaG1vIik7CisKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9IG5ldyBQZXJzb24oKTsKKyAgICAgICAgcGVyc29uLnNldE5hbWUoIkpvZSBTY2htbyIpOworICAgICAgICBwZXJzb24uc2V0Q2hpbGRyZW4obmV3IFBlcnNvbltde2RhdWdodGVyLCBzb259KTsKKworICAgICAgICByZXR1cm4gcGVyc29uOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJTaW1wbGlmaWFibGVJZlN0YXRlbWVudCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBQZXJzb24gb3RoZXIgPSAoUGVyc29uKSBvYmo7CisgICAgICAgIGlmICgodGhpcy5tX25hbWUgPT0gbnVsbCkgPyAob3RoZXIubV9uYW1lICE9IG51bGwpIDogIXRoaXMubV9uYW1lLmVxdWFscyhvdGhlci5tX25hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEpzb25UZXN0SGVscGVyLmFyZUFycmF5c0VxdWFsKG1fY2hpbGRyZW4sIG90aGVyLm1fY2hpbGRyZW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLm1fbmFtZSAhPSBudWxsID8gdGhpcy5tX25hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMubV9jaGlsZHJlbiAhPSBudWxsID8gQXJyYXlzLmhhc2hDb2RlKHRoaXMubV9jaGlsZHJlbikgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIntwZXJzb246ICVzLCAlc30iLCBtX25hbWUsIEFycmF5cy50b1N0cmluZyhtX2NoaWxkcmVuKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbV9uYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbV9uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudFdyYXBwZXIobmFtZSA9ICJjaGlsZHJlbiIpCisgICAgQFhtbEVsZW1lbnQobmFtZSA9ICJjaGlsZCIpCisgICAgcHVibGljIFBlcnNvbltdIGdldENoaWxkcmVuKCkgeworICAgICAgICByZXR1cm4gbV9jaGlsZHJlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihQZXJzb25bXSBjaGlsZHJlbikgeworICAgICAgICBtX2NoaWxkcmVuID0gY2hpbGRyZW47CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbV9uYW1lOworICAgIHByaXZhdGUgUGVyc29uW10gbV9jaGlsZHJlbjsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvUHVyZUNoYXJEYXRhQmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9QdXJlQ2hhckRhdGFCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyMTgzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvUHVyZUNoYXJEYXRhQmVhbi5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiUmVkdW5kYW50SWZTdGF0ZW1lbnQiLCAiU3RyaW5nRXF1YWxpdHkifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFB1cmVDaGFyRGF0YUJlYW4geworCisgICAgQFhtbFZhbHVlCisgICAgcHVibGljIFN0cmluZyBjb250ZW50OworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBQdXJlQ2hhckRhdGFCZWFuIGluc3RhbmNlID0gbmV3IFB1cmVDaGFyRGF0YUJlYW4oKTsKKyAgICAgICAgaW5zdGFuY2UuY29udGVudCA9ICJzb21lIHRleHR1YWwgY29udGVudCI7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFB1cmVDaGFyRGF0YUJlYW4gb3RoZXIgPSAoUHVyZUNoYXJEYXRhQmVhbikgb2JqOworICAgICAgICBpZiAodGhpcy5jb250ZW50ICE9IG90aGVyLmNvbnRlbnQgJiYgKHRoaXMuY29udGVudCA9PSBudWxsIHx8ICF0aGlzLmNvbnRlbnQuZXF1YWxzKG90aGVyLmNvbnRlbnQpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDU5ICogaGFzaCArICh0aGlzLmNvbnRlbnQgIT0gbnVsbCA/IHRoaXMuY29udGVudC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvUmVnaXN0ZXJNZXNzYWdlLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1JlZ2lzdGVyTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjUzMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1JlZ2lzdGVyTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIERhdmlkIEthc3BhcgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgZmluYWwgY2xhc3MgUmVnaXN0ZXJNZXNzYWdlIHsKKworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgU3RyaW5nIGFnZW50VUlEOworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBsb25nIHJlcXVlc3RUaW1lOworCisgICAgcHVibGljIFJlZ2lzdGVyTWVzc2FnZSgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFJlZ2lzdGVyTWVzc2FnZSBvdGhlciA9IChSZWdpc3Rlck1lc3NhZ2UpIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLmFnZW50VUlEID09IG51bGwpID8gKG90aGVyLmFnZW50VUlEICE9IG51bGwpIDogIXRoaXMuYWdlbnRVSUQuZXF1YWxzKG90aGVyLmFnZW50VUlEKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnJlcXVlc3RUaW1lICE9IG90aGVyLnJlcXVlc3RUaW1lKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gODkgKiBoYXNoICsgKHRoaXMuYWdlbnRVSUQgIT0gbnVsbCA/IHRoaXMuYWdlbnRVSUQuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gODkgKiBoYXNoICsgKGludCkgKHRoaXMucmVxdWVzdFRpbWUgXiAodGhpcy5yZXF1ZXN0VGltZSA+Pj4gMzIpKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIntcImFnZW50VUlEXCI6XCIlc1wiLCBcInJlcXVlc3RUaW1lXCI6JWR9IiwgYWdlbnRVSUQsIHJlcXVlc3RUaW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFJlZ2lzdGVyTWVzc2FnZSBybSA9IG5ldyBSZWdpc3Rlck1lc3NhZ2UoKTsKKyAgICAgICAgcm0uYWdlbnRVSUQgPSAiYWdlbnRLb2NrYSI7CisgICAgICAgIHJtLnJlcXVlc3RUaW1lID0gMTIzNEw7CisgICAgICAgIHJldHVybiBybTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyNTFkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiUmVkdW5kYW50SWZTdGF0ZW1lbnQiLCAiU3RyaW5nRXF1YWxpdHkifSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gIkR1bW15T25lIikKK3B1YmxpYyBjbGFzcyBTaW1wbGVCZWFuIHsKKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIFN0cmluZyBjaGlsZDsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgU2ltcGxlQmVhbiBpbnN0YW5jZSA9IG5ldyBTaW1wbGVCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLmNoaWxkID0gInNpbXBsZSI7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFNpbXBsZUJlYW4gb3RoZXIgPSAoU2ltcGxlQmVhbikgb2JqOworICAgICAgICBpZiAodGhpcy5jaGlsZCAhPSBvdGhlci5jaGlsZCAmJiAodGhpcy5jaGlsZCA9PSBudWxsIHx8ICF0aGlzLmNoaWxkLmVxdWFscyhvdGhlci5jaGlsZCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNjcgKiBoYXNoICsgKHRoaXMuY2hpbGQgIT0gbnVsbCA/IHRoaXMuY2hpbGQuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG5ldyBGb3JtYXR0ZXIoKSkuZm9ybWF0KCJTQiglcykiLCBjaGlsZCkudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg2NzM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlN0cmluZ0VxdWFsaXR5IiwgIlJlZHVuZGFudElmU3RhdGVtZW50In0pCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBTaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMgeworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBVUkkgdXJpOworICAgIHB1YmxpYyBTdHJpbmcgczE7CisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBpbnQgaTsKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIFN0cmluZyBqOworCisgICAgcHVibGljIFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcyBpbnN0YW5jZSA9IG5ldyBTaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgaW5zdGFuY2UuczEgPSAiaGkgdGhlcmUiOworICAgICAgICBpbnN0YW5jZS5pID0gMzEyOworICAgICAgICBpbnN0YW5jZS5qID0gImJ1bXBlciI7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluc3RhbmNlLnVyaSA9IG5ldyBVUkkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iKTsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcyBvdGhlciA9IChTaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMpIG9iajsKKyAgICAgICAgaWYgKHRoaXMuczEgIT0gb3RoZXIuczEgJiYgKHRoaXMuczEgPT0gbnVsbCB8fCAhdGhpcy5zMS5lcXVhbHMob3RoZXIuczEpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmogIT0gb3RoZXIuaiAmJiAodGhpcy5qID09IG51bGwgfHwgIXRoaXMuai5lcXVhbHMob3RoZXIuaikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudXJpICE9IG90aGVyLnVyaSAmJiAodGhpcy51cmkgPT0gbnVsbCB8fCAhdGhpcy51cmkuZXF1YWxzKG90aGVyLnVyaSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaSAhPSBvdGhlci5pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBpZiAobnVsbCAhPSBzMSkgeworICAgICAgICAgICAgaGFzaCArPSAxNyAqIHMxLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgIT0gaikgeworICAgICAgICAgICAgaGFzaCArPSAxNyAqIGouaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSB1cmkpIHsKKyAgICAgICAgICAgIGhhc2ggKz0gMTcgKiB1cmkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICBoYXNoICs9IDEzICogaTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRm9ybWF0dGVyKCkpLmZvcm1hdCgiU0JXQSglcywlZCwlcywlcykiLCBzMSwgaSwgaiwgdXJpKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjA3YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUgeworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBVUkkgdXJpOworCisgICAgcHVibGljIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSBpbnN0YW5jZSA9IG5ldyBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5zdGFuY2UudXJpID0gbmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlIG90aGVyID0gKFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSkgb2JqOworICAgICAgICBpZiAodGhpcy51cmkgIT0gb3RoZXIudXJpICYmICh0aGlzLnVyaSA9PSBudWxsIHx8ICF0aGlzLnVyaS5lcXVhbHMob3RoZXIudXJpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGlmIChudWxsICE9IHVyaSkgeworICAgICAgICAgICAgaGFzaCArPSAxNyAqIHVyaS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJTQldKT0EoJXMpIiwgdXJpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjNzk0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiUmVkdW5kYW50SWZTdGF0ZW1lbnQiLCAiU3RyaW5nRXF1YWxpdHkifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlIHsKKworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgVVJJIHVyaTsKKyAgICBAWG1sVmFsdWUKKyAgICBwdWJsaWMgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUgaW5zdGFuY2UgPSBuZXcgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5zdGFuY2UudXJpID0gbmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIpOworICAgICAgICAgICAgaW5zdGFuY2UudmFsdWUgPSAiY2hhcmFjdGVycyI7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlIG90aGVyID0gKFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlKSBvYmo7CisgICAgICAgIGlmICh0aGlzLnVyaSAhPSBvdGhlci51cmkgJiYgKHRoaXMudXJpID09IG51bGwgfHwgIXRoaXMudXJpLmVxdWFscyhvdGhlci51cmkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG90aGVyLnZhbHVlICYmICh0aGlzLnZhbHVlID09IG51bGwgfHwgIXRoaXMudmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGlmIChudWxsICE9IHVyaSkgeworICAgICAgICAgICAgaGFzaCArPSAxNyAqIHVyaS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IHZhbHVlKSB7CisgICAgICAgICAgICBoYXNoICs9IDE3ICogdmFsdWUuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiU0JXSk9BViglcywlcykiLCB1cmksIHZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcy5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzEwZGYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXMuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSIsICJSZWR1bmRhbnRJZlN0YXRlbWVudCIsICJOdW1iZXJFcXVhbGl0eSJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgU2ltcGxlQmVhbldpdGhPYmplY3RBdHRyaWJ1dGVzIHsKKworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgVVJJIHVyaTsKKyAgICBwdWJsaWMgU3RyaW5nIHMxOworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgSW50ZWdlciBpOworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgU3RyaW5nIGo7CisKKyAgICBwdWJsaWMgU2ltcGxlQmVhbldpdGhPYmplY3RBdHRyaWJ1dGVzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFNpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcyBvdGhlciA9IChTaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXMpIG9iajsKKyAgICAgICAgaWYgKHRoaXMuczEgIT0gb3RoZXIuczEgJiYgKHRoaXMuczEgPT0gbnVsbCB8fCAhdGhpcy5zMS5lcXVhbHMob3RoZXIuczEpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmogIT0gb3RoZXIuaiAmJiAodGhpcy5qID09IG51bGwgfHwgIXRoaXMuai5lcXVhbHMob3RoZXIuaikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudXJpICE9IG90aGVyLnVyaSAmJiAodGhpcy51cmkgPT0gbnVsbCB8fCAhdGhpcy51cmkuZXF1YWxzKG90aGVyLnVyaSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaSAhPSBvdGhlci5pICYmICh0aGlzLmkgPT0gbnVsbCB8fCAhdGhpcy5pLmVxdWFscyhvdGhlci5pKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGlmIChudWxsICE9IHMxKSB7CisgICAgICAgICAgICBoYXNoICs9IDE3ICogczEuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSBqKSB7CisgICAgICAgICAgICBoYXNoICs9IDE3ICogai5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IHVyaSkgeworICAgICAgICAgICAgaGFzaCArPSAxNyAqIHVyaS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIGhhc2ggKz0gMTMgKiBpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG5ldyBGb3JtYXR0ZXIoKSkuZm9ybWF0KCJTQldPQSglcywlZCwlcywlcykiLCBzMSwgaSwgaiwgdXJpKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlWG1sVHlwZUJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlWG1sVHlwZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmNmOWFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVYbWxUeXBlQmVhbi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSIsICJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQorQFhtbFR5cGUKK3B1YmxpYyBjbGFzcyBTaW1wbGVYbWxUeXBlQmVhbiB7CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgY2hpbGQ7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFNpbXBsZVhtbFR5cGVCZWFuIGluc3RhbmNlID0gbmV3IFNpbXBsZVhtbFR5cGVCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLmNoaWxkID0gInNpbXBsZSI7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFNpbXBsZVhtbFR5cGVCZWFuIG90aGVyID0gKFNpbXBsZVhtbFR5cGVCZWFuKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmNoaWxkICE9IG90aGVyLmNoaWxkICYmICh0aGlzLmNoaWxkID09IG51bGwgfHwgIXRoaXMuY2hpbGQuZXF1YWxzKG90aGVyLmNoaWxkKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA2NyAqIGhhc2ggKyAodGhpcy5jaGlsZCAhPSBudWxsID8gdGhpcy5jaGlsZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAobmV3IEZvcm1hdHRlcigpKS5mb3JtYXQoIlNFVEIoJXMpIiwgY2hpbGQpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2YxNGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxSb290RWxlbWVudChuYW1lID0gInNpbmdsZUl0ZW1MaXN0V3JhcHBlciIpCitwdWJsaWMgY2xhc3MgU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbiB7CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHNpbmdsZUl0ZW1MaXN0OworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBTaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuIGluc3RhbmNlID0gbmV3IFNpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4oKTsKKyAgICAgICAgaW5zdGFuY2Uuc2luZ2xlSXRlbUxpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGluc3RhbmNlLnNpbmdsZUl0ZW1MaXN0LmFkZCgiMSIpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuIG90aGVyID0gKFNpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4pIG9iajsKKyAgICAgICAgaWYgKHRoaXMuc2luZ2xlSXRlbUxpc3QgIT0gb3RoZXIuc2luZ2xlSXRlbUxpc3QgJiYgKHRoaXMuc2luZ2xlSXRlbUxpc3QgPT0gbnVsbCB8fCAhdGhpcy5zaW5nbGVJdGVtTGlzdAorICAgICAgICAgICAgICAgIC5lcXVhbHMob3RoZXIuc2luZ2xlSXRlbUxpc3QpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDU5ICogaGFzaCArICh0aGlzLnNpbmdsZUl0ZW1MaXN0ICE9IG51bGwgPyB0aGlzLnNpbmdsZUl0ZW1MaXN0Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIntzaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuOntsOiVzfX0iLCBzaW5nbGVJdGVtTGlzdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9UcmVlTW9kZWwuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvVHJlZU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5ZGMwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvVHJlZU1vZGVsLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLkpzb25UZXN0SGVscGVyOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiUmVkdW5kYW50SWZTdGF0ZW1lbnQifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFRyZWVNb2RlbCB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIiwgIlN0cmluZ0VxdWFsaXR5IiwgIlJlZHVuZGFudElmU3RhdGVtZW50In0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb2RlIHsKKworICAgICAgICBAWG1sRWxlbWVudAorICAgICAgICBwdWJsaWMgU3RyaW5nIGxhYmVsOworICAgICAgICBAWG1sRWxlbWVudAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBleHBhbmRlZDsKKyAgICAgICAgQFhtbEVsZW1lbnQKKyAgICAgICAgcHVibGljIExpc3Q8Tm9kZT4gY2hpbGRyZW47CisKKyAgICAgICAgcHVibGljIE5vZGUoKSB7CisgICAgICAgICAgICB0aGlzKCJkdW1teSBub2RlIiwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9kZShTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgICAgIHRoaXMobGFiZWwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE5vZGUoU3RyaW5nIGxhYmVsLCBDb2xsZWN0aW9uPE5vZGU+IGNoaWxkcmVuKSB7CisgICAgICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgICAgICAgICBpZiAoIUpzb25UZXN0SGVscGVyLmlzQ29sbGVjdGlvbkVtcHR5KGNoaWxkcmVuKSkgeworICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxOb2RlPigpOworICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICBleHBhbmRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSAxMzsKKyAgICAgICAgICAgIHJlc3VsdCArPSAxNyAqIGxhYmVsLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBpZiAoIUpzb25UZXN0SGVscGVyLmlzQ29sbGVjdGlvbkVtcHR5KGNoaWxkcmVuKSkgeworICAgICAgICAgICAgICAgIGZvciAoTm9kZSBuIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gNSArIDE3ICogbi5oYXNoQ29kZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE5vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgTm9kZSBvdGhlciA9IChOb2RlKSBvYmo7CisgICAgICAgICAgICBpZiAodGhpcy5sYWJlbCAhPSBvdGhlci5sYWJlbCAmJiAodGhpcy5sYWJlbCA9PSBudWxsIHx8ICF0aGlzLmxhYmVsLmVxdWFscyhvdGhlci5sYWJlbCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh0aGlzLmNoaWxkcmVuICE9IG90aGVyLmNoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgICYmIEpzb25UZXN0SGVscGVyLmlzQ29sbGVjdGlvbkVtcHR5KHRoaXMuY2hpbGRyZW4pICE9IEpzb25UZXN0SGVscGVyLmlzQ29sbGVjdGlvbkVtcHR5KG90aGVyLmNoaWxkcmVuKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCB8fCAhdGhpcy5jaGlsZHJlbi5lcXVhbHMob3RoZXIuY2hpbGRyZW4pKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIigiICsgbGFiZWwgKyAiOiI7CisgICAgICAgICAgICBpZiAoIUpzb25UZXN0SGVscGVyLmlzQ29sbGVjdGlvbkVtcHR5KGNoaWxkcmVuKSkgeworICAgICAgICAgICAgICAgIGZvciAoTm9kZSBuIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IG4udG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICIpIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICIwIGNoaWxkcmVuKSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBOb2RlIHJvb3Q7CisKKyAgICBwdWJsaWMgVHJlZU1vZGVsKCkgeworICAgIH0KKworICAgIHB1YmxpYyBUcmVlTW9kZWwoTm9kZSByb290KSB7CisgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBUcmVlTW9kZWwgaW5zdGFuY2UgPSBuZXcgVHJlZU1vZGVsKCk7CisgICAgICAgIGluc3RhbmNlLnJvb3QgPSBuZXcgTm9kZSgpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaWYgKG51bGwgIT0gcm9vdCkgeworICAgICAgICAgICAgcmV0dXJuIDcgKyByb290Lmhhc2hDb2RlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gNzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFRyZWVNb2RlbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBUcmVlTW9kZWwgb3RoZXIgPSAoVHJlZU1vZGVsKSBvYmo7CisgICAgICAgIGlmICh0aGlzLnJvb3QgIT0gb3RoZXIucm9vdCAmJiAodGhpcy5yb290ID09IG51bGwgfHwgIXRoaXMucm9vdC5lcXVhbHMob3RoZXIucm9vdCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChudWxsICE9IHJvb3QpID8gcm9vdC50b1N0cmluZygpIDogIihOVUxMX1JPT1QpIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1R3b0xpc3RzV3JhcHBlckJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvVHdvTGlzdHNXcmFwcGVyQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Yjc2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1R3b0xpc3RzV3JhcHBlckJlYW4uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiaXRlbTIiKQorcHVibGljIGNsYXNzIFR3b0xpc3RzV3JhcHBlckJlYW4geworCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBwcm9wZXJ0eTEsIHByb3BlcnR5MjsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgVHdvTGlzdHNXcmFwcGVyQmVhbiBpbnN0YW5jZSA9IG5ldyBUd29MaXN0c1dyYXBwZXJCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLnByb3BlcnR5MSA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgaW5zdGFuY2UucHJvcGVydHkxLmFkZCgiYTEiKTsKKyAgICAgICAgaW5zdGFuY2UucHJvcGVydHkxLmFkZCgiYTEiKTsKKyAgICAgICAgaW5zdGFuY2UucHJvcGVydHkyID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBpbnN0YW5jZS5wcm9wZXJ0eTIuYWRkKCJiMSIpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBUd29MaXN0c1dyYXBwZXJCZWFuIG90aGVyID0gKFR3b0xpc3RzV3JhcHBlckJlYW4pIG9iajsKKyAgICAgICAgaWYgKHRoaXMucHJvcGVydHkxICE9IG90aGVyLnByb3BlcnR5MSAmJiAodGhpcy5wcm9wZXJ0eTEgPT0gbnVsbCB8fCAhdGhpcy5wcm9wZXJ0eTEuZXF1YWxzKG90aGVyLnByb3BlcnR5MSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMucHJvcGVydHkyICE9IG90aGVyLnByb3BlcnR5MiAmJiAodGhpcy5wcm9wZXJ0eTIgPT0gbnVsbCB8fCAhdGhpcy5wcm9wZXJ0eTIuZXF1YWxzKG90aGVyLnByb3BlcnR5MikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNTkgKiBoYXNoICsgKHRoaXMucHJvcGVydHkxICE9IG51bGwgPyB0aGlzLnByb3BlcnR5MS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSA1OSAqIGhhc2ggKyAodGhpcy5wcm9wZXJ0eTIgIT0gbnVsbCA/IHRoaXMucHJvcGVydHkyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInt0d29MaXN0c1dyYXBwZXJCZWFuOntwcm9wZXJ0eTE6JXMsIHByb3BlcnR5Mjolc319IiwgcHJvcGVydHkxLCBwcm9wZXJ0eTIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Vc2VyLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGYwNjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Vc2VyLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlRyYW5zaWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlN0cmluZ0VxdWFsaXR5IiwgIlJlZHVuZGFudElmU3RhdGVtZW50IiwgIlVudXNlZERlY2xhcmF0aW9uIn0pCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBVc2VyIHsKKworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAidXNlcmlkIikKKyAgICBwdWJsaWMgU3RyaW5nIGlkOworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBAWG1sVHJhbnNpZW50CisgICAgQEpzb25iVHJhbnNpZW50CisgICAgcHVibGljIFN0cmluZyBwYXNzd29yZDsKKworICAgIHB1YmxpYyBVc2VyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBVc2VyKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBVc2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFVzZXIgb3RoZXIgPSAoVXNlcikgb2JqOworICAgICAgICBpZiAodGhpcy5pZCAhPSBvdGhlci5pZCAmJiAodGhpcy5pZCA9PSBudWxsIHx8ICF0aGlzLmlkLmVxdWFscyhvdGhlci5pZCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubmFtZSAhPSBvdGhlci5uYW1lICYmICh0aGlzLm5hbWUgPT0gbnVsbCB8fCAhdGhpcy5uYW1lLmVxdWFscyhvdGhlci5uYW1lKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGlmIChudWxsICE9IGlkKSB7CisgICAgICAgICAgICBoYXNoID0gMTcgKiBoYXNoICsgaWQuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSBuYW1lKSB7CisgICAgICAgICAgICBoYXNoID0gMTcgKiBoYXNoICsgbmFtZS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiVXNlcigiICsgaWQgKyAiLCAiICsgbmFtZSArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgVXNlcigiMTYyMSIsICJHcm90ZWZlbmQiLCAiUGVyc2Vwb2xpcyIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Vc2VyVGFibGUuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvVXNlclRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3ZDExYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvVXNlclRhYmxlLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5Kc29uVGVzdEhlbHBlcjsKKworLyoqCisgKiBOb3RlOiBXaXRoIE1PWHkgd2UgbmVlZCB0byBlbnN1cmUgdGhhdCBjb2xsZWN0aW9ucyAoYSBsaXN0IGluIHRoaXMgY2FzZSkgd2l0aCBwcmVkZWZpbmVkIHZhbHVlcyAoYXNzaWduZWQgdG8gdGhlIGxpc3QgZHVyaW5nCisgKiBvYmplY3QgaW5pdGlhbGl6YXRpb24pIGFyZSBlaXRoZXIgdW5pbml0aWFsaXplZCBvciBlbXB0eSBkdXJpbmcgdGhlIG9iamVjdCBjcmVhdGlvbiwgb3RoZXJ3aXNlIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdAorICogdGhlc2UgZGVmYXVsdCB2YWx1ZXMgYXJlIGRvdWJsZWQgaW4gdGhlIGxpc3QgKGxpc3QgaXMgZmlsbGVkIHdpdGggZGVmYXVsdCB2YWx1ZXMgd2hlbiBhIG5ldyBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCBhZnRlcgorICogdW5tYXJzaGFsbGluZyBYTUwvSlNPTiBzdHJlYW0gYWRkaXRpb25hbCBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhpcyBsaXN0IC0gTU9YeSBkb2Vzbid0IG92ZXJyaWRlIHRoZSBleGlzdGluZyBsaXN0IHdpdGggYQorICogbmV3IG9uZSBjcmVhdGVkIGR1cmluZyB1bm1hcnNoYWxsaW5nKS4KKyAqIDxwLz4KKyAqIFdvcmthcm91bmQ6IFNldCB7QGxpbmsgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGV9IHRvIHtAbGluayBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGUjRklFTER9LAorICogZG8gbm90IGluaXRpYWxpemUgdGhlIGxpc3QgaW4gdGhlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqIChmaWVsZCBpbml0aWFsaXplcikgYW5kIGFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIGxpc3QgdGhhdCBzaG91bGQgY29udGFpbiBwcmVkZWZpbmVkIHZhbHVlcyBtYW51YWxseSAoaW4gdGhpcyBjYXNlIHRoZSB2YWx1ZQorICogb2JqZWN0IGlzIHJlcHJlc2VudGVkIGJ5IHtAY29kZSAjREVGQVVMVF9IRUFERVJTfSkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgVXNlclRhYmxlIHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKTWFraVRhYmxlSGVhZGVyIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGlkOworICAgICAgICBwdWJsaWMgU3RyaW5nIGxhYmVsOworCisgICAgICAgIHB1YmxpYyBKTWFraVRhYmxlSGVhZGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpNYWtpVGFibGVIZWFkZXIoU3RyaW5nIGlkLCBTdHJpbmcgbGFiZWwpIHsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IGhhc2ggPSAxMzsKKyAgICAgICAgICAgIGhhc2ggPSBpZCAhPSBudWxsID8gMjkgKiBpZC5oYXNoQ29kZSgpIDogaGFzaDsKKyAgICAgICAgICAgIGhhc2ggPSBsYWJlbCAhPSBudWxsID8gMjkgKiBsYWJlbC5oYXNoQ29kZSgpIDogaGFzaDsKKyAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBKTWFraVRhYmxlSGVhZGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEpNYWtpVGFibGVIZWFkZXIgdGhhdCA9IChKTWFraVRhYmxlSGVhZGVyKSBvYmo7CisKKyAgICAgICAgICAgIGlmICgoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKHRoYXQuaWQpKSAmJiB0aGF0LmlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGxhYmVsICE9IG51bGwgJiYgIWxhYmVsLmVxdWFscyh0aGF0LmxhYmVsKSkgJiYgdGhhdC5sYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJKTWFraVRhYmxlSGVhZGVyKGlkID0gIiArIGlkICsgIiwgbGFiZWwgPSAiICsgbGFiZWwgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFVzZXJUYWJsZSBpbnN0YW5jZSA9IG5ldyBVc2VyVGFibGUoKTsKKyAgICAgICAgaW5zdGFuY2Uucm93cyA9IG5ldyBMaW5rZWRMaXN0PFVzZXI+KCk7CisgICAgICAgIGluc3RhbmNlLnJvd3MuYWRkKEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShVc2VyLmNsYXNzKSk7CisgICAgICAgIGluc3RhbmNlLmNvbHVtbnMgPSBERUZBVUxUX0hFQURFUlM7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UyKCkgeworICAgICAgICBVc2VyVGFibGUgaW5zdGFuY2UgPSBuZXcgVXNlclRhYmxlKCk7CisgICAgICAgIGluc3RhbmNlLnJvd3MgPSBuZXcgTGlua2VkTGlzdDxVc2VyPigpOworICAgICAgICBpbnN0YW5jZS5yb3dzLmFkZChKc29uVGVzdEhlbHBlci5jcmVhdGVUZXN0SW5zdGFuY2UoVXNlci5jbGFzcykpOworICAgICAgICBpbnN0YW5jZS5hZGRDb2x1bW4obmV3IEpNYWtpVGFibGVIZWFkZXIoInBhc3N3b3JkIiwgIlBhc3N3b3JkIikpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgc3RhdGljIExpc3Q8Sk1ha2lUYWJsZUhlYWRlcj4gaW5pdEhlYWRlcnMoKSB7CisgICAgICAgIExpc3Q8Sk1ha2lUYWJsZUhlYWRlcj4gaGVhZGVycyA9IG5ldyBMaW5rZWRMaXN0PEpNYWtpVGFibGVIZWFkZXI+KCk7CisgICAgICAgIGhlYWRlcnMuYWRkKG5ldyBKTWFraVRhYmxlSGVhZGVyKCJ1c2VyaWQiLCAiVXNlcklEIikpOworICAgICAgICBoZWFkZXJzLmFkZChuZXcgSk1ha2lUYWJsZUhlYWRlcigibmFtZSIsICJVc2VyIE5hbWUiKSk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGhlYWRlcnMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxKTWFraVRhYmxlSGVhZGVyPiBERUZBVUxUX0hFQURFUlMgPSBpbml0SGVhZGVycygpOworCisgICAgcHJpdmF0ZSBMaXN0PEpNYWtpVGFibGVIZWFkZXI+IGNvbHVtbnM7CisgICAgcHJpdmF0ZSBMaXN0PFVzZXI+IHJvd3M7CisKKyAgICBwdWJsaWMgVXNlclRhYmxlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBVc2VyVGFibGUoTGlzdDxVc2VyPiB1c2VycykgeworICAgICAgICB0aGlzLnJvd3MgPSBuZXcgTGlua2VkTGlzdDxVc2VyPigpOworICAgICAgICB0aGlzLnJvd3MuYWRkQWxsKHVzZXJzKTsKKyAgICAgICAgdGhpcy5jb2x1bW5zID0gREVGQVVMVF9IRUFERVJTOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENvbHVtbihmaW5hbCBKTWFraVRhYmxlSGVhZGVyIGNvbHVtbikgeworICAgICAgICBnZXRDb2x1bW5zKCkuYWRkKGNvbHVtbik7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8Sk1ha2lUYWJsZUhlYWRlcj4gZ2V0Q29sdW1ucygpIHsKKyAgICAgICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgY29sdW1ucyA9IG5ldyBMaW5rZWRMaXN0PEpNYWtpVGFibGVIZWFkZXI+KERFRkFVTFRfSEVBREVSUyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbHVtbnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1ucyhmaW5hbCBMaXN0PEpNYWtpVGFibGVIZWFkZXI+IGNvbHVtbnMpIHsKKyAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxVc2VyPiBnZXRSb3dzKCkgeworICAgICAgICByZXR1cm4gcm93czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSb3dzKGZpbmFsIExpc3Q8VXNlcj4gcm93cykgeworICAgICAgICB0aGlzLnJvd3MgPSByb3dzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVzZXJUYWJsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBVc2VyVGFibGUgb3RoZXIgPSAoVXNlclRhYmxlKSBvYmo7CisKKyAgICAgICAgcmV0dXJuIEpzb25UZXN0SGVscGVyLmFyZUNvbGxlY3Rpb25zRXF1YWwodGhpcy5yb3dzLCBvdGhlci5yb3dzKQorICAgICAgICAgICAgICAgICYmIEpzb25UZXN0SGVscGVyLmFyZUNvbGxlY3Rpb25zRXF1YWwodGhpcy5jb2x1bW5zLCBvdGhlci5jb2x1bW5zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDE2OworICAgICAgICBpZiAobnVsbCAhPSByb3dzKSB7CisgICAgICAgICAgICBmb3IgKFVzZXIgdSA6IHJvd3MpIHsKKyAgICAgICAgICAgICAgICBoYXNoID0gMTcgKiBoYXNoICsgdS5oYXNoQ29kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IGNvbHVtbnMpIHsKKyAgICAgICAgICAgIGZvciAoSk1ha2lUYWJsZUhlYWRlciB1IDogY29sdW1ucykgeworICAgICAgICAgICAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyB1Lmhhc2hDb2RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlVzZXJUYWJsZSglcywlcykiLCByb3dzLCBjb2x1bW5zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L3Bvam8vUG9qb0FuaW1hbC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9wb2pvL1Bvam9BbmltYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGJkMTFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9wb2pvL1Bvam9BbmltYWwuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5wb2pvOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworLy8gSmFja3NvbiAxCitAb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblR5cGVJbmZvKAorICAgICAgICB1c2UgPSBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uVHlwZUluZm8uSWQuTkFNRSwKKyAgICAgICAgaW5jbHVkZSA9IG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25UeXBlSW5mby5Bcy5QUk9QRVJUWSkKK0BvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uU3ViVHlwZXMoeworICAgICAgICBAb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblN1YlR5cGVzLlR5cGUodmFsdWUgPSBQb2pvQ2F0LmNsYXNzKSwKKyAgICAgICAgQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25TdWJUeXBlcy5UeXBlKHZhbHVlID0gUG9qb0RvZy5jbGFzcykgfSkKKy8vIEphY2tzb24gMgorQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25UeXBlSW5mbygKKyAgICAgICAgdXNlID0gY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblR5cGVJbmZvLklkLk5BTUUsCisgICAgICAgIGluY2x1ZGUgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uVHlwZUluZm8uQXMuUFJPUEVSVFkpCitAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblN1YlR5cGVzKHsKKyAgICAgICAgQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25TdWJUeXBlcy5UeXBlKHZhbHVlID0gUG9qb0NhdC5jbGFzcyksCisgICAgICAgIEBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uU3ViVHlwZXMuVHlwZSh2YWx1ZSA9IFBvam9Eb2cuY2xhc3MpIH0pCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorcHVibGljIGNsYXNzIFBvam9BbmltYWwgeworCisgICAgcHVibGljIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIFBvam9BbmltYWwoKSB7CisgICAgfQorCisgICAgcHVibGljIFBvam9BbmltYWwoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBvam9BbmltYWwgb3RoZXIgPSAoUG9qb0FuaW1hbCkgb2JqOworICAgICAgICBpZiAoKHRoaXMubmFtZSA9PSBudWxsKSA/IChvdGhlci5uYW1lICE9IG51bGwpIDogIXRoaXMubmFtZS5lcXVhbHMob3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA2NyAqIGhhc2ggKyAodGhpcy5uYW1lICE9IG51bGwgPyB0aGlzLm5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyBcIm5hbWVcIjpcIiVzXCJ9IiwgbmFtZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L3Bvam8vUG9qb0FuaW1hbExpc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvQW5pbWFsTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDgyZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L3Bvam8vUG9qb0FuaW1hbExpc3QuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5wb2pvOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorcHVibGljIGNsYXNzIFBvam9BbmltYWxMaXN0IHsKKworICAgIHB1YmxpYyBMaXN0PFBvam9BbmltYWw+IGFuaW1hbHM7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFBvam9BbmltYWxMaXN0IGFMaXN0ID0gbmV3IFBvam9BbmltYWxMaXN0KCk7CisgICAgICAgIGFMaXN0LmFuaW1hbHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGFMaXN0LmFuaW1hbHMuYWRkKG5ldyBQb2pvRG9nKCJGaWZpIikpOworICAgICAgICBhTGlzdC5hbmltYWxzLmFkZChuZXcgUG9qb0NhdCgiRGFpc3kiKSk7CisgICAgICAgIHJldHVybiBhTGlzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBvam9BbmltYWxMaXN0IG90aGVyID0gKFBvam9BbmltYWxMaXN0KSBvYmo7CisgICAgICAgIGlmICh0aGlzLmFuaW1hbHMgIT0gb3RoZXIuYW5pbWFscyAmJiAodGhpcy5hbmltYWxzID09IG51bGwgfHwgIXRoaXMuYW5pbWFscy5lcXVhbHMob3RoZXIuYW5pbWFscykpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gODkgKiBoYXNoICsgKHRoaXMuYW5pbWFscyAhPSBudWxsID8gdGhpcy5hbmltYWxzLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChhbmltYWxzICE9IG51bGwpID8gYW5pbWFscy50b1N0cmluZygpIDogbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvQ2F0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L3Bvam8vUG9qb0NhdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzFlYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L3Bvam8vUG9qb0NhdC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LnBvam87CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorcHVibGljIGNsYXNzIFBvam9DYXQgZXh0ZW5kcyBQb2pvQW5pbWFsIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOworCisgICAgcHVibGljIFBvam9DYXQoKSB7CisgICAgfQorCisgICAgcHVibGljIFBvam9DYXQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIFBvam9DYXQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBuaWNrTmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKGZpbmFsIFN0cmluZyBuaWNrTmFtZSkgeworICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmlja05hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInsgXCJjYXRcIiA6ICVzICwgJXN9Iiwgc3VwZXIudG9TdHJpbmcoKSwgdGhpcy5uaWNrTmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9wb2pvL1Bvam9Eb2cuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvRG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjNGQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvRG9nLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkucG9qbzsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCitwdWJsaWMgY2xhc3MgUG9qb0RvZyBleHRlbmRzIFBvam9BbmltYWwgeworCisgICAgcHVibGljIFBvam9Eb2coKSB7CisgICAgfQorCisgICAgcHVibGljIFBvam9Eb2coZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInsgXCJkb2dcIiA6ICVzIH0iLCBzdXBlci50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Ccm9hZGNhc3RlckNsb3NlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvQnJvYWRjYXN0ZXJDbG9zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2NmM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvQnJvYWRjYXN0ZXJDbG9zZVRlc3QuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc3NlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uU3RhZ2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlQnJvYWRjYXN0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGJyb2FkY2FzdGVyIGJlaGF2aW91ciB3aGVuIGNsb3NpbmcuCisgKgorICogUHJvdmVzLCB0aGF0IGJyb2FkY2FzdGVyIGF0dGVtcHRzIHRvIHNlbmQgdGhlIG1lc3NhZ2VzIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyIGFmdGVyIGl0IHJlY2VpdmVzIHRoZSBjbG9zZSBzaWduYWwuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQnJvYWRjYXN0ZXJDbG9zZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTE9XX1NVQlNDUklCRVJfTEFURU5DWSA9IDIwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NPVU5UID0gODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb3VudERvd25MYXRjaCBvbkNvbXBsZXRlTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNzZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZXZlbnRzIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTc2VSZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3NlIHNzZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTc2VCcm9hZGNhc3RlciBicm9hZGNhc3RlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gZGF0YSA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIHB1YmxpYyBTc2VSZXNvdXJjZShAQ29udGV4dCBmaW5hbCBTc2Ugc3NlKSB7CisgICAgICAgICAgICB0aGlzLnNzZSA9IHNzZTsKKyAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0ZXIgPSBzc2UubmV3QnJvYWRjYXN0ZXIoKTsKKyAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0ZXIucmVnaXN0ZXIobmV3IFNzZUV2ZW50U2luaygpIHsKKworICAgICAgICAgICAgICAgIHZvbGF0aWxlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsb3NlZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPD8+IHNlbmQoT3V0Ym91bmRTc2VFdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMT1dfU1VCU0NSSUJFUl9MQVRFTkNZKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTbG93IHN1YnNjcmliZXIncyBzbGVlcCB3YXMgaW50ZXJydXB0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGF0YS5hZGQoIiIgKyBldmVudC5nZXREYXRhKCkpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wbGV0YWJsZUZ1dHVyZS5jb21wbGV0ZWRGdXR1cmUobnVsbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2xvdyBzdWJzY3JpYmVyIGNvbXBsZXRlZCIpOworICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgICAgIHB1YmxpYyB2b2lkIGdldFNlcnZlclNlbnRFdmVudHMoQENvbnRleHQgZmluYWwgU3NlRXZlbnRTaW5rIGV2ZW50U2luaykgeworICAgICAgICAgICAgYnJvYWRjYXN0ZXIucmVnaXN0ZXIoZXZlbnRTaW5rKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInB1c2gve21zZ30iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGFkZE1lc3NhZ2UoQFBhdGhQYXJhbSgibXNnIikgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3Qoc3NlLm5ld0V2ZW50KG1lc3NhZ2UpKTsKKyAgICAgICAgICAgIHJldHVybiAiTWVzc2FnZSBhZGRlZC4iOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY2xvc2UiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNsb3NlTWUoKSB7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuICJDbG9zZWQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzdWx0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXN1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJyb2FkY2FzdGVyS2VlcHNTZW5kaW5nQWZ0ZXJDTG9zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHB1c2ggc29tZSBldmVudHMgdG8gdGhlIGJyb2FkY2FzdGVyCisgICAgICAgIEludFN0cmVhbS5yYW5nZSgwLCBNU0dfQ09VTlQpLmZvckVhY2goKGkpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgLnBhdGgoImV2ZW50cy9wdXNoL3ttc2d9IikKKyAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgibXNnIiwgIm1zZyIgKyBpKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBpbnN0cnVjdCBicm9hZGNhc3RlciB0byBjbG9zZQorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImV2ZW50cy9jbG9zZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgLy8gc2VuZCBvbmUgbW9yZSBtZXNzYWdlIChzaG91bGQgYmUgcmVqZWN0ZWQgLT4gcmVxdWVzdCB3aWxsIGZhaWwpCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGJhZFJlc3BvbnNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCgiZXZlbnRzL3B1c2gve21zZ30iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlVGVtcGxhdGUoIm1zZyIsICJ0b28tbGF0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCBiYWRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgLy8gd2FpdCB1cCB0byBsYXRlbmN5ICogbXNnY291bnQgKCsxIGFzIHJlc2VydmUpIGJlZm9yZSB0aGUgc2VydmVyIHNodXRzIGRvd24KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUob25Db21wbGV0ZUxhdGNoLmF3YWl0KFNMT1dfU1VCU0NSSUJFUl9MQVRFTkNZICogKE1TR19DT1VOVCArIDEpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKworICAgICAgICAvLyBnZXQgZGF0YSBnYXRoZXJlZCBieSB0aGUgc2xvdyBzdWJzY2liZXIKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgpLnBhdGgoImV2ZW50cy9yZXN1bHQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHJlc3VsdEFycmF5ID0gcmVzdWx0LnNwbGl0KCIsIik7CisKKyAgICAgICAgLy8gY2hlY2ssIHRoYXQgYnJvYWRjYXN0ZXIgc2VudCBhbGwgdGhlIGJ1ZmZlcmVkIGV2ZW50cyB0byB0aGUgc3Vic2NyaWJlciBiZWZvcmUgY29tcGxldGVseSBjbG9zaW5nCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTVNHX0NPVU5ULCByZXN1bHRBcnJheS5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJtc2ciICsgaSwgcmVzdWx0QXJyYXlbaV0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvQnJvYWRjYXN0ZXJFeGVjdXRvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0Jyb2FkY2FzdGVyRXhlY3V0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3MmJmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0Jyb2FkY2FzdGVyRXhlY3V0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNzZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRpb25TdGFnZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlQnJvYWRjYXN0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudEFzeW5jRXhlY3V0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jRXhlY3V0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5UaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIE1hbmFnZWQgZXhlY3V0b3Igc2VydmljZSBpbmplY3Rpb24gYW5kIHByb3BhZ2F0aW9uIGludG8gYnJvYWRjYXN0ZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBCcm9hZGNhc3RlckV4ZWN1dG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9QUkVGSVggPSAiY3VzdG9tLWV4ZWN1dG9yLXRocmVhZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQnJvYWRjYXN0ZXJFeGVjdXRvclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIGNsb3NlTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggdHhMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2VuZFRocmVhZE9rID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBvbkNvbXBsZXRlVGhyZWFkT2sgPSBmYWxzZTsKKworICAgIEBQYXRoKCJzc2UiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZVJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTc2Ugc3NlOworICAgICAgICBwcml2YXRlIFNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyOworCisgICAgICAgIHB1YmxpYyBTc2VSZXNvdXJjZShAQ29udGV4dCBmaW5hbCBTc2Ugc3NlKSB7CisgICAgICAgICAgICB0aGlzLnNzZSA9IHNzZTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyID0gc3NlLm5ld0Jyb2FkY2FzdGVyKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJyb2FkY2FzdGVyIGNyZWF0ZWQ6ICIgKyBicm9hZGNhc3Rlcik7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgICAgICBAUGF0aCgiZXZlbnRzIikKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0U2VydmVyU2VudEV2ZW50cyhAQ29udGV4dCBmaW5hbCBTc2VFdmVudFNpbmsgZXZlbnRTaW5rLCBAQ29udGV4dCBmaW5hbCBTc2Ugc3NlKSB7CisKKyAgICAgICAgICAgIC8vIFRPRE8gSkFYLVJTIDIuMQorICAgICAgICAgICAgYnJvYWRjYXN0ZXIucmVnaXN0ZXIobmV3IFNzZUV2ZW50U2luaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50U2luay5pc0Nsb3NlZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Pz4gc2VuZChPdXRib3VuZFNzZUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJvbk5leHQgY2FsbGVkIHdpdGggWyIgKyBldmVudCArICJdIGZyb20gIiArIG5hbWUpOworICAgICAgICAgICAgICAgICAgICBzZW5kVGhyZWFkT2sgPSBuYW1lLnN0YXJ0c1dpdGgoVEhSRUFEX1BSRUZJWCk7CisgICAgICAgICAgICAgICAgICAgIHR4TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudFNpbmsuc2VuZChldmVudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJvbkNvbXBsZXRlIGNhbGxlZCBmcm9tICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZVRocmVhZE9rID0gbmFtZS5zdGFydHNXaXRoKFRIUkVBRF9QUkVGSVgpOworICAgICAgICAgICAgICAgICAgICBjbG9zZUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICBldmVudFNpbmsuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJwdXNoL3ttc2d9IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1c2hNZXNzYWdlKEBQYXRoUGFyYW0oIm1zZyIpIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChzc2UubmV3RXZlbnRCdWlsZGVyKCkuZGF0YShtc2cpLmJ1aWxkKCkpOworICAgICAgICAgICAgcmV0dXJuICJCcm9hZGNhc3RpbmcgbWVzc2FnZTogIiArIG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjbG9zZSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBjbG9zZSgpIHsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gIkNsb3NlZC4iOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoU3NlUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFLCB0cnVlKTsKKyAgICAgICAgcmMucmVnaXN0ZXIobmV3IEN1c3RvbU1hbmFnZWRBc3luY0V4ZWN1dG9yUHJvdmlkZXIoKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IEN1c3RvbUNsaWVudEFzeW5jRXhlY3V0b3IoKSk7CisgICAgfQorCisgICAgQE1hbmFnZWRBc3luY0V4ZWN1dG9yCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tTWFuYWdlZEFzeW5jRXhlY3V0b3JQcm92aWRlciBleHRlbmRzIFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyIHsKKyAgICAgICAgQ3VzdG9tTWFuYWdlZEFzeW5jRXhlY3V0b3JQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKCJjdXN0b20tZXhlY3V0b3ItdGhyZWFkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQ2xpZW50QXN5bmNFeGVjdXRvcgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbUNsaWVudEFzeW5jRXhlY3V0b3IgZXh0ZW5kcyBUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisgICAgICAgIEN1c3RvbUNsaWVudEFzeW5jRXhlY3V0b3IoKSB7CisgICAgICAgICAgICBzdXBlcigiY3VzdG9tLWNsaWVudC1leGVjdXRvciIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gb25FdmVudFRocmVhZE5hbWUgPSB7IiJ9OworICAgICAgICBTc2VFdmVudFNvdXJjZSBldmVudFNvdXJjZSA9IFNzZUV2ZW50U291cmNlCisgICAgICAgICAgICAgICAgLnRhcmdldCh0YXJnZXQoKS5wYXRoKCJzc2UvZXZlbnRzIikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIoKGV2ZW50KSAtPiB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJFdmVudDogIiArIGV2ZW50ICsgIiBmcm9tOiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBvbkV2ZW50VGhyZWFkTmFtZVswXSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBldmVudFNvdXJjZS5vcGVuKCk7CisKKyAgICAgICAgdGFyZ2V0KCkucGF0aCgic3NlL3B1c2gvZmlyc3RCcm9hZGNhc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIHRhcmdldCgpLnBhdGgoInNzZS9wdXNoL3NlY29uZEJyb2FkY2FzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInR4TGF0Y2ggdGltZS1vdXRlZC4iLCB0eExhdGNoLmF3YWl0KDIwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgIHRhcmdldCgpLnBhdGgoInNzZS9jbG9zZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoImNsb3NlTGF0Y2ggdGltZS1vdXRlZC4iLCBjbG9zZUxhdGNoLmF3YWl0KDIwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJzZW5kIGVpdGhlciBub3QgaW52b2tlZCBhdCBhbGwgb3IgZnJvbSB3cm9uZyB0aHJlYWQiLCBzZW5kVGhyZWFkT2spOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgib25Db21wbGV0ZSBlaXRoZXIgbm90IGludm9rZWQgYXQgYWxsIG9yIGZyb20gd3JvbmcgdGhyZWFkIiwgb25Db21wbGV0ZVRocmVhZE9rKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2xpZW50IGV2ZW50IGNhbGxlZCBmcm9tIHdyb25nIHRocmVhZCAoICIgKyBvbkV2ZW50VGhyZWFkTmFtZVswXSArICIpIiwKKyAgICAgICAgICAgICAgIG9uRXZlbnRUaHJlYWROYW1lWzBdLnN0YXJ0c1dpdGgoImN1c3RvbS1jbGllbnQtZXhlY3V0b3IiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvQnJvYWRjYXN0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Ccm9hZGNhc3RlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2UyODVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvQnJvYWRjYXN0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNzZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlQnJvYWRjYXN0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogSkFYLVJTIHtAbGluayBqYXZheC53cy5ycy5zc2UuU3NlQnJvYWRjYXN0ZXJ9IHRlc3QuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQnJvYWRjYXN0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBzdGF0aWMgZmluYWwgQ291bnREb3duTGF0Y2ggY2xvc2VMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCg0KTsKKyAgICBzdGF0aWMgZmluYWwgQ291bnREb3duTGF0Y2ggdHhMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCg0KTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2luZ2xldG9uID0gZmFsc2U7CisKKyAgICBAUGF0aCgic3NlIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTc2VSZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3NlIHNzZTsKKyAgICAgICAgcHJpdmF0ZSBTc2VCcm9hZGNhc3RlciBicm9hZGNhc3RlcjsKKworICAgICAgICBwdWJsaWMgU3NlUmVzb3VyY2UoQENvbnRleHQgZmluYWwgU3NlIHNzZSkgeworICAgICAgICAgICAgdGhpcy5zc2UgPSBzc2U7CisgICAgICAgICAgICBicm9hZGNhc3RlciA9IHNzZS5uZXdCcm9hZGNhc3RlcigpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgQFBhdGgoImV2ZW50cyIpCisgICAgICAgIHB1YmxpYyB2b2lkIGdldFNlcnZlclNlbnRFdmVudHMoQENvbnRleHQgZmluYWwgU3NlRXZlbnRTaW5rIGV2ZW50U2luaywgQENvbnRleHQgZmluYWwgU3NlIHNzZSkgeworICAgICAgICAgICAgaXNTaW5nbGV0b24gPSB0aGlzLnNzZSA9PSBzc2U7CisgICAgICAgICAgICBldmVudFNpbmsuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkuZGF0YSgiRXZlbnQxIikuYnVpbGQoKSk7CisgICAgICAgICAgICBldmVudFNpbmsuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkuZGF0YSgiRXZlbnQyIikuYnVpbGQoKSk7CisgICAgICAgICAgICBldmVudFNpbmsuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkuZGF0YSgiRXZlbnQzIikuYnVpbGQoKSk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5yZWdpc3RlcihldmVudFNpbmspOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIub25DbG9zZSgoc3Vic2NyaWJlcikgLT4geworICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyID09IGV2ZW50U2luaykgeworICAgICAgICAgICAgICAgICAgICBjbG9zZUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdHhMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJwdXNoL3ttc2d9IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1c2hNZXNzYWdlKEBQYXRoUGFyYW0oIm1zZyIpIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChzc2UubmV3RXZlbnRCdWlsZGVyKCkuZGF0YShtc2cpLmJ1aWxkKCkpOworICAgICAgICAgICAgdHhMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIHJldHVybiAiQnJvYWRjYXN0aW5nIG1lc3NhZ2U6ICIgKyBtc2c7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiY2xvc2UiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2xvc2UoKSB7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuICJDbG9zZWQuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFNzZVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBTc2VFdmVudFNvdXJjZSBldmVudFNvdXJjZUEgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQodGFyZ2V0KCkucGF0aCgic3NlL2V2ZW50cyIpKS5idWlsZCgpOworICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0c0ExID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHRzQTIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggYTFMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCg1KTsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggYTJMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCg1KTsKKyAgICAgICAgZXZlbnRTb3VyY2VBLnJlZ2lzdGVyKChldmVudCkgLT4geworICAgICAgICAgICAgcmVzdWx0c0ExLmFkZChldmVudC5yZWFkRGF0YSgpKTsKKyAgICAgICAgICAgIGExTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0pOworICAgICAgICBldmVudFNvdXJjZUEucmVnaXN0ZXIoKGV2ZW50KSAtPiB7CisgICAgICAgICAgICByZXN1bHRzQTIuYWRkKGV2ZW50LnJlYWREYXRhKCkpOworICAgICAgICAgICAgYTJMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisgICAgICAgIGV2ZW50U291cmNlQS5vcGVuKCk7CisKKyAgICAgICAgdGFyZ2V0KCkucGF0aCgic3NlL3B1c2gvZmlyc3RCcm9hZGNhc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKworICAgICAgICBTc2VFdmVudFNvdXJjZSBldmVudFNvdXJjZUIgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQodGFyZ2V0KCkucGF0aCgic3NlL2V2ZW50cyIpKS5idWlsZCgpOworICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0c0IxID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHRzQjIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggYjFMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCg0KTsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggYjJMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCg0KTsKKyAgICAgICAgZXZlbnRTb3VyY2VCLnJlZ2lzdGVyKChldmVudCkgLT4geworICAgICAgICAgICAgcmVzdWx0c0IxLmFkZChldmVudC5yZWFkRGF0YSgpKTsKKyAgICAgICAgICAgIGIxTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0pOworICAgICAgICBldmVudFNvdXJjZUIucmVnaXN0ZXIoKGV2ZW50KSAtPiB7CisgICAgICAgICAgICByZXN1bHRzQjIuYWRkKGV2ZW50LnJlYWREYXRhKCkpOworICAgICAgICAgICAgYjJMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisgICAgICAgIGV2ZW50U291cmNlQi5vcGVuKCk7CisKKyAgICAgICAgdGFyZ2V0KCkucGF0aCgic3NlL3B1c2gvc2Vjb25kQnJvYWRjYXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJXYWl0aW5nIGZvciByZXN1bHRzQTEgdG8gYmUgY29tcGxldGUgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgYTFMYXRjaC5hd2FpdCgzMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIldhaXRpbmcgZm9yIHJlc3VsdHNBMiB0byBiZSBjb21wbGV0ZSBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICBhMkxhdGNoLmF3YWl0KDMwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJXYWl0aW5nIGZvciByZXN1bHRzQjEgdG8gYmUgY29tcGxldGUgZmFpbGVkLiIsCisgICAgICAgICAgICAgICAgYjFMYXRjaC5hd2FpdCgzMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIldhaXRpbmcgZm9yIHJlc3VsdHNCMiB0byBiZSBjb21wbGV0ZSBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICBiMkxhdGNoLmF3YWl0KDMwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHR4TGF0Y2guYXdhaXQoNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgLy8gRXZlbnQxLCBFdmVudDIsIEV2ZW50MywgZmlyc3RCcm9hZGNhc3QsIHNlY29uZEJyb2FkY2FzdAorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJyZXN1bHRzQTEgZG9lcyBub3QgY29udGFpbiA1IGVsZW1lbnRzLiIsIDUsIHJlc3VsdHNBMS5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJyZXN1bHRzQTIgZG9lcyBub3QgY29udGFpbiA1IGVsZW1lbnRzLiIsIDUsIHJlc3VsdHNBMi5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgicmVzdWx0c0ExIGRvZXMgbm90IGNvbnRhaW4gZXhwZWN0ZWQgZGF0YSIsCisgICAgICAgICAgICAgICAgcmVzdWx0c0ExLmdldCgwKS5lcXVhbHMoIkV2ZW50MSIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQTEuZ2V0KDEpLmVxdWFscygiRXZlbnQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNBMS5nZXQoMikuZXF1YWxzKCJFdmVudDMiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0ExLmdldCgzKS5lcXVhbHMoImZpcnN0QnJvYWRjYXN0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNBMS5nZXQoNCkuZXF1YWxzKCJzZWNvbmRCcm9hZGNhc3QiKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInJlc3VsdHNBMiBkb2VzIG5vdCBjb250YWluIGV4cGVjdGVkIGRhdGEiLAorICAgICAgICAgICAgICAgIHJlc3VsdHNBMi5nZXQoMCkuZXF1YWxzKCJFdmVudDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0EyLmdldCgxKS5lcXVhbHMoIkV2ZW50MiIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQTIuZ2V0KDIpLmVxdWFscygiRXZlbnQzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNBMi5nZXQoMykuZXF1YWxzKCJmaXJzdEJyb2FkY2FzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQTIuZ2V0KDQpLmVxdWFscygic2Vjb25kQnJvYWRjYXN0IikpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInJlc3VsdHNCMSBkb2VzIG5vdCBjb250YWluIDQgZWxlbWVudHMuIiwgNCwgcmVzdWx0c0IxLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInJlc3VsdHNCMiBkb2VzIG5vdCBjb250YWluIDQgZWxlbWVudHMuIiwgNCwgcmVzdWx0c0IyLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJyZXN1bHRzQjEgZG9lcyBub3QgY29udGFpbiBleHBlY3RlZCBkYXRhIiwKKyAgICAgICAgICAgICAgICByZXN1bHRzQjEuZ2V0KDApLmVxdWFscygiRXZlbnQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNCMS5nZXQoMSkuZXF1YWxzKCJFdmVudDIiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0IxLmdldCgyKS5lcXVhbHMoIkV2ZW50MyIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQjEuZ2V0KDMpLmVxdWFscygic2Vjb25kQnJvYWRjYXN0IikpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJyZXN1bHRzQjIgZG9lcyBub3QgY29udGFpbiBleHBlY3RlZCBkYXRhIiwKKyAgICAgICAgICAgICAgICByZXN1bHRzQjIuZ2V0KDApLmVxdWFscygiRXZlbnQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNCMi5nZXQoMSkuZXF1YWxzKCJFdmVudDIiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0IyLmdldCgyKS5lcXVhbHMoIkV2ZW50MyIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQjIuZ2V0KDMpLmVxdWFscygic2Vjb25kQnJvYWRjYXN0IikpOworICAgICAgICB0YXJnZXQoKS5wYXRoKCJzc2UvY2xvc2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNsb3NlTGF0Y2guYXdhaXQoMzAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJTc2UgaW5zdGFuY2VzIGluamVjdGVkIGludG8gcmVzb3VyY2UgYW5kIGNvbnN0cnVjdG9yIGRpZmZlci4gU3NlIHNob3VsZCBoYXZlIGJlZW4gaW5qZWN0ZWQiCisgICAgICAgICAgICAgICAgKyAiYXMgYSBzaW5nbGV0b24iLCBpc1NpbmdsZXRvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvRXZlbnRPdXRwdXRUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9FdmVudE91dHB1dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjA5ZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvRXZlbnRPdXRwdXRUZXN0LmphdmEKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudElucHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudE91dHB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRTb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkluYm91bmRFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuT3V0Ym91bmRFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogRXZlbnQgb3V0cHV0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRXZlbnRPdXRwdXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNzZVRlc3RSZXNvdXJjZS5jbGFzcywgU3NlRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKFNzZUZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNTRSBUZXN0IHJlc291cmNlLgorICAgICAqLworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBAUHJvZHVjZXMoU3NlRmVhdHVyZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTc2VUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNpbmdsZSIpCisgICAgICAgIHB1YmxpYyBFdmVudE91dHB1dCBnZXRTaW5nbGVFdmVudCgpIHsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IG91dHB1dCA9IG5ldyBFdmVudE91dHB1dCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkuZGF0YShTdHJpbmcuY2xhc3MsICJzaW5nbGUiKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjbG9zZWQtc2luZ2xlIikKKyAgICAgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldENsb3NlZFNpbmdsZUV2ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IG91dHB1dCA9IG5ldyBFdmVudE91dHB1dCgpOworICAgICAgICAgICAgb3V0cHV0LndyaXRlKG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKFN0cmluZy5jbGFzcywgImNsb3NlZCIpLmJ1aWxkKCkpOworICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY2xvc2VkLWVtcHR5IikKKyAgICAgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldENsb3NlZEVtcHR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IG91dHB1dCA9IG5ldyBFdmVudE91dHB1dCgpOworICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY2hhcnNldCIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9ldmVudC1zdHJlYW07Y2hhcnNldD11dGYtOCIpCisgICAgICAgIHB1YmxpYyBFdmVudE91dHB1dCBnZXRTc2VXaXRoQ2hhcnNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBFdmVudE91dHB1dCBvdXRwdXQgPSBuZXcgRXZlbnRPdXRwdXQoKTsKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkuZGF0YShTdHJpbmcuY2xhc3MsICJjaGFyc2V0IikuYnVpbGQoKSk7CisgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjb21tZW50cy1vbmx5IikKKyAgICAgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldENvbW1lbnRzT25seVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBFdmVudE91dHB1dCBvdXRwdXQgPSBuZXcgRXZlbnRPdXRwdXQoKTsKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkuY29tbWVudCgiTm8gY29tbWVudCAjMSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgb3V0cHV0LndyaXRlKG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5jb21tZW50KCJObyBjb21tZW50ICMyIikuYnVpbGQoKSk7CisgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU3NlRXZlbnRBc1BsYWluU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L3NpbmdsZSIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBjb250YWluc1N0cmluZygic2luZ2xlIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yOTEyOiBTZW5kaW5nIGFuZCByZWNlaXZpbmcgY29tbWVudHMtb25seSBldmVudHMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRDb21tZW50c09ubHlTc2VFdmVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VULCAxNTAwMCk7CisgICAgICAgIGNsaWVudENvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCwgMCk7CisgICAgICAgIGNsaWVudENvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkFTWU5DX1RIUkVBRFBPT0xfU0laRSwgOCk7CisgICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkud2l0aENvbmZpZyhjbGllbnRDb25maWcpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMik7CisgICAgICAgIGZpbmFsIFF1ZXVlPFN0cmluZz4gZXZlbnRDb21tZW50cyA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8PigyKTsKKyAgICAgICAgV2ViVGFyZ2V0IHNpbmdsZSA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJ0ZXN0L2NvbW1lbnRzLW9ubHkiKTsKKyAgICAgICAgRXZlbnRTb3VyY2UgZXMgPSBFdmVudFNvdXJjZS50YXJnZXQoc2luZ2xlKS5idWlsZCgpOworICAgICAgICBlcy5yZWdpc3RlcihuZXcgRXZlbnRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChJbmJvdW5kRXZlbnQgaW5ib3VuZEV2ZW50KSB7CisgICAgICAgICAgICAgICAgZXZlbnRDb21tZW50cy5hZGQoaW5ib3VuZEV2ZW50LmdldENvbW1lbnQoKSk7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGJvb2xlYW4gbGF0Y2hUaW1lZE91dDsKKyAgICAgICAgYm9vbGVhbiBjbG9zZVRpbWVkT3V0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXMub3BlbigpOworICAgICAgICAgICAgbGF0Y2hUaW1lZE91dCA9IGxhdGNoLmF3YWl0KDUgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VUaW1lZE91dCA9IGVzLmNsb3NlKDUsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV2ZW50IGNvdW50IiwgMiwgZXZlbnRDb21tZW50cy5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAyOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb21tZW50IGRhdGEgb24gZXZlbnQgIyIgKyBpLCAiTm8gY29tbWVudCAjIiArIGksIGV2ZW50Q29tbWVudHMucG9sbCgpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJFdmVudCBsYXRjaCBoYXMgdGltZWQgb3V0IiwgbGF0Y2hUaW1lZE91dCk7CisgICAgICAgIGFzc2VydFRydWUoIkV2ZW50U291cmNlLmNsb3NlKCkgaGFzIHRpbWVkIG91dCIsIGNsb3NlVGltZWRPdXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRGcm9tQ2xvc2VkT3V0cHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBOZWVkIHRvIGRpc2FibGUgSFRUUCBLZWVwLUFsaXZlIHRvIHByZXZlbnQgdGhpcyB0ZXN0IGZyb20gaGFuZ2luZyBpbiBIdHRwVVJMQ29ubmVjdGlvbgorICAgICAgICAgKiBkdWUgdG8gYW4gYXR0ZW1wdCB0byByZWFkIGZyb20gYSBzdGFsZSwgb3V0LW9mLXN5bmMgY29ubmVjdGlvbiBjbG9zZWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgICogVGh1cyBzZXR0aW5nIHRoZSAiQ29ubmVjdGlvbjogY2xvc2UiIEhUVFAgaGVhZGVyIG9uIGFsbCByZXF1ZXN0cy4KKyAgICAgICAgICovCisgICAgICAgIFJlc3BvbnNlIHI7CisgICAgICAgIHIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2Nsb3NlZC1lbXB0eSIpLnJlcXVlc3QoKS5oZWFkZXIoIkNvbm5lY3Rpb24iLCAiY2xvc2UiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKS5pc0VtcHR5KCkpOworCisgICAgICAgIHIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2Nsb3NlZC1zaW5nbGUiKS5yZXF1ZXN0KCkuaGVhZGVyKCJDb25uZWN0aW9uIiwgImNsb3NlIikuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuY29udGFpbnMoImNsb3NlZCIpKTsKKworICAgICAgICAvLworCisgICAgICAgIEV2ZW50SW5wdXQgaW5wdXQ7CisgICAgICAgIGlucHV0ID0gdGFyZ2V0KCkucGF0aCgidGVzdC9jbG9zZWQtc2luZ2xlIikucmVxdWVzdCgpLmhlYWRlcigiQ29ubmVjdGlvbiIsICJjbG9zZSIpLmdldChFdmVudElucHV0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbG9zZWQiLCBpbnB1dC5yZWFkKCkucmVhZERhdGEoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBpbnB1dC5yZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGlucHV0LmlzQ2xvc2VkKCkpOworCisgICAgICAgIGlucHV0ID0gdGFyZ2V0KCkucGF0aCgidGVzdC9jbG9zZWQtZW1wdHkiKS5yZXF1ZXN0KCkuaGVhZGVyKCJDb25uZWN0aW9uIiwgImNsb3NlIikuZ2V0KEV2ZW50SW5wdXQuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgaW5wdXQucmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0Nsb3NlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTc2VDb250ZW50VHlwZVdpdGhDaGFyc2V0KCkgeworICAgICAgICAvKioKKyAgICAgICAgICogTmVlZCB0byBkaXNhYmxlIEhUVFAgS2VlcC1BbGl2ZSB0byBwcmV2ZW50IHRoaXMgdGVzdCBmcm9tIGhhbmdpbmcgaW4gSHR0cFVSTENvbm5lY3Rpb24KKyAgICAgICAgICogZHVlIHRvIGFuIGF0dGVtcHQgdG8gcmVhZCBmcm9tIGEgc3RhbGUsIG91dC1vZi1zeW5jIGNvbm5lY3Rpb24gY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICAqIFRodXMgc2V0dGluZyB0aGUgIkNvbm5lY3Rpb246IGNsb3NlIiBIVFRQIGhlYWRlciBvbiBhbGwgcmVxdWVzdHMuCisgICAgICAgICAqLworICAgICAgICBSZXNwb25zZSByOworICAgICAgICByID0gdGFyZ2V0KCkucGF0aCgidGVzdC9jaGFyc2V0IikucmVxdWVzdCgpLmhlYWRlcigiQ29ubmVjdGlvbiIsICJjbG9zZSIpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TWVkaWFUeXBlKCkuZ2V0UGFyYW1ldGVycygpLmdldCgiY2hhcnNldCIpLmVxdWFsc0lnbm9yZUNhc2UoInV0Zi04IikpOworICAgICAgICBmaW5hbCBFdmVudElucHV0IGV2ZW50SW5wdXQgPSByLnJlYWRFbnRpdHkoRXZlbnRJbnB1dC5jbGFzcyk7CisgICAgICAgIFN0cmluZyBldmVudERhdGEgPSBldmVudElucHV0LnJlYWQoKS5yZWFkRGF0YSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoYXJzZXQiLCBldmVudERhdGEpOworICAgICAgICBldmVudElucHV0LmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JpenpseUNvbm5lY3RvcldpdGhFdmVudFNvdXJjZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNsaWVudENvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCwgMTUwMDApOworICAgICAgICBjbGllbnRDb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDApOworICAgICAgICBjbGllbnRDb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUsIDgpOworICAgICAgICBjbGllbnRDb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpLndpdGhDb25maWcoY2xpZW50Q29uZmlnKS5idWlsZCgpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPiBldmVudERhdGEgPSBuZXcgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4oKTsKKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIFdlYlRhcmdldCBzaW5nbGUgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgidGVzdC9zaW5nbGUiKTsKKyAgICAgICAgRXZlbnRTb3VyY2UgZXMgPSBFdmVudFNvdXJjZS50YXJnZXQoc2luZ2xlKS5idWlsZCgpOworICAgICAgICBlcy5yZWdpc3RlcihuZXcgRXZlbnRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChJbmJvdW5kRXZlbnQgaW5ib3VuZEV2ZW50KSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGkgPSBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLnNldChpbmJvdW5kRXZlbnQucmVhZERhdGEoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBib29sZWFuIGxhdGNoVGltZWRPdXQ7CisgICAgICAgIGJvb2xlYW4gY2xvc2VUaW1lZE91dDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVzLm9wZW4oKTsKKyAgICAgICAgICAgIGxhdGNoVGltZWRPdXQgPSBsYXRjaC5hd2FpdCg1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlVGltZWRPdXQgPSBlcy5jbG9zZSg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBldmVudCBjb3VudCIsIDEsIGNvdW50ZXIuZ2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXZlbnQgZGF0YSIsICJzaW5nbGUiLCBldmVudERhdGEuZ2V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKCJFdmVudCBsYXRjaCBoYXMgdGltZWQgb3V0IiwgbGF0Y2hUaW1lZE91dCk7CisgICAgICAgIGFzc2VydFRydWUoIkV2ZW50U291cmNlLmNsb3NlKCkgaGFzIHRpbWVkIG91dCIsIGNsb3NlVGltZWRPdXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0V2ZW50U291cmNlV2l0aE5hbWVkRXZlbnRzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvRXZlbnRTb3VyY2VXaXRoTmFtZWRFdmVudHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmOWVkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0V2ZW50U291cmNlV2l0aE5hbWVkRXZlbnRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50T3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudFNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuSW5ib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5PdXRib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIGhhbmRsaW5nIG9mIFNTRXMgd2l0aCBuYW1lIGRlZmluZWQgaW4ge0BsaW5rIEV2ZW50U291cmNlfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgRXZlbnRTb3VyY2VXaXRoTmFtZWRFdmVudHNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0VfTkFNRSA9ICJtZXNzYWdlLXRvLWNsaWVudCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhTc2VSZXNvdXJjZS5jbGFzcywgU3NlRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfQ09VTlQgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNU0dfQ09VTlQpOworCisgICAgQFBhdGgoImV2ZW50cyIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3NlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKFNzZUZlYXR1cmUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgICAgICBwdWJsaWMgRXZlbnRPdXRwdXQgZ2V0U2VydmVyU2VudEV2ZW50cygpIHsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IGV2ZW50T3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGF0Y2guZ2V0Q291bnQoKSA+IDApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgbWVzc2FnZSB3aXRoIG5hbWUgIm1lc3NhZ2UtdG8tY2xpZW50IiAtPiBzaG91bGQgYmUgcmVhZCBieSB0aGUgY2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRPdXRwdXQud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSgibWVzc2FnZS10by1jbGllbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lZGlhVHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoSW50ZWdlci5jbGFzcywgaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgYW5vdGhlciBldmVudCB3aXRoIG5hbWUgImZvbyIgLT4gc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50T3V0cHV0LndyaXRlKG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUoImZvbyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShTdHJpbmcuY2xhc3MsICJiYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBhbm90aGVyIHVuLW1hbWVkIGV2ZW50IC0+IHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZSBjbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE91dHB1dC53cml0ZShuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGUoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKFN0cmluZy5jbGFzcywgImJheiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIHdyaXRpbmcgdGhlIGV2ZW50LiIsIGUpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9DbG9zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIGNsb3NpbmcgdGhlIGV2ZW50IG91dHB1dC4iLCBpb0Nsb3NlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gZXZlbnRPdXRwdXQ7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhFdmVudFNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlbmRwb2ludCA9IHRhcmdldCgpLnJlZ2lzdGVyKFNzZUZlYXR1cmUuY2xhc3MpLnBhdGgoImV2ZW50cyIpOworICAgICAgICBFdmVudFNvdXJjZSBldmVudFNvdXJjZSA9IEV2ZW50U291cmNlLnRhcmdldChlbmRwb2ludCkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY291bnQgPSBuZXcgQ291bnREb3duTGF0Y2goTVNHX0NPVU5UKTsKKworICAgICAgICBmaW5hbCBFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEV2ZW50TGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoSW5ib3VuZEV2ZW50IGluYm91bmRFdmVudCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgZGF0YSA9IGluYm91bmRFdmVudC5yZWFkRGF0YShJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluYm91bmRFdmVudC5nZXROYW1lKCkgKyAiOyAiICsgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU1NFX05BTUUsIGluYm91bmRFdmVudC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1TR19DT1VOVCAtIGNvdW50LmdldENvdW50KCksIGRhdGEuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50LmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gZGVzZXJpYWxpemluZyBvZiBkYXRhLiIsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGV2ZW50U291cmNlLnJlZ2lzdGVyKGxpc3RlbmVyLCAibWVzc2FnZS10by1jbGllbnQiKTsKKyAgICAgICAgZXZlbnRTb3VyY2Uub3BlbigpOworICAgICAgICBmaW5hbCBib29sZWFuIHNlbnQgPSBsYXRjaC5hd2FpdCg1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkF3YWl0aW5nIGZvciBTU0UgbWVzc2FnZSBoYXMgdGltZW91dC4gTm90IGFsbCBtZXNzYWdlIHdlcmUgc2VudC4iLCBzZW50KTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYW5kbGVkID0gY291bnQuYXdhaXQoNSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBd2FpdGluZyBmb3IgU1NFIG1lc3NhZ2UgaGFzIHRpbWVvdXQuIE5vdCBhbGwgbWVzc2FnZSB3ZXJlIGhhbmRsZWQgYnkgdGhlIGxpc3RlbmVyLiIsIGhhbmRsZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0dlbmVyaWNFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9HZW5lcmljRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDNlOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9HZW5lcmljRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zc2U7CisKK2ltcG9ydCBqYXZhZngudXRpbC5QYWlyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNpbms7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U291cmNlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBHZW5lcmljRW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDIwOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhHZW5lcmljRW50aXR5VGVzdC5TU0VHZW5lcmljRW50aXR5UmVzb3VyY2UuY2xhc3MsIExpc3RQYWlyTUJSVy5jbGFzcywgUGFpck1CUlcuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNTdHJpbmcoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgc3NlVGFyZ2V0ID0gdGFyZ2V0KCJnZW5lcmljZW50aXR5cmVzb3VyY2Uvc3RyaW5nIik7CisgICAgICAgIENvdW50RG93bkxhdGNoIGNvdW50RG93bkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBNZXNzYWdlTGF0Y2g8U3RyaW5nPiBtZXNzYWdlTGF0Y2ggPSBuZXcgTWVzc2FnZUxhdGNoPD4oY291bnREb3duTGF0Y2gpOworICAgICAgICB0cnkgKFNzZUV2ZW50U291cmNlIHNvdXJjZSA9IFNzZUV2ZW50U291cmNlLnRhcmdldChzc2VUYXJnZXQpLmJ1aWxkKCkpIHsKKyAgICAgICAgICAgIHNvdXJjZS5yZWdpc3RlcihldmVudCAtPiBtZXNzYWdlTGF0Y2guY29uc3VtZShldmVudC5yZWFkRGF0YSgpKSk7CisgICAgICAgICAgICBzb3VyY2Uub3BlbigpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudERvd25MYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNpbmR5IiwgbWVzc2FnZUxhdGNoLmRhdGEoKS5nZXQoMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY1BhaXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgc3NlVGFyZ2V0ID0gdGFyZ2V0KCJnZW5lcmljZW50aXR5cmVzb3VyY2UvcGFpciIpLnJlZ2lzdGVyKFBhaXJNQlJXLmNsYXNzKTsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIE1lc3NhZ2VMYXRjaDxQYWlyPFN0cmluZywgSW50ZWdlcj4+IG1lc3NhZ2VMYXRjaCA9IG5ldyBNZXNzYWdlTGF0Y2g8Pihjb3VudERvd25MYXRjaCk7CisgICAgICAgIHRyeSAoU3NlRXZlbnRTb3VyY2Ugc291cmNlID0gU3NlRXZlbnRTb3VyY2UudGFyZ2V0KHNzZVRhcmdldCkuYnVpbGQoKSkgeworICAgICAgICAgICAgc291cmNlLnJlZ2lzdGVyKGV2ZW50IC0+IG1lc3NhZ2VMYXRjaC5jb25zdW1lKGV2ZW50LnJlYWREYXRhKFBhaXIuY2xhc3MpKSk7CisgICAgICAgICAgICBzb3VyY2Uub3BlbigpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudERvd25MYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgSW50ZWdlcj4gcGFpciA9IG1lc3NhZ2VMYXRjaC5kYXRhKCkuZ2V0KDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDaW5keSIsIHBhaXIuZ2V0S2V5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLCBwYWlyLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljTGlzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBzc2VUYXJnZXQgPSB0YXJnZXQoImdlbmVyaWNlbnRpdHlyZXNvdXJjZS9saXN0IikucmVnaXN0ZXIoTGlzdFBhaXJNQlJXLmNsYXNzKTsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMik7CisgICAgICAgIE1lc3NhZ2VMYXRjaDxQYWlyPFN0cmluZywgSW50ZWdlcj4+IG1lc3NhZ2VMYXRjaCA9IG5ldyBNZXNzYWdlTGF0Y2g8Pihjb3VudERvd25MYXRjaCk7CisgICAgICAgIHRyeSAoU3NlRXZlbnRTb3VyY2Ugc291cmNlID0gU3NlRXZlbnRTb3VyY2UudGFyZ2V0KHNzZVRhcmdldCkuYnVpbGQoKSkgeworICAgICAgICAgICAgc291cmNlLnJlZ2lzdGVyKGV2ZW50IC0+IG1lc3NhZ2VMYXRjaC5jb25zdW1lKChMaXN0PFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4pIGV2ZW50LnJlYWREYXRhKExpc3QuY2xhc3MpKSk7CisgICAgICAgICAgICBzb3VyY2Uub3BlbigpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudERvd25MYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgSW50ZWdlcj4gY2luZHkgPSBtZXNzYWdlTGF0Y2guZGF0YSgpLmdldCgwKTsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiBqYWNrID0gbWVzc2FnZUxhdGNoLmRhdGEoKS5nZXQoMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNpbmR5IiwgY2luZHkuZ2V0S2V5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLCBjaW5keS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKYWNrIiwgamFjay5nZXRLZXkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzIsIGphY2suZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBAUGF0aCgiZ2VuZXJpY2VudGl0eXJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNTRUdlbmVyaWNFbnRpdHlSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN0cmluZyIpCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgICAgICBwdWJsaWMgdm9pZCBzZW5kU3RyaW5nKEBDb250ZXh0IFNzZUV2ZW50U2luayBzaW5rLCBAQ29udGV4dCBTc2Ugc3NlKSB7CisgICAgICAgICAgICBHZW5lcmljRW50aXR5PFN0cmluZz4gZ2VzID0gbmV3IEdlbmVyaWNFbnRpdHk8U3RyaW5nPigiQ2luZHkiKSB7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJ5IChTc2VFdmVudFNpbmsgcyA9IHNpbmspIHsKKyAgICAgICAgICAgICAgICBzLnNlbmQoc3NlLm5ld0V2ZW50QnVpbGRlcigpLmRhdGEoZ2VzKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInBhaXIiKQorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZFBhaXIoQENvbnRleHQgU3NlRXZlbnRTaW5rIHNpbmssIEBDb250ZXh0IFNzZSBzc2UpIHsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiBwZXJzb24gPSBuZXcgUGFpcjw+KCJDaW5keSIsIDMwKTsKKyAgICAgICAgICAgIEdlbmVyaWNFbnRpdHk8UGFpcjxTdHJpbmcsIEludGVnZXI+PiBlbnRpdHkgPSBuZXcgR2VuZXJpY0VudGl0eTxQYWlyPFN0cmluZywgSW50ZWdlcj4+KHBlcnNvbikgeworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRyeSAoU3NlRXZlbnRTaW5rIHMgPSBzaW5rKSB7CisgICAgICAgICAgICAgICAgcy5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5kYXRhKGVudGl0eSkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsaXN0IikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRMaXN0KEBDb250ZXh0IFNzZUV2ZW50U2luayBzaW5rLCBAQ29udGV4dCBTc2Ugc3NlKSB7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgSW50ZWdlcj4gcGVyc29uMSA9IG5ldyBQYWlyPD4oIkNpbmR5IiwgMzApOworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIEludGVnZXI+IHBlcnNvbjIgPSBuZXcgUGFpcjw+KCJKYWNrIiwgMzIpOworICAgICAgICAgICAgTGlzdDxQYWlyPFN0cmluZywgSW50ZWdlcj4+IHBlb3BsZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgIHBlb3BsZS5hZGQocGVyc29uMSk7CisgICAgICAgICAgICBwZW9wbGUuYWRkKHBlcnNvbjIpOworICAgICAgICAgICAgR2VuZXJpY0VudGl0eTxMaXN0PFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4+IGVudGl0eSA9IG5ldyBHZW5lcmljRW50aXR5PExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+Pj4ocGVvcGxlKSB7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJ5IChTc2VFdmVudFNpbmsgcyA9IHNpbmspIHsKKyAgICAgICAgICAgICAgICBzLnNlbmQoc3NlLm5ld0V2ZW50QnVpbGRlcigpLmRhdGEoZW50aXR5KS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhaXJNQlJXIGltcGxlbWVudHMKKyAgICAgICAgICAgIE1lc3NhZ2VCb2R5V3JpdGVyPFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4sIE1lc3NhZ2VCb2R5UmVhZGVyPFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gUGFpci5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGFpcjxTdHJpbmcsIEludGVnZXI+IHJlYWRGcm9tKENsYXNzPFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbR2VuZXJpY0VudGl0eVRlc3QuQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgZW50aXR5U3RyZWFtLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiByZWFkRnJvbShuZXcgU3RyaW5nKGJ1ZmZlciwgQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpKS50cmltKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiByZWFkRnJvbShTdHJpbmcgZnJvbSkgeworICAgICAgICAgICAgU3RyaW5nW10gc3BsaXQgPSBmcm9tLnNwbGl0KCIsIiwgMik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhaXI8U3RyaW5nLCBJbnRlZ2VyPihzcGxpdFswXSwgSW50ZWdlci5wYXJzZUludChzcGxpdFsxXSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gUGFpci5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiBzdHJpbmdJbnRlZ2VyUGFpciwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdyaXRlVG8oc3RyaW5nSW50ZWdlclBhaXIsIGVudGl0eVN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCB3cml0ZVRvKFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiBzdHJpbmdJbnRlZ2VyUGFpciwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuYXBwZW5kKHN0cmluZ0ludGVnZXJQYWlyLmdldEtleSgpKS5hcHBlbmQoIiwiKS5hcHBlbmQoc3RyaW5nSW50ZWdlclBhaXIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcyhDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3RQYWlyTUJSVyBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+Pj4sCisgICAgICAgICAgICBNZXNzYWdlQm9keVJlYWRlcjxMaXN0PFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IExpc3QuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+PiByZWFkRnJvbShDbGFzczxMaXN0PFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsyMF07CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ucmVhZChidWZmZXIpOworICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihuZXcgU3RyaW5nKGJ1ZmZlciwgQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpKS50cmltKCksICI7IiwgZmFsc2UpOworICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKFBhaXJNQlJXLnJlYWRGcm9tKHN0Lm5leHRUb2tlbigpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IExpc3QuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhMaXN0PFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4gcGFpcnMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmb3IgKFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiBwYWlyIDogcGFpcnMpIHsKKyAgICAgICAgICAgICAgICBQYWlyTUJSVy53cml0ZVRvKHBhaXIsIGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCI7Ii5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lc3NhZ2VMYXRjaDxUPiB7CisgICAgICAgIHByaXZhdGUgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2g7CisgICAgICAgIHByaXZhdGUgTGlzdDxUPiBkYXRhID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIHByaXZhdGUgTWVzc2FnZUxhdGNoKENvdW50RG93bkxhdGNoIGNvdW50RG93bkxhdGNoKSB7CisgICAgICAgICAgICB0aGlzLmNvdW50RG93bkxhdGNoID0gY291bnREb3duTGF0Y2g7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY29uc3VtZShMaXN0PFQ+IGxpc3QpIHsKKyAgICAgICAgICAgIGZvciAoVCBvIDogbGlzdCkgeworICAgICAgICAgICAgICAgIGRhdGEuYWRkKG8pOworICAgICAgICAgICAgICAgIGNvdW50RG93bkxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNvbnN1bWUoVCBvKSB7CisgICAgICAgICAgICBkYXRhLmFkZChvKTsKKyAgICAgICAgICAgIGNvdW50RG93bkxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFQ+IGRhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL1NzZUN1c3RvbUV2ZW50SW1wbFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL1NzZUN1c3RvbUV2ZW50SW1wbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzU4ZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvU3NlQ3VzdG9tRXZlbnRJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zc2U7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuSW5ib3VuZFNzZUV2ZW50OworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5PdXRib3VuZFNzZUV2ZW50OworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNpbms7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U291cmNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudFNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IHRoYXQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5PdXRib3VuZEV2ZW50V3JpdGVyfSB3b3JrcyB3aXRoIGN1c3RvbQorICoge0BsaW5rIGphdmF4LndzLnJzLnNzZS5PdXRib3VuZFNzZUV2ZW50fSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTc2VDdXN0b21FdmVudEltcGxUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NFX0VWRU5UX05BTUUgPSAiY3VzdG9tLW1lc3NhZ2UiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTc2VSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoImV2ZW50cyIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3NlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgICAgIHB1YmxpYyB2b2lkIGdldFNlcnZlclNlbnRFdmVudHMoQENvbnRleHQgZmluYWwgU3NlRXZlbnRTaW5rIGV2ZW50U2luaykgeworICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQoKCkgLT4geworICAgICAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKG5ldyBNeU91dGJvdW5kRXZlbnQoImZvbyIpKTsKKyAgICAgICAgICAgICAgICBldmVudFNpbmsuc2VuZChuZXcgTXlPdXRib3VuZEV2ZW50KCJiYXIiKSk7CisgICAgICAgICAgICAgICAgZXZlbnRTaW5rLnNlbmQobmV3IE15T3V0Ym91bmRFdmVudCgiYmF6IikpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoSmF4UnNBUEkoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlbmRwb2ludCA9IHRhcmdldCgpLnBhdGgoImV2ZW50cyIpOworICAgICAgICBmaW5hbCBMaXN0PEluYm91bmRTc2VFdmVudD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB0cnkgKGZpbmFsIFNzZUV2ZW50U291cmNlIGV2ZW50U291cmNlID0gU3NlRXZlbnRTb3VyY2UudGFyZ2V0KGVuZHBvaW50KS5idWlsZCgpKSB7CisgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCByZWNlaXZlZExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDMpOworICAgICAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIoKGV2ZW50KSAtPiB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoZXZlbnQpOworICAgICAgICAgICAgICAgIHJlY2VpdmVkTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgZXZlbnRTb3VyY2Uub3BlbigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxSZWNlaXZlZCA9IHJlY2VpdmVkTGF0Y2guYXdhaXQoNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGFsbFJlY2VpdmVkKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgcmVzdWx0cy5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZm9vIiwgcmVzdWx0cy5nZXQoMCkucmVhZERhdGEoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXN1bHRzLmdldCgxKS5yZWFkRGF0YSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJheiIsIHJlc3VsdHMuZ2V0KDIpLnJlYWREYXRhKCkpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aEplcnNleUFQSSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlbmRwb2ludCA9IHRhcmdldCgpLnBhdGgoImV2ZW50cyIpOworICAgICAgICBmaW5hbCBFdmVudFNvdXJjZSBldmVudFNvdXJjZSA9IEV2ZW50U291cmNlLnRhcmdldChlbmRwb2ludCkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggcmVjZWl2ZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDMpOworCisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmFsIEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBpbmJvdW5kRXZlbnQgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChpbmJvdW5kRXZlbnQucmVhZERhdGEoKSk7CisgICAgICAgICAgICAgICAgcmVjZWl2ZUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU1NFX0VWRU5UX05BTUUsIGluYm91bmRFdmVudC5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIGRlc2VyaWFsaXppbmcgb2YgZGF0YS4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGV2ZW50U291cmNlLnJlZ2lzdGVyKGxpc3RlbmVyLCBTU0VfRVZFTlRfTkFNRSk7CisgICAgICAgIGV2ZW50U291cmNlLm9wZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVjZWl2ZUxhdGNoLmF3YWl0KDUwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZm9vIiwgcmVzdWx0cy5nZXQoMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXN1bHRzLmdldCgxKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJheiIsIHJlc3VsdHMuZ2V0KDIpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTXlPdXRib3VuZEV2ZW50IGltcGxlbWVudHMgT3V0Ym91bmRTc2VFdmVudCB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGF0YTsKKworICAgICAgICBwdWJsaWMgTXlPdXRib3VuZEV2ZW50KFN0cmluZyBkYXRhKSB7CisgICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHlwZSBnZXRHZW5lcmljVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1lZGlhVHlwZSBnZXRNZWRpYVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIFNTRV9FVkVOVF9OQU1FOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRSZWNvbm5lY3REZWxheSgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVjb25uZWN0RGVsYXlTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Tc2VFdmVudFNpbmtUb0V2ZW50U291cmNlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvU3NlRXZlbnRTaW5rVG9FdmVudFNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmM5YWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvU3NlRXZlbnRTaW5rVG9FdmVudFNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc3NlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLkluYm91bmRTc2VFdmVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNpbms7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U291cmNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudFNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBKQVgtUlMge0BsaW5rIFNzZUV2ZW50U291cmNlfSBhbmQge0BsaW5rIFNzZUV2ZW50U2lua30gdGVzdC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTc2VFdmVudFNpbmtUb0V2ZW50U291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVHRVJfU1NFX05BTUUgPSAiaW50ZWdlci1tZXNzYWdlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihTc2VFdmVudFNpbmtUb0V2ZW50U291cmNlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTc2VSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19DT1VOVCA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIENvdW50RG93bkxhdGNoIHRyYW5zbWl0TGF0Y2g7CisKKyAgICBAUGF0aCgiZXZlbnRzIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTc2VSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0U2VydmVyU2VudEV2ZW50cyhAQ29udGV4dCBmaW5hbCBTc2VFdmVudFNpbmsgZXZlbnRTaW5rLCBAQ29udGV4dCBmaW5hbCBTc2Ugc3NlKSB7CisgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICh0cmFuc21pdExhdGNoLmdldENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lKElOVEVHRVJfU1NFX05BTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lZGlhVHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKEludGVnZXIuY2xhc3MsIGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgYW5vdGhlciBldmVudCB3aXRoIG5hbWUgImZvbyIgLT4gc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGNsaWVudAorICAgICAgICAgICAgICAgICAgICBldmVudFNpbmsuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSgiZm9vIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoU3RyaW5nLmNsYXNzLCAiYmFyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBhbm90aGVyIHVubmFtZWQgZXZlbnQgLT4gc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGNsaWVudAorICAgICAgICAgICAgICAgICAgICBldmVudFNpbmsuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoU3RyaW5nLmNsYXNzLCAiYmF6IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhTaW1wbGVTdWJzY3JpYmVyKCkgeworICAgICAgICB0cmFuc21pdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1TR19DT1VOVCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlbmRwb2ludCA9IHRhcmdldCgpLnBhdGgoImV2ZW50cyIpOworICAgICAgICBmaW5hbCBMaXN0PEluYm91bmRTc2VFdmVudD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB0cnkgKGZpbmFsIFNzZUV2ZW50U291cmNlIGV2ZW50U291cmNlID0gU3NlRXZlbnRTb3VyY2UudGFyZ2V0KGVuZHBvaW50KS5idWlsZCgpKSB7CisgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCByZWNlaXZlZExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDMgKiBNU0dfQ09VTlQpOworICAgICAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIoKGV2ZW50KSAtPiB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoZXZlbnQpOworICAgICAgICAgICAgICAgIHJlY2VpdmVkTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgZXZlbnRTb3VyY2Uub3BlbigpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxUcmFuc21pdHRlZCA9IHRyYW5zbWl0TGF0Y2guYXdhaXQoNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxsUmVjZWl2ZWQgPSByZWNlaXZlZExhdGNoLmF3YWl0KDUwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxUcmFuc21pdHRlZCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShhbGxSZWNlaXZlZCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwLCByZXN1bHRzLnNpemUoKSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoSmVyc2V5QXBpKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50ID0gdGFyZ2V0KCkucGF0aCgiZXZlbnRzIik7CisgICAgICAgIGZpbmFsIEV2ZW50U291cmNlIGV2ZW50U291cmNlID0gRXZlbnRTb3VyY2UudGFyZ2V0KGVuZHBvaW50KS5idWlsZCgpOworICAgICAgICB0cmFuc21pdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1TR19DT1VOVCk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHJlY2VpdmVMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNU0dfQ09VTlQpOworCisgICAgICAgIGZpbmFsIExpc3Q8SW50ZWdlcj4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmaW5hbCBFdmVudExpc3RlbmVyIGxpc3RlbmVyID0gaW5ib3VuZEV2ZW50IC0+IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoaW5ib3VuZEV2ZW50LnJlYWREYXRhKEludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICByZWNlaXZlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJTlRFR0VSX1NTRV9OQU1FLCBpbmJvdW5kRXZlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hlbiBkZXNlcmlhbGl6aW5nIG9mIGRhdGEuIiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBldmVudFNvdXJjZS5yZWdpc3RlcihsaXN0ZW5lciwgSU5URUdFUl9TU0VfTkFNRSk7CisgICAgICAgIGV2ZW50U291cmNlLm9wZW4oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodHJhbnNtaXRMYXRjaC5hd2FpdCg1MDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVjZWl2ZUxhdGNoLmF3YWl0KDUwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwLCByZXN1bHRzLnNpemUoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoRXZlbnRTb3VyY2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICB0cmFuc21pdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDIgKiBNU0dfQ09VTlQpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZW5kcG9pbnQgPSB0YXJnZXQoKS5wYXRoKCJldmVudHMiKTsKKyAgICAgICAgZmluYWwgU3NlRXZlbnRTb3VyY2UgZXZlbnRTb3VyY2UgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQoZW5kcG9pbnQpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY291bnQxID0gbmV3IENvdW50RG93bkxhdGNoKDMgKiBNU0dfQ09VTlQpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBjb3VudDIgPSBuZXcgQ291bnREb3duTGF0Y2goMyAqIE1TR19DT1VOVCk7CisKKyAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIobmV3IEluYm91bmRIYW5kbGVyKCJjb25zdW1lcjEiLCBjb3VudDEpKTsKKyAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIobmV3IEluYm91bmRIYW5kbGVyKCJjb25zdW1lcjIiLCBjb3VudDIpKTsKKworICAgICAgICBldmVudFNvdXJjZS5vcGVuKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VudCA9IHRyYW5zbWl0TGF0Y2guYXdhaXQoNSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBd2FpdGluZyBmb3IgU1NFIG1lc3NhZ2UgaGFzIHRpbWVvdXQuIE5vdCBhbGwgbWVzc2FnZSB3ZXJlIHNlbnQuIiwgc2VudCk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYW5kbGVkMiA9IGNvdW50Mi5hd2FpdCg1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIkF3YWl0aW5nIGZvciBTU0UgbWVzc2FnZSBoYXMgdGltZW91dC4gTm90IGFsbCBtZXNzYWdlIHdlcmUgaGFuZGxlZCBieSBldmVudFNvdXJjZTIuIiwgaGFuZGxlZDIpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFuZGxlZDEgPSBjb3VudDEuYXdhaXQoNSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJBd2FpdGluZyBmb3IgU1NFIG1lc3NhZ2UgaGFzIHRpbWVvdXQuIE5vdCBhbGwgbWVzc2FnZSB3ZXJlIGhhbmRsZWQgYnkgZXZlbnRTb3VyY2UxLiIsIGhhbmRsZWQxKTsKKworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgSW5ib3VuZEhhbmRsZXIgaW1wbGVtZW50cyBDb25zdW1lcjxJbmJvdW5kU3NlRXZlbnQ+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBJbmJvdW5kSGFuZGxlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2gpIHsKKyAgICAgICAgICAgIHRoaXMubGF0Y2ggPSBsYXRjaDsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIEluYm91bmRTc2VFdmVudCBpbmJvdW5kU3NlRXZlbnQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKElOVEVHRVJfU1NFX05BTUUuZXF1YWxzKGluYm91bmRTc2VFdmVudC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgZGF0YSA9IGluYm91bmRTc2VFdmVudC5yZWFkRGF0YShJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgiWyVzXSBJbnRlZ2VyIGRhdGEgcmVjZWl2ZWQ6IFtpZD0lcyBuYW1lPSVzIGNvbW1lbnQ9JXMgcmVjb25uZWN0RGVsYXk9JWQgdmFsdWU9JWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYm91bmRTc2VFdmVudC5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYm91bmRTc2VFdmVudC5nZXROYW1lKCksIGluYm91bmRTc2VFdmVudC5nZXRDb21tZW50KCksIGluYm91bmRTc2VFdmVudC5nZXRSZWNvbm5lY3REZWxheSgpLCBkYXRhKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSBpbmJvdW5kU3NlRXZlbnQucmVhZERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgiWyVzXSBTdHJpbmcgZGF0YSByZWNlaXZlZDogW2lkPSVzIG5hbWU9JXMgY29tbWVudD0lcyByZWNvbm5lY3REZWxheT0lZCB2YWx1ZT0lc10iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ib3VuZFNzZUV2ZW50LmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ib3VuZFNzZUV2ZW50LmdldE5hbWUoKSwgaW5ib3VuZFNzZUV2ZW50LmdldENvbW1lbnQoKSwgaW5ib3VuZFNzZUV2ZW50LmdldFJlY29ubmVjdERlbGF5KCksIGRhdGEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gZGVzZXJpYWxpemluZyB0aGUgZGF0YS4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0plcnNleV95ZWxsb3cucG5nIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9KZXJzZXlfeWVsbG93LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc0Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9KZXJzZXlfeWVsbG93LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2R1a2Vfcm9ja2V0LmdpZiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZHVrZV9yb2NrZXQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDMwNGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2R1a2Vfcm9ja2V0LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L211bHRpcGFydC10ZXN0Y2FzZS50eHQgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L211bHRpcGFydC10ZXN0Y2FzZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1NTdjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvbXVsdGlwYXJ0LXRlc3RjYXNlLnR4dApAQCAtMCwwICsxLDExIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTdkYzk0MTUyMDg4OAorQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJ0ZXh0IgorCitiaGhrbGIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tN2RjOTQxNTIwODg4CitDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZpbGUiOyBmaWxlbmFtZT0iQzpcamF2YVxwcm9qZWN0c1xtdWx0aXBhcnQtdGVzdGNhc2VccG9tLnhtbCIKK0NvbnRlbnQtVHlwZTogdGV4dC94bWwKKworPHByb2plY3QvPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTdkYzk0MTUyMDg4OC0tCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L3h4ZS50eHQgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L3h4ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkMjdiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkveHhlLnR4dApAQCAtMCwwICsxIEBACitDT01QUk9NSVNFRApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxY2FmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3siQHR5cGUiOiJEb2ciLCJuYW1lIjoiRmlmaSJ9LHsiQHR5cGUiOiJDYXQiLCJuYW1lIjoiRGFpc3kiLCJuaWNrTmFtZSI6bnVsbH1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MWNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3siQHR5cGUiOiJEb2ciLCJuYW1lIjoiRmlmaSJ9LHsiQHR5cGUiOiJDYXQiLCJuYW1lIjoiRGFpc3kiLCJuaWNrTmFtZSI6bnVsbH1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmIzNzAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2F0cyI6W3sibmFtZSI6IkZvbyIsIm5pY2tOYW1lIjoiS2l0dHkifSx7Im5hbWUiOiJCYXIiLCJuaWNrTmFtZSI6IlB1c3MifV0sInByb3AiOiJ0ZXN0UHJvcCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmIzNzAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjYXRzIjpbeyJuYW1lIjoiRm9vIiwibmlja05hbWUiOiJLaXR0eSJ9LHsibmFtZSI6IkJhciIsIm5pY2tOYW1lIjoiUHVzcyJ9XSwicHJvcCI6InRlc3RQcm9wIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWUxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImF0dHIiOiJhdmFsIiwidmFsdWUiOiJwdmFsIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVlMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImF0dHIiOiJhdmFsIiwidmFsdWUiOiJwdmFsIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MmM0MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImZpbGxlcjEiOiIxMTEiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9LHsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifV0sImZpbGxlcjIiOiIyMjIiLCJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RkNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LHsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOiJoZWxsbyBkb2xseSIsImEyIjozMTQxNTkyNiwiZmlsbGVyMSI6IjExMSIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifV0sImZpbGxlcjIiOiIyMjIiLCJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkNjM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbgpAQCAtMCwwICsxIEBACit7ImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJjIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDYzNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJjIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NGEyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjpudWxsLCJhMiI6bnVsbCwibGlzdCI6W10sImIiOnsidXJpIjpudWxsLCJzMSI6bnVsbCwiaSI6bnVsbCwiaiI6bnVsbH19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjU0YTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6bnVsbCwiYTIiOm51bGwsImxpc3QiOltdLCJiIjp7InVyaSI6bnVsbCwiczEiOm51bGwsImkiOm51bGwsImoiOm51bGx9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MmM0MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOiJoZWxsbyBkb2xseSIsImEyIjozMTQxNTkyNiwiZmlsbGVyMSI6IjExMSIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGNmMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxPbmx5IjpudWxsfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGNmMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbE9ubHkiOm51bGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTE5OWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eUJlYW4iOm51bGwsImMiOiJmb28iLCJkIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTE5OWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5QmVhbiI6bnVsbCwiYyI6ImZvbyIsImQiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sib25lIjoiXHRvbmVcblx0YmlnIiwidHdvIjoiaGFmxIwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRlM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sib25lIjoiXHRvbmVcblx0YmlnIiwidHdvIjoiaGFmxIwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYjA5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sid2VpZ2h0IjpbIjFrZyIsIjJrZyJdLCJjb2xvciI6InJlZCIsIm5hbWUiOiJidW1wZXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMmIwOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sid2VpZ2h0IjpbIjFrZyIsIjJrZyJdLCJjb2xvciI6InJlZCIsIm5hbWUiOiJidW1wZXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ1NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaW50QXJyYXkiOls0XSwiaW50ZWdlckFycmF5IjpbM10sIm51bWJlciI6OH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImludEFycmF5IjpbNF0sImludGVnZXJBcnJheSI6WzNdLCJudW1iZXIiOjh9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjI4NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJvYmplY3RzIjpbeyJAdHlwZSI6IkNvbG9ySG9sZGVyIiwiY29sb3JzIjpbIlJFRCIsIkJMVUUiXX0seyJAdHlwZSI6IkNvbG9ySG9sZGVyIiwiY29sb3JzIjpbIkdSRUVOIl19XSwib2Zmc2V0IjowLCJ0b3RhbCI6Mn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjI4NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im9iamVjdHMiOlt7IkB0eXBlIjoiQ29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiUkVEIiwiQkxVRSJdfSx7IkB0eXBlIjoiQ29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiR1JFRU4iXX1dLCJvZmZzZXQiOjAsInRvdGFsIjoyfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWNhZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6WyIxIl0sImQiOiIyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1Y2FkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImEiOlsiMSJdLCJkIjoiMiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE5ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eSI6W119ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhOWY1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eSI6W119ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5MTYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eSI6bnVsbH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5MTYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InByb3BlcnR5IjpudWxsfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5MTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibXlNZXNzYWdlIjpbeyJpZCI6IjAiLCJ0ZXh0Ijoib2sifSx7ImlkIjoiMSIsInRleHQiOiJvayJ9XSwibXlFcnJvciI6eyJpZCI6Ii0xIiwiZGVzYyI6ImVycm9yIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5MTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJteU1lc3NhZ2UiOlt7ImlkIjoiMCIsInRleHQiOiJvayJ9LHsiaWQiOiIxIiwidGV4dCI6Im9rIn1dLCJteUVycm9yIjp7ImlkIjoiLTEiLCJkZXNjIjoiZXJyb3IifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODZkNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImEiOiJmb28iLCJiIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzZTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7ImF0dHIiOiJ2YWx1ZSIsImEiOiJmb28iLCJiIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2U5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImF0dHIiOiJ2YWx1ZSIsImEiOiJmb28iLCJiIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzg2ZDVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImEiOiJmb28iLCJiIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4Y2QzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmciOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGNkM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmciOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QZXJzb24uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RjMDYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QZXJzb24uanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWUiOiJKb2UgU2NobW8iLCJjaGlsZHJlbiI6W3sibmFtZSI6IkppbGwgU2NobW8ifSx7Im5hbWUiOiJKYWNrIFNjaG1vIn1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RjMDYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibmFtZSI6IkpvZSBTY2htbyIsImNoaWxkcmVuIjpbeyJuYW1lIjoiSmlsbCBTY2htbyJ9LHsibmFtZSI6IkphY2sgU2NobW8ifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Qb2pvQW5pbWFsTGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Qb2pvQW5pbWFsTGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjgxZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxzIjpbeyJAdHlwZSI6IlBvam9Eb2ciLCJuYW1lIjoiRmlmaSJ9LHsiQHR5cGUiOiJQb2pvQ2F0IiwibmFtZSI6IkRhaXN5Iiwibmlja05hbWUiOm51bGx9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjgxZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiUG9qb0RvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IlBvam9DYXQiLCJuYW1lIjoiRGFpc3kiLCJuaWNrTmFtZSI6bnVsbH1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sidmFsdWUiOiJzb21lIHRleHR1YWwgY29udGVudCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ2YWx1ZSI6InNvbWUgdGV4dHVhbCBjb250ZW50In0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0OWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbgpAQCAtMCwwICsxIEBACit7ImFnZW50VUlEIjoiYWdlbnRLb2NrYSIsInJlcXVlc3RUaW1lIjoxMjM0fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0OWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYWdlbnRVSUQiOiJhZ2VudEtvY2thIiwicmVxdWVzdFRpbWUiOjEyMzR9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM4MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjaGlsZCI6InNpbXBsZSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2ODM0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjgzNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4OTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlY2EyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJ2YWx1ZSI6ImNoYXJhY3RlcnMifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlY2EyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInZhbHVlIjoiY2hhcmFjdGVycyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODk4OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM4MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNoaWxkIjoic2ltcGxlIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZhZGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbgpAQCAtMCwwICsxIEBACit7InJvb3QiOnsibGFiZWwiOiJkdW1teSBub2RlIiwiZXhwYW5kZWQiOmZhbHNlfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmYWRiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InJvb3QiOnsibGFiZWwiOiJkdW1teSBub2RlIiwiZXhwYW5kZWQiOmZhbHNlfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InByb3BlcnR5MSI6WyJhMSIsImExIl0sInByb3BlcnR5MiI6WyJiMSJdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkxIjpbImExIiwiYTEiXSwicHJvcGVydHkyIjpbImIxIl19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMyZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiR3JvdGVmZW5kIiwidXNlcmlkIjoiMTYyMSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5NTYxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24KQEAgLTAsMCArMSBAQAoreyJjb2x1bW5zIjpbeyJpZCI6InVzZXJpZCIsImxhYmVsIjoiVXNlcklEIn0seyJpZCI6Im5hbWUiLCJsYWJlbCI6IlVzZXIgTmFtZSJ9XSwicm93cyI6W3sibmFtZSI6Ikdyb3RlZmVuZCIsInVzZXJpZCI6IjE2MjEifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTU2MWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb2x1bW5zIjpbeyJpZCI6InVzZXJpZCIsImxhYmVsIjoiVXNlcklEIn0seyJpZCI6Im5hbWUiLCJsYWJlbCI6IlVzZXIgTmFtZSJ9XSwicm93cyI6W3sibmFtZSI6Ikdyb3RlZmVuZCIsInVzZXJpZCI6IjE2MjEifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzMmVlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiR3JvdGVmZW5kIiwidXNlcmlkIjoiMTYyMSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhMjc3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxzIjpbeyJAdHlwZSI6IkRvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IkNhdCIsIm5pY2tOYW1lIjpudWxsLCJuYW1lIjoiRGFpc3kifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OGFkMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxzIjpbeyJAdHlwZSI6IkRvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IkNhdCIsIm5hbWUiOiJEYWlzeSIsIm5pY2tOYW1lIjpudWxsfV19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjRmMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InByb3AiOiJ0ZXN0UHJvcCIsImNhdHMiOlt7Im5pY2tOYW1lIjoiS2l0dHkiLCJuYW1lIjoiRm9vIn0seyJuaWNrTmFtZSI6IlB1c3MiLCJuYW1lIjoiQmFyIn1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGMwMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2F0cyI6W3sibmFtZSI6IkZvbyIsIm5pY2tOYW1lIjoiS2l0dHkifSx7Im5hbWUiOiJCYXIiLCJuaWNrTmFtZSI6IlB1c3MifV0sInByb3AiOiJ0ZXN0UHJvcCJ9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVlMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImF0dHIiOiJhdmFsIiwidmFsdWUiOiJwdmFsIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZTFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImF0dHIiOiJhdmFsIiwidmFsdWUiOiJwdmFsIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTJjNDFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImZpbGxlcjEiOiIxMTEiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9LHsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifV0sImZpbGxlcjIiOiIyMjIiLCJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTNkZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LHsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RkNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOiJoZWxsbyBkb2xseSIsImEyIjozMTQxNTkyNiwiZmlsbGVyMSI6IjExMSIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifV0sImZpbGxlcjIiOiIyMjIiLCJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDYzNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbgpAQCAtMCwwICsxIEBACit7ImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJjIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQ2Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJjIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTRhMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjpudWxsLCJhMiI6bnVsbCwibGlzdCI6W10sImIiOnsidXJpIjpudWxsLCJzMSI6bnVsbCwiaSI6bnVsbCwiaiI6bnVsbH19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNzY3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6bnVsbCwiYTIiOm51bGwsImZpbGxlcjEiOm51bGwsImxpc3QiOltdLCJmaWxsZXIyIjpudWxsLCJiIjp7InVyaSI6bnVsbCwiczEiOm51bGwsImkiOm51bGwsImoiOm51bGx9fQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MmM0MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn1dLCJmaWxsZXIyIjoiMjIyIiwiYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGNmMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbE9ubHkiOm51bGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGNmMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsT25seSI6bnVsbH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTE5OWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5QmVhbiI6bnVsbCwiYyI6ImZvbyIsImQiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTE5OWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlCZWFuIjpudWxsLCJjIjoiZm9vIiwiZCI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRlM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYjA5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJ3ZWlnaHQiOlsiMWtnIiwiMmtnIl0sImNvbG9yIjoicmVkIiwibmFtZSI6ImJ1bXBlciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMmIwOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ3ZWlnaHQiOlsiMWtnIiwiMmtnIl0sImNvbG9yIjoicmVkIiwibmFtZSI6ImJ1bXBlciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ1NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6WzRdLCJpbnRlZ2VyQXJyYXkiOlszXSwibnVtYmVyIjo4fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaW50QXJyYXkiOls0XSwiaW50ZWdlckFycmF5IjpbM10sIm51bWJlciI6OH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjI4NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbgpAQCAtMCwwICsxIEBACit7Im9iamVjdHMiOlt7IkB0eXBlIjoiQ29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiUkVEIiwiQkxVRSJdfSx7IkB0eXBlIjoiQ29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiR1JFRU4iXX1dLCJvZmZzZXQiOjAsInRvdGFsIjoyfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjI4NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sib2JqZWN0cyI6W3siQHR5cGUiOiJDb2xvckhvbGRlciIsImNvbG9ycyI6WyJSRUQiLCJCTFVFIl19LHsiQHR5cGUiOiJDb2xvckhvbGRlciIsImNvbG9ycyI6WyJHUkVFTiJdfV0sIm9mZnNldCI6MCwidG90YWwiOjJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWNhZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjpbIjEiXSwiZCI6IjIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1Y2FkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6WyIxIl0sImQiOiIyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE5ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhOWY1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5MTYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InByb3BlcnR5IjpudWxsfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5MTYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkiOm51bGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5MTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KQEAgLTAsMCArMSBAQAoreyJteU1lc3NhZ2UiOlt7ImlkIjoiMCIsInRleHQiOiJvayJ9LHsiaWQiOiIxIiwidGV4dCI6Im9rIn1dLCJteUVycm9yIjp7ImlkIjoiLTEiLCJkZXNjIjoiZXJyb3IifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5MTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im15TWVzc2FnZSI6W3siaWQiOiIwIiwidGV4dCI6Im9rIn0seyJpZCI6IjEiLCJ0ZXh0Ijoib2sifV0sIm15RXJyb3IiOnsiaWQiOiItMSIsImRlc2MiOiJlcnJvciJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODZkNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzZTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6InZhbHVlIiwiYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2U5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6InZhbHVlIiwiYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzg2ZDVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4Y2QzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbFN0cmluZyI6Im5vdCBudWxsIHRvIHRlc3QgaWYgc2V0IHRvIG51bGwgd29ya3MifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGNkM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbFN0cmluZyI6Im5vdCBudWxsIHRvIHRlc3QgaWYgc2V0IHRvIG51bGwgd29ya3MifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9QZXJzb24uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9QZXJzb24uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZlZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibmFtZSI6IkpvZSBTY2htbyIsImNoaWxkIjpbeyJuYW1lIjoiSmlsbCBTY2htbyJ9LHsibmFtZSI6IkphY2sgU2NobW8ifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZlYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiSm9lIFNjaG1vIiwiY2hpbGQiOlt7Im5hbWUiOiJKaWxsIFNjaG1vIiwiY2hpbGQiOm51bGx9LHsibmFtZSI6IkphY2sgU2NobW8iLCJjaGlsZCI6bnVsbH1dfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ5NTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxzIjpbeyJAdHlwZSI6IlBvam9Eb2ciLCJuYW1lIjoiRmlmaSJ9LHsiQHR5cGUiOiJQb2pvQ2F0Iiwibmlja05hbWUiOm51bGwsIm5hbWUiOiJEYWlzeSJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzg3OTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiUG9qb0RvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IlBvam9DYXQiLCJuYW1lIjoiRGFpc3kiLCJuaWNrTmFtZSI6bnVsbH1dfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJ2YWx1ZSI6InNvbWUgdGV4dHVhbCBjb250ZW50In0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InZhbHVlIjoic29tZSB0ZXh0dWFsIGNvbnRlbnQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0OWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYWdlbnRVSUQiOiJhZ2VudEtvY2thIiwicmVxdWVzdFRpbWUiOjEyMzR9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0OWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhZ2VudFVJRCI6ImFnZW50S29ja2EiLCJyZXF1ZXN0VGltZSI6MTIzNH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM4MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImNoaWxkIjoic2ltcGxlIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2ODM0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjgzNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4OTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlY2EyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInZhbHVlIjoiY2hhcmFjdGVycyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlY2EyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwidmFsdWUiOiJjaGFyYWN0ZXJzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODk4OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM4MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2hpbGQiOiJzaW1wbGUifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZhZGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCkBAIC0wLDAgKzEgQEAKK3sicm9vdCI6eyJsYWJlbCI6ImR1bW15IG5vZGUiLCJleHBhbmRlZCI6ZmFsc2V9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlMDAyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicm9vdCI6eyJsYWJlbCI6ImR1bW15IG5vZGUiLCJleHBhbmRlZCI6ZmFsc2UsImNoaWxkcmVuIjpudWxsfX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkxIjpbImExIiwiYTEiXSwicHJvcGVydHkyIjpbImIxIl19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eTEiOlsiYTEiLCJhMSJdLCJwcm9wZXJ0eTIiOlsiYjEiXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI5MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1MjE5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjpbeyJ1c2VyaWQiOiIxNjIxIiwibmFtZSI6Ikdyb3RlZmVuZCJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzhmY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjpbeyJuYW1lIjoiR3JvdGVmZW5kIiwidXNlcmlkIjoiMTYyMSJ9XX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTE3ZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibmFtZSI6Ikdyb3RlZmVuZCIsInVzZXJpZCI6IjE2MjEifQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGRhMjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxMaXN0Ijp7ImFuaW1hbHMiOlt7IkB4bWxucyI6eyJ4c2kiOiJodHRwOlwvXC93d3cudzMub3JnXC8yMDAxXC9YTUxTY2hlbWEtaW5zdGFuY2UifSwiQHhzaTp0eXBlIjoiZG9nIiwibmFtZSI6eyIkIjoiRmlmaSJ9fSx7IkB4bWxucyI6eyJ4c2kiOiJodHRwOlwvXC93d3cudzMub3JnXC8yMDAxXC9YTUxTY2hlbWEtaW5zdGFuY2UifSwiQHhzaTp0eXBlIjoiY2F0IiwibmFtZSI6eyIkIjoiRGFpc3kifX1dfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGRhMjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbExpc3QiOnsiYW5pbWFscyI6W3siQHhtbG5zIjp7InhzaSI6Imh0dHA6XC9cL3d3dy53My5vcmdcLzIwMDFcL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCJAeHNpOnR5cGUiOiJkb2ciLCJuYW1lIjp7IiQiOiJGaWZpIn19LHsiQHhtbG5zIjp7InhzaSI6Imh0dHA6XC9cL3d3dy53My5vcmdcLzIwMDFcL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCJAeHNpOnR5cGUiOiJjYXQiLCJuYW1lIjp7IiQiOiJEYWlzeSJ9fV19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDE0OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5vdGhlckFycmF5VGVzdEJlYW4iOnsiY2F0cyI6W3sibmFtZSI6eyIkIjoiRm9vIn0sIm5pY2tOYW1lIjp7IiQiOiJLaXR0eSJ9fSx7Im5hbWUiOnsiJCI6IkJhciJ9LCJuaWNrTmFtZSI6eyIkIjoiUHVzcyJ9fV0sInByb3AiOnsiJCI6InRlc3RQcm9wIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQxNDhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5vdGhlckFycmF5VGVzdEJlYW4iOnsiY2F0cyI6W3sibmFtZSI6eyIkIjoiRm9vIn0sIm5pY2tOYW1lIjp7IiQiOiJLaXR0eSJ9fSx7Im5hbWUiOnsiJCI6IkJhciJ9LCJuaWNrTmFtZSI6eyIkIjoiUHVzcyJ9fV0sInByb3AiOnsiJCI6InRlc3RQcm9wIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQxY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicGFyZW50Ijp7IkBhdHRyIjoiYXZhbCIsIiQiOiJwdmFsIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQxY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwYXJlbnQiOnsiQGF0dHIiOiJhdmFsIiwiJCI6InB2YWwifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiYjVmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMiOnsiQGEyIjoiMzE0MTU5MjYiLCJAYTEiOiJoZWxsbyBkb2xseSIsImZpbGxlcjEiOnsiJCI6IjExMSJ9LCJsaXN0IjpbeyJAaiI6ImJ1bXBlciIsIkBpIjoiMzEyIiwiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyIsInMxIjp7IiQiOiJoaSB0aGVyZSJ9fSx7IkBqIjoiYnVtcGVyIiwiQGkiOiIzMTIiLCJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIiwiczEiOnsiJCI6ImhpIHRoZXJlIn19XSwiZmlsbGVyMiI6eyIkIjoiMjIyIn0sImIiOnsiQGoiOiJidW1wZXIiLCJAaSI6IjMxMiIsIkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8iLCJzMSI6eyIkIjoiaGkgdGhlcmUifX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOGIwNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIiOnsiQGEyIjoiMzE0MTU5MjYiLCJAYTEiOiJoZWxsbyBkb2xseSIsImZpbGxlcjEiOnsiJCI6IjExMSJ9LCJsaXN0IjpbeyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn0seyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn1dLCJmaWxsZXIyIjp7IiQiOiIyMjIifSwiYiI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWU2OGFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIiOnsiQGExIjoiaGVsbG8gZG9sbHkiLCJAYTIiOiIzMTQxNTkyNiIsImZpbGxlcjEiOnsiJCI6IjExMSJ9LCJsaXN0IjpbeyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn0seyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn1dLCJmaWxsZXIyIjp7IiQiOiIyMjIifSwiYiI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNmQ2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMiOnsiYiI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn0sImMiOnsiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2ZDZjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzIjp7ImIiOnsiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyJ9LCJjIjp7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5OTk4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNCI6eyJiIjp7fX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTk5ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNCI6eyJiIjp7fX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFhYzFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzIjp7IkBhMSI6ImhlbGxvIGRvbGx5IiwiQGEyIjoiMzE0MTU5MjYiLCJmaWxsZXIxIjp7IiQiOiIxMTEifSwibGlzdCI6W3siQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyIsIkBpIjoiMzEyIiwiQGoiOiJidW1wZXIiLCJzMSI6eyIkIjoiaGkgdGhlcmUifX0seyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIiwiQGkiOiIzMTIiLCJAaiI6ImJ1bXBlciIsInMxIjp7IiQiOiJoaSB0aGVyZSJ9fV0sImZpbGxlcjIiOnsiJCI6IjIyMiJ9LCJiIjp7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8iLCJAaSI6IjMxMiIsIkBqIjoiYnVtcGVyIiwiczEiOnsiJCI6ImhpIHRoZXJlIn19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmYjFmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5RWxlbWVudEJlYW4iOnt9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmYjFmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlFbGVtZW50QmVhbiI6e319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMxMTFmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbiI6eyJjIjp7IiQiOiJmb28ifSwiZCI6eyIkIjoiYmFyIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzExMWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4iOnsiYyI6eyIkIjoiZm9vIn0sImQiOnsiJCI6ImJhciJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzkxMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVuY29kZWRDb250ZW50QmVhbiI6eyJvbmUiOnsiJCI6Ilx0b25lXG5cdGJpZyJ9LCJ0d28iOnsiJCI6ImhhZsSMIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzkxMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW5jb2RlZENvbnRlbnRCZWFuIjp7Im9uZSI6eyIkIjoiXHRvbmVcblx0YmlnIn0sInR3byI6eyIkIjoiaGFmxIwifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOGYwNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJmYWtlQXJyYXlCZWFuIjp7IndlaWdodCI6W3siJCI6IjFrZyJ9LHsiJCI6IjJrZyJ9XSwiY29sb3IiOnsiJCI6InJlZCJ9LCJuYW1lIjp7IiQiOiJidW1wZXIifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhmMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJmYWtlQXJyYXlCZWFuIjp7IndlaWdodCI6W3siJCI6IjFrZyJ9LHsiJCI6IjJrZyJ9XSwiY29sb3IiOnsiJCI6InJlZCJ9LCJuYW1lIjp7IiQiOiJidW1wZXIifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU2NDM4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6eyJpbnRBcnJheSI6eyIkIjoiNCJ9LCJpbnRlZ2VyQXJyYXkiOnsiJCI6IjMifSwibnVtYmVyIjp7IiQiOiI4In19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTY0Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaW50QXJyYXkiOnsiaW50QXJyYXkiOnsiJCI6IjQifSwiaW50ZWdlckFycmF5Ijp7IiQiOiIzIn0sIm51bWJlciI6eyIkIjoiOCJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDRkY2RjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImplcnNleTExOTlMaXN0Ijp7Im9iamVjdHMiOlt7IkB4bWxucyI6eyJ4c2kiOiJodHRwOlwvXC93d3cudzMub3JnXC8yMDAxXC9YTUxTY2hlbWEtaW5zdGFuY2UifSwiQHhzaTp0eXBlIjoiY29sb3JIb2xkZXIiLCJjb2xvcnMiOlt7IiQiOiJSRUQifSx7IiQiOiJCTFVFIn1dfSx7IkB4bWxucyI6eyJ4c2kiOiJodHRwOlwvXC93d3cudzMub3JnXC8yMDAxXC9YTUxTY2hlbWEtaW5zdGFuY2UifSwiQHhzaTp0eXBlIjoiY29sb3JIb2xkZXIiLCJjb2xvcnMiOnsiJCI6IkdSRUVOIn19XSwib2Zmc2V0Ijp7IiQiOiIwIn0sInRvdGFsIjp7IiQiOiIyIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDRkY2RjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siamVyc2V5MTE5OUxpc3QiOnsib2JqZWN0cyI6W3siQHhtbG5zIjp7InhzaSI6Imh0dHA6XC9cL3d3dy53My5vcmdcLzIwMDFcL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCJAeHNpOnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6W3siJCI6IlJFRCJ9LHsiJCI6IkJMVUUifV19LHsiQHhtbG5zIjp7InhzaSI6Imh0dHA6XC9cL3d3dy53My5vcmdcLzIwMDFcL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCJAeHNpOnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6eyIkIjoiR1JFRU4ifX1dLCJvZmZzZXQiOnsiJCI6IjAifSwidG90YWwiOnsiJCI6IjIifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWU4ZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJsaXN0QW5kTm9uTGlzdEJlYW4iOnsiYSI6eyIkIjoiMSJ9LCJkIjp7IiQiOiIyIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZThlMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdEFuZE5vbkxpc3RCZWFuIjp7ImEiOnsiJCI6IjEifSwiZCI6eyIkIjoiMiJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZDE0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Imxpc3RFbXB0eUJlYW4iOnt9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZDE0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdEVtcHR5QmVhbiI6e319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWU5ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJpdGVtIjp7fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWU5ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Iml0ZW0iOnt9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzRiYWNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibXlSZXNwb25zZSI6eyJAeG1sbnMiOnsibnMyIjoiaHR0cDpcL1wvdGVzdC5qYXhiLmNvbSJ9LCJuczI6bXlNZXNzYWdlIjpbeyJpZCI6eyIkIjoiMCJ9LCJ0ZXh0Ijp7IiQiOiJvayJ9fSx7ImlkIjp7IiQiOiIxIn0sInRleHQiOnsiJCI6Im9rIn19XSwibnMyOm15RXJyb3IiOnsiaWQiOnsiJCI6Ii0xIn0sImRlc2MiOnsiJCI6ImVycm9yIn19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTYzNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im15UmVzcG9uc2UiOnsiQHhtbG5zIjp7Im5zMCI6Imh0dHA6XC9cL3Rlc3QuamF4Yi5jb20ifSwibnMwOm15TWVzc2FnZSI6W3siaWQiOnsiJCI6IjAifSwidGV4dCI6eyIkIjoib2sifX0seyJpZCI6eyIkIjoiMSJ9LCJ0ZXh0Ijp7IiQiOiJvayJ9fV0sIm5zMDpteUVycm9yIjp7ImlkIjp7IiQiOiItMSJ9LCJkZXNjIjp7IiQiOiJlcnJvciJ9fX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZmZkZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lc3BhY2VCZWFuIjp7IkB4bWxucyI6eyJuczIiOiJodHRwOlwvXC9leGFtcGxlLmNvbSJ9LCJhIjp7IiQiOiJmb28ifSwibnMyOmIiOnsiJCI6ImJhciJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjg3ZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlIjp7IkB4bWxucyI6eyJuczEiOiJodHRwOlwvXC9leGFtcGxlLmNvbSJ9LCJAbnMxOmF0dHIiOiJ2YWx1ZSIsImEiOnsiJCI6ImZvbyJ9LCJuczE6YiI6eyIkIjoiYmFyIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjIzMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUiOnsiQHhtbG5zIjp7Im5zMCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIn0sIkBuczA6YXR0ciI6InZhbHVlIiwiYSI6eyIkIjoiZm9vIn0sIm5zMDpiIjp7IiQiOiJiYXIifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDk0MmM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lc3BhY2VCZWFuIjp7IkB4bWxucyI6eyJuczAiOiJodHRwOlwvXC9leGFtcGxlLmNvbSJ9LCJhIjp7IiQiOiJmb28ifSwibnMwOmIiOnsiJCI6ImJhciJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWViOGRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmdCZWFuIjp7Im51bGxTdHJpbmciOnsiJCI6Im5vdCBudWxsIHRvIHRlc3QgaWYgc2V0IHRvIG51bGwgd29ya3MifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZWI4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsU3RyaW5nQmVhbiI6eyJudWxsU3RyaW5nIjp7IiQiOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5NmEyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicGVyc29uIjp7Im5hbWUiOnsiJCI6IkpvZSBTY2htbyJ9LCJjaGlsZHJlbiI6eyJjaGlsZCI6W3sibmFtZSI6eyIkIjoiSmlsbCBTY2htbyJ9fSx7Im5hbWUiOnsiJCI6IkphY2sgU2NobW8ifX1dfX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5NmEyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwZXJzb24iOnsibmFtZSI6eyIkIjoiSm9lIFNjaG1vIn0sImNoaWxkcmVuIjp7ImNoaWxkIjpbeyJuYW1lIjp7IiQiOiJKaWxsIFNjaG1vIn19LHsibmFtZSI6eyIkIjoiSmFjayBTY2htbyJ9fV19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwOThiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InB1cmVDaGFyRGF0YUJlYW4iOnsiJCI6InNvbWUgdGV4dHVhbCBjb250ZW50In19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA5OGJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwdXJlQ2hhckRhdGFCZWFuIjp7IiQiOiJzb21lIHRleHR1YWwgY29udGVudCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YjQyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicmVnaXN0ZXJNZXNzYWdlIjp7IkByZXF1ZXN0VGltZSI6IjEyMzQiLCJAYWdlbnRVSUQiOiJhZ2VudEtvY2thIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4OGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJyZWdpc3Rlck1lc3NhZ2UiOnsiQGFnZW50VUlEIjoiYWdlbnRLb2NrYSIsIkByZXF1ZXN0VGltZSI6IjEyMzQifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2OTFkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7IkR1bW15T25lIjp7ImNoaWxkIjp7IiQiOiJzaW1wbGUifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQ0MDY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMiOnsiQGoiOiJidW1wZXIiLCJAaSI6IjMxMiIsIkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8iLCJzMSI6eyIkIjoiaGkgdGhlcmUifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExYjk2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMiOnsiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyIsIkBpIjoiMzEyIiwiQGoiOiJidW1wZXIiLCJzMSI6eyIkIjoiaGkgdGhlcmUifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVjM2UyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUiOnsiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTY2YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUiOnsiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyIsIiQiOiJjaGFyYWN0ZXJzIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTY2YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZSI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIiwiJCI6ImNoYXJhY3RlcnMifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmVjM2UyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY5MWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJEdW1teU9uZSI6eyJjaGlsZCI6eyIkIjoic2ltcGxlIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliNjQ3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCkBAIC0wLDAgKzEgQEAKK3sidHJlZU1vZGVsIjp7InJvb3QiOnsibGFiZWwiOnsiJCI6ImR1bW15IG5vZGUifSwiZXhwYW5kZWQiOnsiJCI6ImZhbHNlIn19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI2NDczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InRyZWVNb2RlbCI6eyJyb290Ijp7ImxhYmVsIjp7IiQiOiJkdW1teSBub2RlIn0sImV4cGFuZGVkIjp7IiQiOiJmYWxzZSJ9fX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNmNiMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJpdGVtMiI6eyJwcm9wZXJ0eTEiOlt7IiQiOiJhMSJ9LHsiJCI6ImExIn1dLCJwcm9wZXJ0eTIiOnsiJCI6ImIxIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2Y2IzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaXRlbTIiOnsicHJvcGVydHkxIjpbeyIkIjoiYTEifSx7IiQiOiJhMSJ9XSwicHJvcGVydHkyIjp7IiQiOiJiMSJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxNGU1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXIiOnsidXNlcmlkIjp7IiQiOiIxNjIxIn0sIm5hbWUiOnsiJCI6Ikdyb3RlZmVuZCJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjIxM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXJUYWJsZSI6eyJjb2x1bW5zIjpbeyJpZCI6eyIkIjoidXNlcmlkIn0sImxhYmVsIjp7IiQiOiJVc2VySUQifX0seyJpZCI6eyIkIjoibmFtZSJ9LCJsYWJlbCI6eyIkIjoiVXNlciBOYW1lIn19XSwicm93cyI6eyJ1c2VyaWQiOnsiJCI6IjE2MjEifSwibmFtZSI6eyIkIjoiR3JvdGVmZW5kIn19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYyMTNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXJUYWJsZSI6eyJjb2x1bW5zIjpbeyJpZCI6eyIkIjoidXNlcmlkIn0sImxhYmVsIjp7IiQiOiJVc2VySUQifX0seyJpZCI6eyIkIjoibmFtZSJ9LCJsYWJlbCI6eyIkIjoiVXNlciBOYW1lIn19XSwicm93cyI6eyJ1c2VyaWQiOnsiJCI6IjE2MjEifSwibmFtZSI6eyIkIjoiR3JvdGVmZW5kIn19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MTRlNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXIiOnsidXNlcmlkIjp7IiQiOiIxNjIxIn0sIm5hbWUiOnsiJCI6Ikdyb3RlZmVuZCJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDI1NDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbExpc3QiOnsiYW5pbWFscyI6W3siQHhzaS50eXBlIjoiZG9nIiwibmFtZSI6IkZpZmkifSx7IkB4c2kudHlwZSI6ImNhdCIsIm5hbWUiOiJEYWlzeSJ9XX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0MjU0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxMaXN0Ijp7ImFuaW1hbHMiOlt7IkB4c2kudHlwZSI6ImRvZyIsIm5hbWUiOiJGaWZpIn0seyJAeHNpLnR5cGUiOiJjYXQiLCJuYW1lIjoiRGFpc3kifV19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDFjNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5vdGhlckFycmF5VGVzdEJlYW4iOnsiY2F0cyI6W3sibmFtZSI6IkZvbyIsIm5pY2tOYW1lIjoiS2l0dHkifSx7Im5hbWUiOiJCYXIiLCJuaWNrTmFtZSI6IlB1c3MifV0sInByb3AiOiJ0ZXN0UHJvcCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxYzVkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5vdGhlckFycmF5VGVzdEJlYW4iOnsiY2F0cyI6W3sibmFtZSI6IkZvbyIsIm5pY2tOYW1lIjoiS2l0dHkifSx7Im5hbWUiOiJCYXIiLCJuaWNrTmFtZSI6IlB1c3MifV0sInByb3AiOiJ0ZXN0UHJvcCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MWNjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicGFyZW50Ijp7IkBhdHRyIjoiYXZhbCIsIiQiOiJwdmFsIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MWNjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwYXJlbnQiOnsiQGF0dHIiOiJhdmFsIiwiJCI6InB2YWwifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOGZmNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMiOnsiQGEyIjoiMzE0MTU5MjYiLCJAYTEiOiJoZWxsbyBkb2xseSIsImZpbGxlcjEiOjExMSwibGlzdCI6W3siQGoiOiJidW1wZXIiLCJAaSI6IjMxMiIsIkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSJ9LHsiQGoiOiJidW1wZXIiLCJAaSI6IjMxMiIsIkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSJ9XSwiZmlsbGVyMiI6MjIyLCJiIjp7IkBqIjoiYnVtcGVyIiwiQGkiOiIzMTIiLCJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzhmMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMiI6eyJAYTIiOiIzMTQxNTkyNiIsIkBhMSI6ImhlbGxvIGRvbGx5IiwiZmlsbGVyMSI6MTExLCJsaXN0IjpbeyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LHsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifV0sImZpbGxlcjIiOjIyMiwiYiI6eyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1N2M5MzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyIjp7IkBhMSI6ImhlbGxvIGRvbGx5IiwiQGEyIjoiMzE0MTU5MjYiLCJmaWxsZXIxIjoxMTEsImxpc3QiOlt7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0seyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9XSwiZmlsbGVyMiI6MjIyLCJiIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGM5MGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMiOnsiYiI6eyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJjIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjOTBkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMiOnsiYiI6eyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJjIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmUwZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQiOnsiYiI6IiJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlMGZlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQiOnsiYiI6IiJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjdkMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlcyI6eyJAYTEiOiJoZWxsbyBkb2xseSIsIkBhMiI6IjMxNDE1OTI2IiwiZmlsbGVyMSI6MTExLCJsaXN0IjpbeyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsIkBpIjoiMzEyIiwiQGoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn0seyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsIkBpIjoiMzEyIiwiQGoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn1dLCJmaWxsZXIyIjoyMjIsImIiOnsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJAaSI6IjMxMiIsIkBqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzkxM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5RWxlbWVudEJlYW4iOiIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzkxM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlFbGVtZW50QmVhbiI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjBlN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbiI6eyJjIjoiZm9vIiwiZCI6ImJhciJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyMGU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4iOnsiYyI6ImZvbyIsImQiOiJiYXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTExOWMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVuY29kZWRDb250ZW50QmVhbiI6eyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTExOWMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW5jb2RlZENvbnRlbnRCZWFuIjp7Im9uZSI6Ilx0b25lXG5cdGJpZyIsInR3byI6ImhhZsSMIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdhMDFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJmYWtlQXJyYXlCZWFuIjp7IndlaWdodCI6WyIxa2ciLCIya2ciXSwiY29sb3IiOiJyZWQiLCJuYW1lIjoiYnVtcGVyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3YTAxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJmYWtlQXJyYXlCZWFuIjp7IndlaWdodCI6WyIxa2ciLCIya2ciXSwiY29sb3IiOiJyZWQiLCJuYW1lIjoiYnVtcGVyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhOWQxYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6eyJpbnRBcnJheSI6NCwiaW50ZWdlckFycmF5IjozLCJudW1iZXIiOjh9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZDFiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaW50QXJyYXkiOnsiaW50QXJyYXkiOjQsImludGVnZXJBcnJheSI6MywibnVtYmVyIjo4fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMmViZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImplcnNleTExOTlMaXN0Ijp7Im9iamVjdHMiOlt7IkB4c2kudHlwZSI6ImNvbG9ySG9sZGVyIiwiY29sb3JzIjpbIlJFRCIsIkJMVUUiXX0seyJAeHNpLnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6IkdSRUVOIn1dLCJvZmZzZXQiOjAsInRvdGFsIjoyfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjJlYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImplcnNleTExOTlMaXN0Ijp7Im9iamVjdHMiOlt7IkB4c2kudHlwZSI6ImNvbG9ySG9sZGVyIiwiY29sb3JzIjpbIlJFRCIsIkJMVUUiXX0seyJAeHNpLnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6IkdSRUVOIn1dLCJvZmZzZXQiOjAsInRvdGFsIjoyfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRiODk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Imxpc3RBbmROb25MaXN0QmVhbiI6eyJhIjoxLCJkIjoyfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkYjg5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Imxpc3RBbmROb25MaXN0QmVhbiI6eyJhIjoxLCJkIjoyfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Imxpc3RFbXB0eUJlYW4iOiIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdEVtcHR5QmVhbiI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwNjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJpdGVtIjoiIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwNjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Iml0ZW0iOiIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyOWI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibXlSZXNwb25zZSI6eyJqYXhiLm15TWVzc2FnZSI6W3siaWQiOjAsInRleHQiOiJvayJ9LHsiaWQiOjEsInRleHQiOiJvayJ9XSwiamF4Yi5teUVycm9yIjp7ImlkIjotMSwiZGVzYyI6ImVycm9yIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjliNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibXlSZXNwb25zZSI6eyJqYXhiLm15TWVzc2FnZSI6W3siaWQiOjAsInRleHQiOiJvayJ9LHsiaWQiOjEsInRleHQiOiJvayJ9XSwiamF4Yi5teUVycm9yIjp7ImlkIjotMSwiZGVzYyI6ImVycm9yIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5NWZhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibmFtZXNwYWNlQmVhbiI6eyJhIjoiZm9vIiwiZXhhbXBsZS5iIjoiYmFyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZTQxOGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZSI6eyJAZXhhbXBsZS5hdHRyIjoidmFsdWUiLCJhIjoiZm9vIiwiZXhhbXBsZS5iIjoiYmFyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU0MThhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZSI6eyJAZXhhbXBsZS5hdHRyIjoidmFsdWUiLCJhIjoiZm9vIiwiZXhhbXBsZS5iIjoiYmFyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5NWZhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lc3BhY2VCZWFuIjp7ImEiOiJmb28iLCJleGFtcGxlLmIiOiJiYXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiNGE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmdCZWFuIjp7Im51bGxTdHJpbmciOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I0YTRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsU3RyaW5nQmVhbiI6eyJudWxsU3RyaW5nIjoibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTczMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicGVyc29uIjp7Im5hbWUiOiJKb2UgU2NobW8iLCJjaGlsZHJlbiI6eyJjaGlsZCI6W3sibmFtZSI6IkppbGwgU2NobW8ifSx7Im5hbWUiOiJKYWNrIFNjaG1vIn1dfX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YTczMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwZXJzb24iOnsibmFtZSI6IkpvZSBTY2htbyIsImNoaWxkcmVuIjp7ImNoaWxkIjpbeyJuYW1lIjoiSmlsbCBTY2htbyJ9LHsibmFtZSI6IkphY2sgU2NobW8ifV19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDQ0YmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InB1cmVDaGFyRGF0YUJlYW4iOiJzb21lIHRleHR1YWwgY29udGVudCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwNDRiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwdXJlQ2hhckRhdGFCZWFuIjoic29tZSB0ZXh0dWFsIGNvbnRlbnQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOGI0MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicmVnaXN0ZXJNZXNzYWdlIjp7IkByZXF1ZXN0VGltZSI6IjEyMzQiLCJAYWdlbnRVSUQiOiJhZ2VudEtvY2thIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODhkNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJyZWdpc3Rlck1lc3NhZ2UiOnsiQGFnZW50VUlEIjoiYWdlbnRLb2NrYSIsIkByZXF1ZXN0VGltZSI6IjEyMzQifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWIzMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7IkR1bW15T25lIjp7ImNoaWxkIjoic2ltcGxlIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliYjFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMiOnsiQGoiOiJidW1wZXIiLCJAaSI6IjMxMiIsIkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmUwM2FiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiQGkiOiIzMTIiLCJAaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQyMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7InNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSI6eyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjE4Y2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUiOnsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCIkIjoiY2hhcmFjdGVycyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxOGNmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUiOnsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCIkIjoiY2hhcmFjdGVycyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQyMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlYjMwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJEdW1teU9uZSI6eyJjaGlsZCI6InNpbXBsZSJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzNWFiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2luZ2xlSXRlbUxpc3RXcmFwcGVyIjp7InNpbmdsZUl0ZW1MaXN0IjpbMV19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MzVhYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2luZ2xlSXRlbUxpc3RXcmFwcGVyIjp7InNpbmdsZUl0ZW1MaXN0IjpbMV19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjAxZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCkBAIC0wLDAgKzEgQEAKK3sidHJlZU1vZGVsIjp7InJvb3QiOnsibGFiZWwiOiJkdW1teSBub2RlIiwiZXhwYW5kZWQiOmZhbHNlfX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjAxZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ0cmVlTW9kZWwiOnsicm9vdCI6eyJsYWJlbCI6ImR1bW15IG5vZGUiLCJleHBhbmRlZCI6ZmFsc2V9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjMzMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Iml0ZW0yIjp7InByb3BlcnR5MSI6WyJhMSIsImExIl0sInByb3BlcnR5MiI6ImIxIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyMzMyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpdGVtMiI6eyJwcm9wZXJ0eTEiOlsiYTEiLCJhMSJdLCJwcm9wZXJ0eTIiOiJiMSJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3ZWY4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlciI6eyJ1c2VyaWQiOjE2MjEsIm5hbWUiOiJHcm90ZWZlbmQifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWQyZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXJUYWJsZSI6eyJjb2x1bW5zIjpbeyJpZCI6InVzZXJpZCIsImxhYmVsIjoiVXNlcklEIn0seyJpZCI6Im5hbWUiLCJsYWJlbCI6IlVzZXIgTmFtZSJ9XSwicm93cyI6eyJ1c2VyaWQiOjE2MjEsIm5hbWUiOiJHcm90ZWZlbmQifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDJmMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ1c2VyVGFibGUiOnsiY29sdW1ucyI6W3siaWQiOiJ1c2VyaWQiLCJsYWJlbCI6IlVzZXJJRCJ9LHsiaWQiOiJuYW1lIiwibGFiZWwiOiJVc2VyIE5hbWUifV0sInJvd3MiOnsidXNlcmlkIjoxNjIxLCJuYW1lIjoiR3JvdGVmZW5kIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1N2VmODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlciI6eyJ1c2VyaWQiOjE2MjEsIm5hbWUiOiJHcm90ZWZlbmQifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGEyNzdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiRG9nIiwibmFtZSI6IkZpZmkifSx7IkB0eXBlIjoiQ2F0Iiwibmlja05hbWUiOm51bGwsIm5hbWUiOiJEYWlzeSJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2YWU5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7ImNsYXNzTmFtZSI6Im9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Eb2ciLCJpbnN0YW5jZSI6eyJuYW1lIjoiRmlmaSJ9fSx7ImNsYXNzTmFtZSI6Im9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5DYXQiLCJpbnN0YW5jZSI6eyJuYW1lIjoiRGFpc3kifX1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkYzAyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2F0cyI6W3sibmFtZSI6IkZvbyIsIm5pY2tOYW1lIjoiS2l0dHkifSx7Im5hbWUiOiJCYXIiLCJuaWNrTmFtZSI6IlB1c3MifV0sInByb3AiOiJ0ZXN0UHJvcCJ9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRjMDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNhdHMiOlt7Im5hbWUiOiJGb28iLCJuaWNrTmFtZSI6IktpdHR5In0seyJuYW1lIjoiQmFyIiwibmlja05hbWUiOiJQdXNzIn1dLCJwcm9wIjoidGVzdFByb3AifQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZTFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhdHRyIjoiYXZhbCIsInZhbHVlIjoicHZhbCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWUxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhdHRyIjoiYXZhbCIsInZhbHVlIjoicHZhbCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4OGIzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJiIjp7ImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUiLCJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImZpbGxlcjEiOiIxMTEiLCJmaWxsZXIyIjoiMjIyIiwibGlzdCI6W3siaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSIsInVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSx7ImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUiLCJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ4N2IzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSwiZmlsbGVyMSI6IjExMSIsImZpbGxlcjIiOiIyMjIiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkODdiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSwiZmlsbGVyMSI6IjExMSIsImZpbGxlcjIiOiIyMjIiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQ2Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24KQEAgLTAsMCArMSBAQAoreyJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSwiYyI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkNjM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSwiYyI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzAwMTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJiIjp7fSwibGlzdCI6W119ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwMDEyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJiIjp7fSwibGlzdCI6W119ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODhiM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJiIjp7ImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUiLCJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImZpbGxlcjEiOiIxMTEiLCJmaWxsZXIyIjoiMjIyIiwibGlzdCI6W3siaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSIsInVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSx7ImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUiLCJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24KQEAgLTAsMCArMSBAQAore30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4MTlmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYyI6ImZvbyIsImQiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODE5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYyI6ImZvbyIsImQiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRlM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sib25lIjoiXHRvbmVcblx0YmlnIiwidHdvIjoiaGFmxIwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZTNhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sib25lIjoiXHRvbmVcblx0YmlnIiwidHdvIjoiaGFmxIwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29sb3IiOiJyZWQiLCJuYW1lIjoiYnVtcGVyIiwid2VpZ2h0IjpbIjFrZyIsIjJrZyJdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2M4ODI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29sb3IiOiJyZWQiLCJuYW1lIjoiYnVtcGVyIiwid2VpZ2h0IjpbIjFrZyIsIjJrZyJdfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ1NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6WzRdLCJpbnRlZ2VyQXJyYXkiOlszXSwibnVtYmVyIjo4fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaW50QXJyYXkiOls0XSwiaW50ZWdlckFycmF5IjpbM10sIm51bWJlciI6OH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OGNiYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbgpAQCAtMCwwICsxIEBACit7Im9iamVjdHMiOlt7ImNvbG9ycyI6WyJSRUQiLCJCTFVFIl19LHsiY29sb3JzIjpbIkdSRUVOIl19XSwib2Zmc2V0IjowLCJ0b3RhbCI6Mn0KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OGNiYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sib2JqZWN0cyI6W3siY29sb3JzIjpbIlJFRCIsIkJMVUUiXX0seyJjb2xvcnMiOlsiR1JFRU4iXX1dLCJvZmZzZXQiOjAsInRvdGFsIjoyfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWNhZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjpbIjEiXSwiZCI6IjIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1Y2FkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6WyIxIl0sImQiOiIyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE5ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhOWY1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5MTYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InByb3BlcnR5IjpudWxsfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5MTYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkiOm51bGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZDA0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KQEAgLTAsMCArMSBAQAoreyJteUVycm9yIjp7ImRlc2MiOiJlcnJvciIsImlkIjoiLTEifSwibXlNZXNzYWdlIjpbeyJpZCI6IjAiLCJ0ZXh0Ijoib2sifSx7ImlkIjoiMSIsInRleHQiOiJvayJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZDA0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im15RXJyb3IiOnsiZGVzYyI6ImVycm9yIiwiaWQiOiItMSJ9LCJteU1lc3NhZ2UiOlt7ImlkIjoiMCIsInRleHQiOiJvayJ9LHsiaWQiOiIxIiwidGV4dCI6Im9rIn1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODZkNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxN2NlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6ImZvbyIsImF0dHIiOiJ2YWx1ZSIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTU3MjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6ImZvbyIsImF0dHIiOiJ2YWx1ZSIsImIiOiJiYXIifQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODZkNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjoiZm9vIiwiYiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YThjZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsU3RyaW5nIjoibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4Y2QzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsU3RyaW5nIjoibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjlkY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KQEAgLTAsMCArMSBAQAoreyJjaGlsZHJlbiI6W3sibmFtZSI6IkppbGwgU2NobW8ifSx7Im5hbWUiOiJKYWNrIFNjaG1vIn1dLCJuYW1lIjoiSm9lIFNjaG1vIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjYwZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNoaWxkcmVuIjpbeyJuYW1lIjoiSmlsbCBTY2htbyJ9LHsibmFtZSI6IkphY2sgU2NobW8ifV0sIm5hbWUiOiJKb2UgU2NobW8ifQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ5NTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxzIjpbeyJAdHlwZSI6IlBvam9Eb2ciLCJuYW1lIjoiRmlmaSJ9LHsiQHR5cGUiOiJQb2pvQ2F0Iiwibmlja05hbWUiOm51bGwsIm5hbWUiOiJEYWlzeSJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTQ5NTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiUG9qb0RvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IlBvam9DYXQiLCJuaWNrTmFtZSI6bnVsbCwibmFtZSI6IkRhaXN5In1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZGJjMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29udGVudCI6InNvbWUgdGV4dHVhbCBjb250ZW50In0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkYmMyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbnRlbnQiOiJzb21lIHRleHR1YWwgY29udGVudCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24KQEAgLTAsMCArMSBAQAoreyJhZ2VudFVJRCI6ImFnZW50S29ja2EiLCJyZXF1ZXN0VGltZSI6MTIzNH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFnZW50VUlEIjoiYWdlbnRLb2NrYSIsInJlcXVlc3RUaW1lIjoxMjM0fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2hpbGQiOiJzaW1wbGUifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg4MThhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qc29uCkBAIC0wLDAgKzEgQEAKK3siaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSIsInVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4ODE4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSIsInVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmVjYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwidmFsdWUiOiJjaGFyYWN0ZXJzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmVjYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJ2YWx1ZSI6ImNoYXJhY3RlcnMifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4OTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjaGlsZCI6InNpbXBsZSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZDM1YzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24KQEAgLTAsMCArMSBAQAoreyJyb290Ijp7ImV4cGFuZGVkIjpmYWxzZSwibGFiZWwiOiJkdW1teSBub2RlIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjY3NDZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJyb290Ijp7ImV4cGFuZGVkIjpmYWxzZSwibGFiZWwiOiJkdW1teSBub2RlIn19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGZmMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InByb3BlcnR5MSI6WyJhMSIsImExIl0sInByb3BlcnR5MiI6WyJiMSJdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGZmMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkxIjpbImExIiwiYTEiXSwicHJvcGVydHkyIjpbImIxIl19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXIuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Vc2VyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2MGVmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Vc2VyLmpzb24KQEAgLTAsMCArMSBAQAoreyJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxNWJiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjpbeyJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYxNWJiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29sdW1ucyI6W3siaWQiOiJ1c2VyaWQiLCJsYWJlbCI6IlVzZXJJRCJ9LHsiaWQiOiJuYW1lIiwibGFiZWwiOiJVc2VyIE5hbWUifV0sInJvd3MiOlt7ImlkIjoiMTYyMSIsIm5hbWUiOiJHcm90ZWZlbmQifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NjBlZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzNjFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7InhzaTp0eXBlIjoiZG9nIiwibmFtZSI6IkZpZmkifSx7InhzaTp0eXBlIjoiY2F0IiwibmFtZSI6IkRhaXN5In1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUzNjFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3sieHNpOnR5cGUiOiJkb2ciLCJuYW1lIjoiRmlmaSJ9LHsieHNpOnR5cGUiOiJjYXQiLCJuYW1lIjoiRGFpc3kifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmIzNzAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjYXRzIjpbeyJuYW1lIjoiRm9vIiwibmlja05hbWUiOiJLaXR0eSJ9LHsibmFtZSI6IkJhciIsIm5pY2tOYW1lIjoiUHVzcyJ9XSwicHJvcCI6InRlc3RQcm9wIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmIzNzAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNhdHMiOlt7Im5hbWUiOiJGb28iLCJuaWNrTmFtZSI6IktpdHR5In0seyJuYW1lIjoiQmFyIiwibmlja05hbWUiOiJQdXNzIn1dLCJwcm9wIjoidGVzdFByb3AifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWUxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6ImF2YWwiLCJ2YWx1ZSI6InB2YWwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVlMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6ImF2YWwiLCJ2YWx1ZSI6InB2YWwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDRhY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOiJoZWxsbyBkb2xseSIsImEyIjozMTQxNTkyNiwiZmlsbGVyMSI6IjExMSIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RkNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImZpbGxlcjEiOiIxMTEiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dLCJmaWxsZXIyIjoiMjIyIiwiYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LHsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkNjM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCkBAIC0wLDAgKzEgQEAKK3siYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImMiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDYzNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImMiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyNGIwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdCI6W10sImIiOnt9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjRiMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdCI6W10sImIiOnt9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTA0YWNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOiJoZWxsbyBkb2xseSIsImEyIjozMTQxNTkyNiwiZmlsbGVyMSI6IjExMSIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI2ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI2ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3t9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgxOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjIjoiZm9vIiwiZCI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4MTlmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjIjoiZm9vIiwiZCI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRlM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYjA5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJ3ZWlnaHQiOlsiMWtnIiwiMmtnIl0sImNvbG9yIjoicmVkIiwibmFtZSI6ImJ1bXBlciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMmIwOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ3ZWlnaHQiOlsiMWtnIiwiMmtnIl0sImNvbG9yIjoicmVkIiwibmFtZSI6ImJ1bXBlciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDQ1NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6WzRdLCJpbnRlZ2VyQXJyYXkiOlszXSwibnVtYmVyIjo4fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaW50QXJyYXkiOls0XSwiaW50ZWdlckFycmF5IjpbM10sIm51bWJlciI6OH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODFhZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbgpAQCAtMCwwICsxIEBACit7Im9iamVjdHMiOlt7InhzaTp0eXBlIjoiY29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiUkVEIiwiQkxVRSJdfSx7InhzaTp0eXBlIjoiY29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiR1JFRU4iXX1dLCJvZmZzZXQiOjAsInRvdGFsIjoyfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODFhZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sib2JqZWN0cyI6W3sieHNpOnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6WyJSRUQiLCJCTFVFIl19LHsieHNpOnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6WyJHUkVFTiJdfV0sIm9mZnNldCI6MCwidG90YWwiOjJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWNhZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjpbIjEiXSwiZCI6IjIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1Y2FkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6WyIxIl0sImQiOiIyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE5ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhOWY1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNmRmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3t9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1NGQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KQEAgLTAsMCArMSBAQAoreyJqYXhiOm15TWVzc2FnZSI6W3siaWQiOiIwIiwidGV4dCI6Im9rIn0seyJpZCI6IjEiLCJ0ZXh0Ijoib2sifV0sImpheGI6bXlFcnJvciI6eyJpZCI6Ii0xIiwiZGVzYyI6ImVycm9yIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNTRkNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJqYXhiOm15TWVzc2FnZSI6W3siaWQiOiIwIiwidGV4dCI6Im9rIn0seyJpZCI6IjEiLCJ0ZXh0Ijoib2sifV0sImpheGI6bXlFcnJvciI6eyJpZCI6Ii0xIiwiZGVzYyI6ImVycm9yIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkZjY1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjoiZm9vIiwiZXhhbXBsZTpiIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNThjODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7ImV4YW1wbGU6YXR0ciI6InZhbHVlIiwiYSI6ImZvbyIsImV4YW1wbGU6YiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1OGM4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJleGFtcGxlOmF0dHIiOiJ2YWx1ZSIsImEiOiJmb28iLCJleGFtcGxlOmIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGRmNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6ImZvbyIsImV4YW1wbGU6YiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YThjZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsU3RyaW5nIjoibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4Y2QzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsU3RyaW5nIjoibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2QzOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiSm9lIFNjaG1vIiwiY2hpbGRyZW4iOnsiY2hpbGQiOlt7Im5hbWUiOiJKaWxsIFNjaG1vIn0seyJuYW1lIjoiSmFjayBTY2htbyJ9XX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NkMzllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiSm9lIFNjaG1vIiwiY2hpbGRyZW4iOnsiY2hpbGQiOlt7Im5hbWUiOiJKaWxsIFNjaG1vIn0seyJuYW1lIjoiSmFjayBTY2htbyJ9XX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJ2YWx1ZSI6InNvbWUgdGV4dHVhbCBjb250ZW50In0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkMzE1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InZhbHVlIjoic29tZSB0ZXh0dWFsIGNvbnRlbnQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0OWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYWdlbnRVSUQiOiJhZ2VudEtvY2thIiwicmVxdWVzdFRpbWUiOjEyMzR9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY0OWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhZ2VudFVJRCI6ImFnZW50S29ja2EiLCJyZXF1ZXN0VGltZSI6MTIzNH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM4MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImNoaWxkIjoic2ltcGxlIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkMDhkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDA4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4OTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlY2EyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInZhbHVlIjoiY2hhcmFjdGVycyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlY2EyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwidmFsdWUiOiJjaGFyYWN0ZXJzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODk4OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM4MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2hpbGQiOiJzaW1wbGUifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZhZGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCkBAIC0wLDAgKzEgQEAKK3sicm9vdCI6eyJsYWJlbCI6ImR1bW15IG5vZGUiLCJleHBhbmRlZCI6ZmFsc2V9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmYWRiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicm9vdCI6eyJsYWJlbCI6ImR1bW15IG5vZGUiLCJleHBhbmRlZCI6ZmFsc2V9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkxIjpbImExIiwiYTEiXSwicHJvcGVydHkyIjpbImIxIl19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eTEiOlsiYTEiLCJhMSJdLCJwcm9wZXJ0eTIiOlsiYjEiXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI5MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1MjE5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjpbeyJ1c2VyaWQiOiIxNjIxIiwibmFtZSI6Ikdyb3RlZmVuZCJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTIxOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjpbeyJ1c2VyaWQiOiIxNjIxIiwibmFtZSI6Ikdyb3RlZmVuZCJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiOTFiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2UvcG9tLnhtbCBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YzkxNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2UvcG9tLnhtbApAQCAtMCwwICsxLDEwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0czwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+ZTJlLWluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmUyZS1pbmplY3QtY2RpMi1zZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1lMmUtaW5qZWN0LWNkaS1zZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRTJFIEluamVjdCBDREkgU0UgdGVzdHM8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxjZGkuYXBpLnZlcnNpb24+Mi4wPC9jZGkuYXBpLnZlcnNpb24+CisgICAgICAgIDx3ZWxkLnZlcnNpb24+JHt3ZWxkMy52ZXJzaW9ufTwvd2VsZC52ZXJzaW9uPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTItc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+eGRrPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gZG8gbm90IHVzZSBzZWN1cml0eSBtYW5hZ2VyIGZvciB4ZGsgLS0+CisgICAgICAgICAgICAgICAgPHN1cmVmaXJlLnNlY3VyaXR5LmFyZ2xpbmUgLz4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2UgaXQncyBub3Qgd29ya2luZyB3aXRoIDxmb3JrTW9kZT5hbHdheXM8L2Zvcms+ICg8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4gcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2ppcmEuc29uYXJzb3VyY2UuY29tL2Jyb3dzZS9TT05BUkpBVkEtNzI4IChodHRwczovL2dpdGh1Yi5jb20vU29uYXJTb3VyY2Uvc29uYXItamF2YS9wdWxsLzMyNCkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzIGNvbWJpbmUuc2VsZj0ib3ZlcnJpZGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0FjY291bnQuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0FjY291bnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjUxNDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvQWNjb3VudC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5ldmVudC5PYnNlcnZlczsKKworLyoqCisgKiBLZWVwcyBjdXJyZW50IHN0YXRlIG9mIG1vbmV5LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBBY2NvdW50IHsKKworICAgIHByaXZhdGUgbG9uZyBjdXJyZW50ID0gMDsKKworICAgIHB1YmxpYyB2b2lkIG9ic2VydmVDcmVkaXQoQE9ic2VydmVzIEBDcmVkaXQgTG9uZyBhbW91bnQpIHsKKyAgICAgICAgY3VycmVudCArPSBhbW91bnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb2JzZXJ2ZURlYml0KEBPYnNlcnZlcyBARGViaXQgTG9uZyBhbW91bnQpIHsKKyAgICAgICAgY3VycmVudCAtPSBhbW91bnQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudCgpIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvQWNjb3VudFJlc291cmNlLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9BY2NvdW50UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDczZmFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvQWNjb3VudFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmV2ZW50LkV2ZW50OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogVGVzdGluZyByZXNvdXJjZSBmb3IgQ0RJIGV2ZW50cy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFBhdGgoImFjY291bnQiKQorcHVibGljIGNsYXNzIEFjY291bnRSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgQENyZWRpdAorICAgIHByaXZhdGUgRXZlbnQ8TG9uZz4gY3JlZGl0RXZlbnQ7CisKKyAgICBASW5qZWN0CisgICAgQERlYml0CisgICAgcHJpdmF0ZSBFdmVudDxMb25nPiBkZWJpdEV2ZW50OworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQWNjb3VudCBhY2NvdW50OworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgdm9pZCBjcmVkaXQoQFF1ZXJ5UGFyYW0oImFtb3VudCIpIGxvbmcgYW1vdW50KSB7CisgICAgICAgIGNyZWRpdEV2ZW50LmZpcmUoYW1vdW50KTsKKyAgICB9CisKKyAgICBAREVMRVRFCisgICAgcHVibGljIHZvaWQgZGViaXQoQFF1ZXJ5UGFyYW0oImFtb3VudCIpIGxvbmcgYW1vdW50KSB7CisgICAgICAgIGRlYml0RXZlbnQuZmlyZShhbW91bnQpOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgbG9uZyBjdXJyZW50KCkgeworICAgICAgICByZXR1cm4gYWNjb3VudC5nZXRDdXJyZW50KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvQ3JlZGl0LmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9DcmVkaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTY5M2RhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvQ3JlZGl0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKKy8qKgorICogRXZlbnQgcXVhbGlmaWVyLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAUXVhbGlmaWVyCitAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBQQVJBTUVURVIsIFRZUEV9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgQ3JlZGl0IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0RlYml0LmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9EZWJpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWYxZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9EZWJpdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCisvKioKKyAqIEV2ZW50IHF1YWxpZmllci4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFF1YWxpZmllcgorQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgUEFSQU1FVEVSLCBUWVBFfSkKK0BSZXRlbnRpb24oUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIERlYml0IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0hlbGxvLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9IZWxsby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzZhMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9IZWxsby5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2U7CisKKy8qKgorICogSW50ZXJmYWNlIHVzZWQgdG8gYWN0aXZhdGUgZGVjb3JhdG9yLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgaW50ZXJmYWNlIEhlbGxvIHsKKworICAgIFN0cmluZyBoZWxsbygpOworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9IZWxsb1Jlc291cmNlLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9IZWxsb1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4MDQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0hlbGxvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEludGVyY2VwdGVkIGFuZCBkZWNvcmF0ZWQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BTZWN1cmVkCitAUGF0aCgiaW50ZXJjZXB0ZWQiKQorcHVibGljIGNsYXNzIEhlbGxvUmVzb3VyY2UgaW1wbGVtZW50cyBIZWxsbyB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBOYW1lU2VydmljZSBzZXJ2aWNlOworCisgICAgQEdFVAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgaGVsbG8oKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gIiArIHNlcnZpY2UuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0hlbGxvU3RhckRlY29yYXRvci5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvSGVsbG9TdGFyRGVjb3JhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhOWViZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0hlbGxvU3RhckRlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZheC5kZWNvcmF0b3IuRGVjb3JhdG9yOworaW1wb3J0IGphdmF4LmRlY29yYXRvci5EZWxlZ2F0ZTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5Bbnk7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBEZWNvcmF0b3Igd3JhcHMgdGhlIGhlbGxvIHJlc291cmNlIGJ5IHN0YXJzLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitARGVjb3JhdG9yCitwdWJsaWMgY2xhc3MgSGVsbG9TdGFyRGVjb3JhdG9yIGltcGxlbWVudHMgSGVsbG8geworCisgICAgQEluamVjdAorICAgIEBEZWxlZ2F0ZQorICAgIEBBbnkKKyAgICBIZWxsbyBhY2NvdW50OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBoZWxsbygpIHsKKyAgICAgICAgcmV0dXJuICIqKioiICsgYWNjb3VudC5oZWxsbygpICsgIioqKiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvSmF4cnNTZXJ2aWNlLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9KYXhyc1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTcwOGJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvSmF4cnNTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKKy8qKgorICogSG9sZGVyIGZvciBKQVgtUlMgaW5mb3JtYXRpb24gdG8gaW5qZWN0IHRoZW0gaW50byBpbnRlcmNlcHRvci4gSkFYLVJTIGRvZXMgbm90IHdvcmsgaW4gaW50ZXJjZXB0b3IuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEpheHJzU2VydmljZSB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgcHVibGljIFVyaUluZm8gZ2V0VXJpSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHVyaUluZm87CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvTmFtZVNlcnZpY2UuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL05hbWVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNDU1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL05hbWVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworLyoqCisgKiBTZXJ2aWNlIHJldHVybmluZyB0aGUgbmFtZS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgTmFtZVNlcnZpY2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJKYW1lcyI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgcmV0dXJuIE5BTUU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvU2VjdXJlZC5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvU2VjdXJlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmNhMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9TZWN1cmVkLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkluaGVyaXRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuSW50ZXJjZXB0b3JCaW5kaW5nOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKKy8qKgorICogU2VjdXJpdHkgYW5ub3RhdGlvbiBib3VuZCB0byB7QGxpbmsgU2VjdXJpdHlJbnRlcmNlcHRvcn0uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BJbmhlcml0ZWQKK0BJbnRlcmNlcHRvckJpbmRpbmcKK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoeyBNRVRIT0QsIFRZUEUgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFNlY3VyZWQgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvU2VjdXJpdHlJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvU2VjdXJpdHlJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZWFlOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9TZWN1cml0eUludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkZvcmJpZGRlbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5Bcm91bmRJbnZva2U7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuSW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuSW52b2NhdGlvbkNvbnRleHQ7CisKKy8qKgorICogSW50ZXJjZXB0b3IgY2hlY2tpbmcgSmFtZXMgYXMgYSB1c2VyIGluIHF1ZXJ5IHBhcmFtcy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFNlY3VyZWQKK0BJbnRlcmNlcHRvcgorcHVibGljIGNsYXNzIFNlY3VyaXR5SW50ZXJjZXB0b3IgeworCisgICAgQEluamVjdAorICAgIE5hbWVTZXJ2aWNlIG5hbWVTZXJ2aWNlOworCisgICAgQEluamVjdAorICAgIEpheHJzU2VydmljZSBqYXhyc1NlcnZpY2U7CisKKyAgICBAQXJvdW5kSW52b2tlCisgICAgcHVibGljIE9iamVjdCBsb2dNZXRob2RFbnRyeShJbnZvY2F0aW9uQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gamF4cnNTZXJ2aWNlLmdldFVyaUluZm8oKS5nZXRRdWVyeVBhcmFtZXRlcnMoKTsKKyAgICAgICAgU3RyaW5nIHVzZXIgPSBwYXJhbXMuZ2V0Rmlyc3QoInVzZXIiKTsKKworICAgICAgICBpZiAobmFtZVNlcnZpY2UuZ2V0TmFtZSgpLmVxdWFscyh1c2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIGN0eC5wcm9jZWVkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXhjZXB0aW9uKCJGb3JiaWRkZW4gcmVzb3VyY2UgZm9yIHRoZSB1c2VyOiAiICsgdXNlcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvQXBwbGljYXRpb25Db3VudGVyQmVhbi5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc2NvcGVzL0FwcGxpY2F0aW9uQ291bnRlckJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODMwOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc2NvcGVzL0FwcGxpY2F0aW9uQ291bnRlckJlYW4uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlLnNjb3BlczsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCisvKioKKyAqIFJlcXVlc3QgY291bnRlci4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25Db3VudGVyQmVhbiB7CisKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc2NvcGVzL1JlcXVlc3RTY29wZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc2NvcGVzL1JlcXVlc3RTY29wZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzc2OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvUmVxdWVzdFNjb3BlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZS5zY29wZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CisKKy8qKgorICogUmVxdWVzdCBzY29wZWQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgicmVxdWVzdCIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZFJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uQ291bnRlckJlYW4gYXBwbGljYXRpb247CisKKyAgICBAUGF0aFBhcmFtKCJuYW1lIikKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZFJlc291cmNlKEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICB0aGlzLnVyaUluZm8gPSB1cmlJbmZvOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgie25hbWV9IikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgIHJldHVybiAiSGVsbG9fIiArIG5hbWUgKyAiIFsiICsgYXBwbGljYXRpb24uZ2V0TnVtYmVyKCkgKyAiXSAiICsgIlsiICsgdXJpSW5mby5nZXRQYXRoKCkgKyAiXSAiICsgdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvU2luZ2xldG9uU2NvcGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3Njb3Blcy9TaW5nbGV0b25TY29wZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTFhMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvU2luZ2xldG9uU2NvcGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlLnNjb3BlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIFNpbmdsZXRvbiBSZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFNpbmdsZXRvbgorQFBhdGgoInNpbmdsZXRvbiIpCitwdWJsaWMgY2xhc3MgU2luZ2xldG9uU2NvcGVkUmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQXBwbGljYXRpb25Db3VudGVyQmVhbiBhcHBsaWNhdGlvbjsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICBAR0VUCisgICAgQFBhdGgoIntuYW1lfSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKEBQYXRoUGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gIkhlbGxvXyIgKyBuYW1lICsgIiBbIiArIGFwcGxpY2F0aW9uLmdldE51bWJlcigpICsgIl0gIiArICJbIiArIHVyaUluZm8uZ2V0UGF0aCgpICsgIl0gIiArIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL01vZGVsUHJvY2Vzc29yRmVhdHVyZS5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL01vZGVsUHJvY2Vzc29yRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzgwYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvTW9kZWxQcm9jZXNzb3JGZWF0dXJlLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2Uuc3VicmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBNb2RlbFByb2Nlc3NvckZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoU2ltcGxlTW9kZWxQcm9jZXNzb3IuY2xhc3MpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAUHJpb3JpdHkoNTAwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZU1vZGVsUHJvY2Vzc29yIGltcGxlbWVudHMgTW9kZWxQcm9jZXNzb3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBwcm9jZXNzUmVzb3VyY2VNb2RlbChSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgUmVzb3VyY2VNb2RlbC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VNb2RlbC5CdWlsZGVyKHJlc291cmNlTW9kZWwuZ2V0Um9vdFJlc291cmNlcygpLCBmYWxzZSk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSBzaW5nbGV0b25SZXNvdXJjZSA9IFJlc291cmNlLmZyb20oU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYnVpbGRlci5hZGRSZXNvdXJjZShzaW5nbGV0b25SZXNvdXJjZSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHJlcXVlc3RTY29wZVJlc291cmNlID0gUmVzb3VyY2UuZnJvbShSZXF1ZXN0U2NvcGVSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBidWlsZGVyLmFkZFJlc291cmNlKHJlcXVlc3RTY29wZVJlc291cmNlKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJpbnN0YW5jZSIpOworICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFN0cmluZz4oKSB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRhaW5lclJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigiSW5mbGVjdG9yOiIgKyBjb3VudGVyKyspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgaW5zdGFuY2VSZXNvdXJjZSA9IHJlc291cmNlQnVpbGRlci5idWlsZCgpOworCisgICAgICAgICAgICBidWlsZGVyLmFkZFJlc291cmNlKGluc3RhbmNlUmVzb3VyY2UpOworCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NTdWJSZXNvdXJjZShSZXNvdXJjZU1vZGVsIHN1YlJlc291cmNlLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuYnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5tZXJnZVdpdGgoUmVzb3VyY2UuZnJvbShFbmhhbmNlZFN1YlJlc291cmNlU2luZ2xldG9uLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgLm1lcmdlV2l0aChSZXNvdXJjZS5mcm9tKEVuaGFuY2VkU3ViUmVzb3VyY2UuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAubWVyZ2VXaXRoKHN1YlJlc291cmNlLmdldFJlc291cmNlcygpLmdldCgwKSkuYnVpbGQoKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIodHJ1ZSkuYWRkUmVzb3VyY2UocmVzb3VyY2UpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbmhhbmNlZFN1YlJlc291cmNlU2luZ2xldG9uIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZW5oYW5jZWQtc2luZ2xldG9uIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkVuaGFuY2VkU3ViUmVzb3VyY2VTaW5nbGV0b246IiArIFN0cmluZy52YWx1ZU9mKGNvdW50ZXIrKyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuaGFuY2VkU3ViUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImVuaGFuY2VkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoIkVuaGFuY2VkU3ViUmVzb3VyY2U6IiArIGNvdW50ZXIrKyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVxdWVzdC1zY29wZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0U2NvcGVSZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoIlJlcXVlc3RTY29wZVJlc291cmNlOiIgKyBjb3VudGVyKyspOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInNpbmdsZXRvbiIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uUmVzb3VyY2UgeworICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKCJTaW5nbGV0b25SZXNvdXJjZToiICsgY291bnRlcisrKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Sb290UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Sb290UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWExMWRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL1Jvb3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2Uuc3VicmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK0BQYXRoKCJyb290IikKK3B1YmxpYyBjbGFzcyBSb290UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInJvb3QiOworICAgIH0KKworICAgIEBQYXRoKCJzdWItcmVzb3VyY2Utc2luZ2xldG9uIikKKyAgICBwdWJsaWMgQ2xhc3M8U3ViUmVzb3VyY2VTaW5nbGV0b24+IGdldFN1YlJlc291cmNlU2luZ2xldG9uKCkgeworICAgICAgICByZXR1cm4gU3ViUmVzb3VyY2VTaW5nbGV0b24uY2xhc3M7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1pbnN0YW5jZSIpCisgICAgcHVibGljIFN1YlJlc291cmNlU2luZ2xldG9uIGdldFN1YlJlc291cmNlU2luZ2xldG9uSW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2VTaW5nbGV0b24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvUm9vdFNpbmdsZXRvblJlc291cmNlLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvUm9vdFNpbmdsZXRvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExNzhkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Sb290U2luZ2xldG9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlLnN1YnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworQFBhdGgoInJvb3Qtc2luZ2xldG9uIikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBSb290U2luZ2xldG9uUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiUm9vdFNpbmdsZXRvblJlc291cmNlOiIgKyBTdHJpbmcudmFsdWVPZihjb3VudGVyKyspOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9TdWJSZXNvdXJjZVNpbmdsZXRvbi5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL1N1YlJlc291cmNlU2luZ2xldG9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFkYmQzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9TdWJSZXNvdXJjZVNpbmdsZXRvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2Uuc3VicmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFN1YlJlc291cmNlU2luZ2xldG9uIHsKKworICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoIlN1YlJlc291cmNlU2luZ2xldG9uOiIgKyBjb3VudGVyKyspOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU4NDIyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zPgorICAgIDxpbnRlcmNlcHRvcnM+CisgICAgICAgIDxjbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZS5TZWN1cml0eUludGVyY2VwdG9yPC9jbGFzcz4KKyAgICA8L2ludGVyY2VwdG9ycz4KKyAgICA8ZGVjb3JhdG9ycz4KKyAgICAgICAgPGNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlLkhlbGxvU3RhckRlY29yYXRvcjwvY2xhc3M+CisgICAgPC9kZWNvcmF0b3JzPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0V2ZW50c1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0V2ZW50c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQyNzUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvRXZlbnRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhhdCB0aGUgcmVzb3VyY2UgY2FuIGZpcmUgYW4gZXZlbnQuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudHNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQWNjb3VudFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXJlZEV2ZW50cygpIHsKKyAgICAgICAgUmVzcG9uc2UgY3JlZGl0ID0gdGFyZ2V0KCJhY2NvdW50IikucXVlcnlQYXJhbSgiYW1vdW50IiwgNTApLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5qc29uKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIGNyZWRpdC5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgUmVzcG9uc2UgZGViaXQgPSB0YXJnZXQoImFjY291bnQiKS5xdWVyeVBhcmFtKCJhbW91bnQiLCAyNSkucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBkZWJpdC5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgTG9uZyBjdXJyZW50ID0gdGFyZ2V0KCJhY2NvdW50IikucXVlcnlQYXJhbSgiYW1vdW50IiwgMjUpLnJlcXVlc3QoKS5nZXQoTG9uZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygyNSwgY3VycmVudC5sb25nVmFsdWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9JbnRlcmNlcHRvckRlY29yYXRvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0ludGVyY2VwdG9yRGVjb3JhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjcwYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9JbnRlcmNlcHRvckRlY29yYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aGF0IHRoZSByZXNvdXJjZSBjYW4gYmUgaW50ZXJjZXB0ZWQgYW5kIGRlY29yYXRlZC4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEludGVyY2VwdG9yRGVjb3JhdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1Jlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcmNlcHRlZEdldCgpIHsKKyAgICAgICAgU3RyaW5nIGludGVyY2VwdGVkID0gdGFyZ2V0KCJpbnRlcmNlcHRlZCIpLnF1ZXJ5UGFyYW0oInVzZXIiLCBOYW1lU2VydmljZS5OQU1FKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKioqSGVsbG8gSmFtZXMqKioiLCBpbnRlcmNlcHRlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yYmlkZGVuR2V0KCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSB0YXJnZXQoImludGVyY2VwdGVkIikucXVlcnlQYXJhbSgidXNlciIsICJ1bmtub3duIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAzLCByZXN1bHQuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL1JlcXVlc3RDb250ZXh0QnVpbGRlci5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvUmVxdWVzdENvbnRleHRCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwNmE0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL1JlcXVlc3RDb250ZXh0QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLk1hcFByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IZWFkZXJVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKKworLyoqCisgKiBVc2VkIGJ5IHRlc3RzIHRvIGNyZWF0ZSBtb2NrIEplcnNleUNvbnRhaW5lclJlcXVlc3RDb250ZXh0IGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFJlcXVlc3RDb250ZXh0QnVpbGRlciB7CisKKyAgICBwdWJsaWMgY2xhc3MgVGVzdENvbnRhaW5lclJlcXVlc3QgZXh0ZW5kcyBDb250YWluZXJSZXF1ZXN0IHsKKworICAgICAgICBwcml2YXRlIE9iamVjdCBlbnRpdHk7CisgICAgICAgIHByaXZhdGUgR2VuZXJpY1R5cGUgZW50aXR5VHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlOworCisgICAgICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyUmVxdWVzdChmaW5hbCBVUkkgYmFzZVVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVSSSByZXF1ZXN0VXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlKSB7CisgICAgICAgICAgICBzdXBlcihiYXNlVXJpLCByZXF1ZXN0VXJpLCBtZXRob2QsIHNlY3VyaXR5Q29udGV4dCwgcHJvcGVydGllc0RlbGVnYXRlKTsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydGllc0RlbGVnYXRlID0gcHJvcGVydGllc0RlbGVnYXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RW50aXR5KGZpbmFsIE9iamVjdCBlbnRpdHkpIHsKKyAgICAgICAgICAgIGlmIChlbnRpdHkgaW5zdGFuY2VvZiBHZW5lcmljRW50aXR5KSB7CisgICAgICAgICAgICAgICAgdGhpcy5lbnRpdHkgPSAoKEdlbmVyaWNFbnRpdHkpIGVudGl0eSkuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICAgICAgdGhpcy5lbnRpdHlUeXBlID0gbmV3IEdlbmVyaWNUeXBlKCgoR2VuZXJpY0VudGl0eSkgZW50aXR5KS5nZXRUeXBlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmVudGl0eSA9IGVudGl0eTsKKyAgICAgICAgICAgICAgICB0aGlzLmVudGl0eVR5cGUgPSBuZXcgR2VuZXJpY1R5cGUoZW50aXR5LmdldENsYXNzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFdvcmtlcnMoZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnMpIHsKKyAgICAgICAgICAgIHN1cGVyLnNldFdvcmtlcnMod29ya2Vycyk7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gZW50aXR5Qnl0ZXM7CisgICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gbXlNYXAgPSBuZXcgTXVsdGl2YWx1ZWRIYXNoTWFwPFN0cmluZywgT2JqZWN0PihnZXRIZWFkZXJzKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IHdvcmtlcnMud3JpdGVUbyhlbnRpdHksIGVudGl0eS5nZXRDbGFzcygpLCBlbnRpdHlUeXBlLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvblswXSwgZ2V0TWVkaWFUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc0RlbGVnYXRlLCBiYW9zLCBDb2xsZWN0aW9ucy48V3JpdGVySW50ZXJjZXB0b3I+ZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIHwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihUZXN0Q29udGFpbmVyUmVxdWVzdC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW50aXR5Qnl0ZXMgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVudGl0eUJ5dGVzID0gbmV3IGJ5dGVbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRFbnRpdHlTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVudGl0eUJ5dGVzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpOworICAgIHByaXZhdGUgZmluYWwgVGVzdENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdDsKKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGZyb20oZmluYWwgU3RyaW5nIHJlcXVlc3RVcmksIGZpbmFsIFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIGZyb20obnVsbCwgcmVxdWVzdFVyaSwgbWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciBmcm9tKGZpbmFsIFN0cmluZyBiYXNlVXJpLCBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RDb250ZXh0QnVpbGRlcihiYXNlVXJpLCByZXF1ZXN0VXJpLCBtZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGZyb20oZmluYWwgVVJJIHJlcXVlc3RVcmksIGZpbmFsIFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIGZyb20obnVsbCwgcmVxdWVzdFVyaSwgbWV0aG9kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciBmcm9tKGZpbmFsIFVSSSBiYXNlVXJpLCBmaW5hbCBVUkkgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RDb250ZXh0QnVpbGRlcihiYXNlVXJpLCByZXF1ZXN0VXJpLCBtZXRob2QpOworICAgIH0KKworICAgIHByaXZhdGUgUmVxdWVzdENvbnRleHRCdWlsZGVyKGZpbmFsIFN0cmluZyBiYXNlVXJpLCBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICB0aGlzKGJhc2VVcmkgPT0gbnVsbCB8fCBiYXNlVXJpLmlzRW1wdHkoKSA/IG51bGwgOiBVUkkuY3JlYXRlKGJhc2VVcmkpLCBVUkkuY3JlYXRlKHJlcXVlc3RVcmkpLCBtZXRob2QpOworICAgIH0KKworICAgIHByaXZhdGUgUmVxdWVzdENvbnRleHRCdWlsZGVyKGZpbmFsIFVSSSBiYXNlVXJpLCBmaW5hbCBVUkkgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXF1ZXN0ID0gbmV3IFRlc3RDb250YWluZXJSZXF1ZXN0KGJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCwgbnVsbCwKKyAgICAgICAgICAgICAgICBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBDb250YWluZXJSZXF1ZXN0IGJ1aWxkKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGFjY2VwdChmaW5hbCBTdHJpbmcuLi4gYWNjZXB0SGVhZGVyKSB7CisgICAgICAgIHB1dEhlYWRlcnMoSHR0cEhlYWRlcnMuQUNDRVBULCBhY2NlcHRIZWFkZXIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGFjY2VwdChmaW5hbCBNZWRpYVR5cGUuLi4gYWNjZXB0SGVhZGVyKSB7CisgICAgICAgIHB1dEhlYWRlcnMoSHR0cEhlYWRlcnMuQUNDRVBULCAoT2JqZWN0W10pIGFjY2VwdEhlYWRlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgZW50aXR5KGZpbmFsIE9iamVjdCBlbnRpdHkpIHsKKyAgICAgICAgcmVxdWVzdC5zZXRFbnRpdHkoZW50aXR5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciB0eXBlKGZpbmFsIFN0cmluZyBjb250ZW50VHlwZSkgeworICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCBjb250ZW50VHlwZSk7CisgICAgICAgIHJldHVybiB0aGlzOworCisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciB0eXBlKGZpbmFsIE1lZGlhVHlwZSBjb250ZW50VHlwZSkgeworICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCBIZWFkZXJVdGlscy5hc1N0cmluZyhjb250ZW50VHlwZSwgZGVsZWdhdGUpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciBoZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBwdXRIZWFkZXIobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGNvb2tpZShmaW5hbCBDb29raWUgY29va2llKSB7CisgICAgICAgIHB1dEhlYWRlcihIdHRwSGVhZGVycy5DT09LSUUsIGNvb2tpZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgY29va2llcyhmaW5hbCBDb29raWUuLi4gY29va2llcykgeworICAgICAgICBwdXRIZWFkZXJzKEh0dHBIZWFkZXJzLkNPT0tJRSwgKE9iamVjdFtdKSBjb29raWVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1dEhlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5yZW1vdmUobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5oZWFkZXIobmFtZSwgSGVhZGVyVXRpbHMuYXNTdHJpbmcodmFsdWUsIGRlbGVnYXRlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1dEhlYWRlcnMoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5yZW1vdmUobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkuYWRkQWxsKG5hbWUsIEhlYWRlclV0aWxzLmFzU3RyaW5nTGlzdChBcnJheXMuYXNMaXN0KHZhbHVlcyksIGRlbGVnYXRlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1dEhlYWRlcnMoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZy4uLiB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5yZW1vdmUobmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkuYWRkQWxsKG5hbWUsIHZhbHVlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc2NvcGVzL1Njb3Blc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3Njb3Blcy9TY29wZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiZTE3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3Njb3Blcy9TY29wZXNUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZS5zY29wZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBDREkgcmVzb3VyY2VzLgorICovCitwdWJsaWMgY2xhc3MgU2NvcGVzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXF1ZXN0U2NvcGVkUmVzb3VyY2UuY2xhc3MsIFNpbmdsZXRvblNjb3BlZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1JlcXVlc3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSByZXNwb25zZTEgPSB0YXJnZXQoKS5wYXRoKCJyZXF1ZXN0IikucGF0aCgiSmFtZXMiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykuc3BsaXQoIiAiKTsKKyAgICAgICAgU3RyaW5nW10gcmVzcG9uc2UyID0gdGFyZ2V0KCkucGF0aCgicmVxdWVzdCIpLnBhdGgoIk1hcmN1cyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKS5zcGxpdCgiICIpOworICAgICAgICBhc3NlcnRSZXNwb25zZXMoInJlcXVlc3QiLCByZXNwb25zZTEsIHJlc3BvbnNlMik7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhyZXNwb25zZTFbM10sIHJlc3BvbnNlMlszXSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tTaW5nbGV0b24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBTdHJpbmdbXSByZXNwb25zZTEgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24iKS5wYXRoKCJKYW1lcyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKS5zcGxpdCgiICIpOworICAgICAgICBTdHJpbmdbXSByZXNwb25zZTIgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24iKS5wYXRoKCJNYXJjdXMiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykuc3BsaXQoIiAiKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VzKCJzaW5nbGV0b24iLCByZXNwb25zZTEsIHJlc3BvbnNlMik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZTFbM10sIHJlc3BvbnNlMlszXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc3BvbnNlcyhTdHJpbmcgdHlwZSwgU3RyaW5nW10gcmVzcG9uc2UxLCBTdHJpbmdbXSByZXNwb25zZTIpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsb19KYW1lcyIsIHJlc3BvbnNlMVswXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzFdIiwgcmVzcG9uc2UxWzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIHR5cGUgKyAiL0phbWVzXSIsIHJlc3BvbnNlMVsyXSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsb19NYXJjdXMiLCByZXNwb25zZTJbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsyXSIsIHJlc3BvbnNlMlsxXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyB0eXBlICsgIi9NYXJjdXNdIiwgcmVzcG9uc2UyWzJdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvTW9kZWxQcm9jZXNzb3JTY29wZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Nb2RlbFByb2Nlc3NvclNjb3BlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzFhNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvTW9kZWxQcm9jZXNzb3JTY29wZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZS5zdWJyZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2UuUmVxdWVzdENvbnRleHRCdWlsZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3Qgc2NvcGUgb2YgcmVzb3VyY2VzIGVuaGFuY2VkIGJ5IG1vZGVsIHByb2Nlc3NvcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIE1vZGVsUHJvY2Vzc29yU2NvcGVUZXN0IHsKKworICAgIHByaXZhdGUgdm9pZCBfdGVzdENvdW50ZXIoQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciwgU3RyaW5nIHJlcXVlc3RVcmksIGZpbmFsIFN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRTZWNvbmRIaXQpIHRocm93cworICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHJlcXVlc3RVcmksCisgICAgICAgICAgICAgICAgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXggKyAiOjAiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHJlcXVlc3RVcmksCisgICAgICAgICAgICAgICAgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMocHJlZml4ICsgIjoiICsgZXhwZWN0ZWRTZWNvbmRIaXQsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b24oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhNb2RlbFByb2Nlc3NvckZlYXR1cmUKKyAgICAgICAgICAgICAgICAuU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSAiL3NpbmdsZXRvbiI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJTaW5nbGV0b25SZXNvdXJjZSIsICIxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSW5Nb2RlbFByb2Nlc3NvcigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNb2RlbFByb2Nlc3NvckZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSAiL3NpbmdsZXRvbiI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJTaW5nbGV0b25SZXNvdXJjZSIsICIxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VTaW5nbGV0b25Jbk9yaWdpbmFsTW9kZWwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSAiL3Jvb3Qvc3ViLXJlc291cmNlLXNpbmdsZXRvbiI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJTdWJSZXNvdXJjZVNpbmdsZXRvbiIsICIxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VFbmhhbmNlZFNpbmdsZXRvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvcm9vdC9zdWItcmVzb3VyY2Utc2luZ2xldG9uL2VuaGFuY2VkLXNpbmdsZXRvbiI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJFbmhhbmNlZFN1YlJlc291cmNlU2luZ2xldG9uIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUluc3RhbmNlRW5oYW5jZWRTaW5nbGV0b24oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSAiL3Jvb3Qvc3ViLXJlc291cmNlLWluc3RhbmNlL2VuaGFuY2VkLXNpbmdsZXRvbiI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJFbmhhbmNlZFN1YlJlc291cmNlU2luZ2xldG9uIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUluc3RhbmNlRW5oYW5jZWRTdWJSZXNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvcm9vdC9zdWItcmVzb3VyY2UtaW5zdGFuY2UvZW5oYW5jZWQiOworICAgICAgICBfdGVzdENvdW50ZXIoYXBwbGljYXRpb25IYW5kbGVyLCByZXF1ZXN0VXJpLCAiRW5oYW5jZWRTdWJSZXNvdXJjZSIsICIwIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VFbmhhbmNlZFN1YlJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9yb290L3N1Yi1yZXNvdXJjZS1zaW5nbGV0b24vZW5oYW5jZWQiOworICAgICAgICBfdGVzdENvdW50ZXIoYXBwbGljYXRpb25IYW5kbGVyLCByZXF1ZXN0VXJpLCAiRW5oYW5jZWRTdWJSZXNvdXJjZSIsICIwIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VJbk1vZGVsUHJvY2Vzc29yKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1vZGVsUHJvY2Vzc29yRmVhdHVyZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvaW5zdGFuY2UiOworICAgICAgICBfdGVzdENvdW50ZXIoYXBwbGljYXRpb25IYW5kbGVyLCByZXF1ZXN0VXJpLCAiSW5mbGVjdG9yIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb290U2luZ2xldG9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFJvb3RTaW5nbGV0b25SZXNvdXJjZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvcm9vdC1zaW5nbGV0b24iOworICAgICAgICBfdGVzdENvdW50ZXIoYXBwbGljYXRpb25IYW5kbGVyLCByZXF1ZXN0VXJpLCAiUm9vdFNpbmdsZXRvblJlc291cmNlIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0U2NvcGVSZXNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSb290U2luZ2xldG9uUmVzb3VyY2UuY2xhc3MsIE1vZGVsUHJvY2Vzc29yRmVhdHVyZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvcmVxdWVzdC1zY29wZSI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJSZXF1ZXN0U2NvcGVSZXNvdXJjZSIsICIwIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L3Jlc291cmNlcy9zdXJlZmlyZS5wb2xpY3kgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1cmVmaXJlLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTk5YTVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L3Jlc291cmNlcy9zdXJlZmlyZS5wb2xpY3kKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLy8gd2UgZG8gbm90IGNhcmUgYWJvdXQgamF2YSBsaWIgaXRzZWxmCitncmFudCBjb2RlYmFzZSAiZmlsZToke2phdmEuaG9tZX0vLSIgeworICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIHdlIGRvIG5vdCBjYXJlIGFib3V0IG91ciBkZXBlbmRlbmNpZXMKK2dyYW50IGNvZGViYXNlICJmaWxlOiR7c2V0dGluZ3MubG9jYWxSZXBvc2l0b3J5fS8tIiB7CisgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gdGhpcyBpcyB0byBiZSBhYmxlIHRvIHNldCBydW50aW1lIGRlbGVnYXRlIGluc3RhbmNlIGluIGpheC1ycyBmcm9tIHRoZSB0ZXN0cworLy8gYW5kIHRvIHJ1biBtdWx0aS10aHJlYWRlZCB0ZXN0cworZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzLy0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbiAic3VwcHJlc3NBY2Nlc3NDaGVja3MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAibW9kaWZ5VGhyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICIqIiwgIndyaXRlIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldENsYXNzTG9hZGVyIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjLioiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7Cit9OworCitncmFudCBjb2RlYmFzZSAiZmlsZToke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzLy0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0RlY2xhcmVkTWVtYmVycyI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJnZXRDbGFzc0xvYWRlciI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJtb2RpZnlUaHJlYWQiOworICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAicmVhZCI7CisgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiPDxBTEwgRklMRVM+PiIsICJyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjLioiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7Cit9OwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9wb20ueG1sIGIvdGVzdHMvZTJlLWluamVjdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZWQzZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L3BvbS54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0czwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmUyZS1pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtZTJlLWluamVjdDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRTJFIEluamVjdCB0ZXN0czwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5jZGkyLXNlPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9wb20ueG1sIGIvdGVzdHMvZTJlLXNlcnZlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2VjZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3BvbS54bWwKQEAgLTAsMCArMSwyMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lMmUtc2VydmVyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWUyZS1zZXJ2ZXI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEUyRSBTZXJ2ZXIgdGVzdHM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZvcmtDb3VudD4xPC9mb3JrQ291bnQ+CisgICAgICAgICAgICAgICAgICAgIDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlQXNzZXJ0aW9ucz5mYWxzZTwvZW5hYmxlQXNzZXJ0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1mcmVlbWFya2VyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1tdXN0YWNoZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWpldHRpc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZW50aXR5LWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1hcGFjaGUtY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktamV0dHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2lnbmF0dXJlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDItY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2d1YXZhLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD54bWx1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD54ZGs8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBkbyBub3QgdXNlIHNlY3VyaXR5IG1hbmFnZXIgZm9yIHhkayAtLT4KKyAgICAgICAgICAgICAgICA8c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZSAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0Fic3RyYWN0RGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0Fic3RyYWN0RGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTIwNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQWJzdHJhY3REaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworCisvKioKKyAqIFRoaXMgaXMgYmFzZSBmb3IgdGVzdHMgdGVzdGluZyBlbmFibGluZy9kaXNhYmxpbmcgY29uZmlndXJhdGlvbiBwcm9wZXJ0eQorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI01FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEV9LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXBUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0R2V0KGludCBleHBlY3RlZEdldFJlc3BvbnNlQ29kZSwgaW50IGV4cGVjdGVkUG9zdFJlc3BvbnNlQ29kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gIkplcnNleSI7CisgICAgICAgIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvIikucGF0aChuYW1lKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkR2V0UmVzcG9uc2VDb2RlLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0RmFtaWx5KCkgPT0gUmVzcG9uc2UuU3RhdHVzLkZhbWlseS5TVUNDRVNTRlVMKSB7CisgICAgICAgICAgICAgICAgVXNlbGVzc01lc3NhZ2UgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShVc2VsZXNzTWVzc2FnZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkhlbGxvICIgKyBuYW1lLCBlbnRpdHkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgRW50aXR5PFVzZWxlc3NNZXNzYWdlPiB1c2VsZXNzTWVzc2FnZUVudGl0eSA9IEVudGl0eS5lbnRpdHkobmV3IFVzZWxlc3NNZXNzYWdlKG5hbWUpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvIikucmVxdWVzdCgpLnBvc3QodXNlbGVzc01lc3NhZ2VFbnRpdHkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZFBvc3RSZXNwb25zZUNvZGUsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKSA9PSBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LlNVQ0NFU1NGVUwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChlbnRpdHkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmFtZSwgZW50aXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTWV0YWluZlNlcnZpY2VzQmluZGVyKGNvbmZpZykpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTWV0YWluZlNlcnZpY2VzQmluZGVyKGNvbmZpZykpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIEBDb25zdW1lcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie25hbWV9IikKKyAgICAgICAgcHVibGljIFVzZWxlc3NNZXNzYWdlIGdldChAUGF0aFBhcmFtKCJuYW1lIikgZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIFVzZWxlc3NNZXNzYWdlIHJlc3VsdCA9IG5ldyBVc2VsZXNzTWVzc2FnZSgpOworICAgICAgICAgICAgcmVzdWx0LnNldE1lc3NhZ2UoIkhlbGxvICIgKyBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgVXNlbGVzc01lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0TWVzc2FnZSgpOworICAgICAgICB9CisKKyAgICB9IC8vIGNsYXNzIFJlc291cmNlCisKKworICAgIC8qKgorICAgICAqIE1FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlciBPUiBNRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIgOgorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuQWJzdHJhY3REaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwVGVzdCRVc2VsZXNzTWVzc2FnZUJvZHlXcml0ZXIKKyAgICAgKi8KKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIEBDb25zdW1lcygidGV4dC9wbGFpbiIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVXNlbGVzc01lc3NhZ2VQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPFVzZWxlc3NNZXNzYWdlPiB7CisKKyAgICAgICAgcHVibGljIFVzZWxlc3NNZXNzYWdlUHJvdmlkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFVzZWxlc3NNZXNzYWdlLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVc2VsZXNzTWVzc2FnZSByZWFkRnJvbSgKKyAgICAgICAgICAgICAgICBDbGFzczxVc2VsZXNzTWVzc2FnZT4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVzZWxlc3NNZXNzYWdlKHJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFVzZWxlc3NNZXNzYWdlLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoVXNlbGVzc01lc3NhZ2UgcywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gcy5nZXRNZXNzYWdlKCkubGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBVc2VsZXNzTWVzc2FnZSB0LAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdyaXRlVG9Bc1N0cmluZyh0LmdldE1lc3NhZ2UoKSwgZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworICAgICAgICB9CisgICAgfSAvLyBjbGFzcyBVc2VsZXNzTWVzc2FnZUJvZHlXcml0ZXIKKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVc2VsZXNzTWVzc2FnZSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgICBwdWJsaWMgVXNlbGVzc01lc3NhZ2UoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXNlbGVzc01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiVXNlbGVzc01lc3NhZ2V7IgorICAgICAgICAgICAgICAgICAgICArICJtZXNzYWdlPSciICsgbWVzc2FnZSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgICAgIH0KKyAgICB9IC8vIGNsYXNzIFVzZWxlc3NNZXNzYWdlCisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXRhaW5mU2VydmljZXNCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgUnVudGltZVR5cGUgcnVudGltZVR5cGU7CisKKyAgICAgICAgcHVibGljIE1ldGFpbmZTZXJ2aWNlc0JpbmRlcihmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gY29uZmlnLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHRoaXMucnVudGltZVR5cGUgPSBjb25maWcuZ2V0UnVudGltZVR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAvLyBNZXNzYWdlIEJvZHkgcHJvdmlkZXJzLgorICAgICAgICAgICAgaW5zdGFsbChuZXcgU2VydmljZUZpbmRlckJpbmRlcjw+KE1lc3NhZ2VCb2R5UmVhZGVyLmNsYXNzLCBwcm9wZXJ0aWVzLCBydW50aW1lVHlwZSkpOworICAgICAgICAgICAgaW5zdGFsbChuZXcgU2VydmljZUZpbmRlckJpbmRlcjw+KE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzLCBwcm9wZXJ0aWVzLCBydW50aW1lVHlwZSkpOworICAgICAgICAgICAgLy8gRXhjZXB0aW9uIE1hcHBlcnMuCisgICAgICAgICAgICBpbnN0YWxsKG5ldyBTZXJ2aWNlRmluZGVyQmluZGVyPD4oRXhjZXB0aW9uTWFwcGVyLmNsYXNzLCBwcm9wZXJ0aWVzLCBydW50aW1lVHlwZSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQWxsSW5qZWN0YWJsZXNUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BbGxJbmplY3RhYmxlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjliMDMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQWxsSW5qZWN0YWJsZXNUZXN0LmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEFsbEluamVjdGFibGVzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInBlci1yZXF1ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlclJlcXVlc3RDb250ZXh0UmVzb3VyY2UgeworICAgICAgICBAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHA7CisgICAgICAgIEBDb250ZXh0IFJlc291cmNlQ29udGV4dCByYzsKKyAgICAgICAgQENvbnRleHQgQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgIEBDb250ZXh0IE1lc3NhZ2VCb2R5V29ya2VycyBtYnc7CisgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhzOworICAgICAgICBAQ29udGV4dCBVcmlJbmZvIHVpOworICAgICAgICBAQ29udGV4dCBFeHRlbmRlZFVyaUluZm8gZXVpOworICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHI7CisgICAgICAgIEBDb250ZXh0IFNlY3VyaXR5Q29udGV4dCBzYzsKKyAgICAgICAgQENvbnRleHQgUHJvdmlkZXJzIHA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXBwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWcpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtYncpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChocyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHVpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXVpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocCk7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGVyLXJlcXVlc3QtY29uc3RydWN0b3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyUmVxdWVzdENvbnRleHRDb25zdHJ1Y3RvclBhcmFtZXRlclJlc291cmNlIHsKKyAgICAgICAgcHVibGljIFBlclJlcXVlc3RDb250ZXh0Q29uc3RydWN0b3JQYXJhbWV0ZXJSZXNvdXJjZShAQ29udGV4dCBmaW5hbCBBcHBsaWNhdGlvbiBhcHAsIEBDb250ZXh0IGZpbmFsIFJlc291cmNlQ29udGV4dCByYywKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywgQENvbnRleHQgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIG1idywgQENvbnRleHQgZmluYWwgSHR0cEhlYWRlcnMgaHMsCisgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgVXJpSW5mbyB1aSwgQENvbnRleHQgZmluYWwgRXh0ZW5kZWRVcmlJbmZvIGV1aSwgQENvbnRleHQgZmluYWwgUmVxdWVzdCByLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIFNlY3VyaXR5Q29udGV4dCBzYywgQENvbnRleHQgZmluYWwgUHJvdmlkZXJzIHApIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXBwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWcpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtYncpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChocyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHVpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXVpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBlci1yZXF1ZXN0LW1ldGhvZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJSZXF1ZXN0Q29udGV4dE1ldGhvZFBhcmFtZXRlclJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAQ29udGV4dCBmaW5hbCBBcHBsaWNhdGlvbiBhcHAsIEBDb250ZXh0IGZpbmFsIFJlc291cmNlQ29udGV4dCByYywgQENvbnRleHQgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyBtYncsIEBDb250ZXh0IGZpbmFsIEh0dHBIZWFkZXJzIGhzLCBAQ29udGV4dCBmaW5hbCBVcmlJbmZvIHVpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBFeHRlbmRlZFVyaUluZm8gZXVpLCBAQ29udGV4dCBmaW5hbCBSZXF1ZXN0IHIsIEBDb250ZXh0IGZpbmFsIFNlY3VyaXR5Q29udGV4dCBzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgUHJvdmlkZXJzIHApIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXBwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWcpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtYncpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChocyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHVpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXVpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocCk7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25Db250ZXh0UmVzb3VyY2UgeworICAgICAgICBAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHA7CisgICAgICAgIEBDb250ZXh0IFJlc291cmNlQ29udGV4dCByYzsKKyAgICAgICAgQENvbnRleHQgQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgIEBDb250ZXh0IE1lc3NhZ2VCb2R5V29ya2VycyBtYnc7CisgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhzOworICAgICAgICBAQ29udGV4dCBVcmlJbmZvIHVpOworICAgICAgICBAQ29udGV4dCBFeHRlbmRlZFVyaUluZm8gZXVpOworICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHI7CisgICAgICAgIEBDb250ZXh0IFNlY3VyaXR5Q29udGV4dCBzYzsKKyAgICAgICAgQENvbnRleHQgUHJvdmlkZXJzIHA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYXBwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWcpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtYncpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChocyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHVpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXVpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocCk7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgic2luZ2xldG9uLWNvbnN0cnVjdG9yIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvbkNvbnRleHRDb25zdHJ1Y3RvclBhcmFtZXRlclJlc291cmNlIHsKKyAgICAgICAgcHVibGljIFNpbmdsZXRvbkNvbnRleHRDb25zdHJ1Y3RvclBhcmFtZXRlclJlc291cmNlKEBDb250ZXh0IGZpbmFsIEFwcGxpY2F0aW9uIGFwcCwgQENvbnRleHQgZmluYWwgUmVzb3VyY2VDb250ZXh0IHJjLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLCBAQ29udGV4dCBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgbWJ3LCBAQ29udGV4dCBmaW5hbCBIdHRwSGVhZGVycyBocywKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBVcmlJbmZvIHVpLCBAQ29udGV4dCBmaW5hbCBFeHRlbmRlZFVyaUluZm8gZXVpLCBAQ29udGV4dCBmaW5hbCBSZXF1ZXN0IHIsCisgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgU2VjdXJpdHlDb250ZXh0IHNjLCBAQ29udGV4dCBmaW5hbCBQcm92aWRlcnMgcCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcHApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyYyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1idyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGhzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChldWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2MpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFBlclJlcXVlc3RDb250ZXh0UmVzb3VyY2UuY2xhc3MsIFBlclJlcXVlc3RDb250ZXh0Q29uc3RydWN0b3JQYXJhbWV0ZXJSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBQZXJSZXF1ZXN0Q29udGV4dE1ldGhvZFBhcmFtZXRlclJlc291cmNlLmNsYXNzLCBTaW5nbGV0b25Db250ZXh0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgU2luZ2xldG9uQ29udGV4dENvbnN0cnVjdG9yUGFyYW1ldGVyUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBlclJlcXVlc3RJbmplY3RlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgdGFyZ2V0KCkucGF0aCgiL3Blci1yZXF1ZXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0Q29uc3RydWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHRhcmdldCgpLnBhdGgoIi9wZXItcmVxdWVzdC1jb25zdHJ1Y3RvciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyUmVxdWVzdE1ldGhvZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgdGFyZ2V0KCkucGF0aCgiL3Blci1yZXF1ZXN0LW1ldGhvZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCB0YXJnZXQoKS5wYXRoKCIvc2luZ2xldG9uIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25Db25zdHJ1Y3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgdGFyZ2V0KCkucGF0aCgiL3NpbmdsZXRvbi1jb25zdHJ1Y3RvciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BbWJpZ291c1Jlc291cmNlTWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQW1iaWdvdXNSZXNvdXJjZU1ldGhvZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWIyNDllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQW1iaWdvdXNSZXNvdXJjZU1ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IG9mIHZhbGlkYXRpb24gb2YgcmVzb3VyY2VzIGFzIGFuIGVuZC10by1lbmQgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgQW1iaWdvdXNSZXNvdXJjZU1ldGhvZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0VG9BbWJpZ3VvdXNSZXNvdXJjZUNsYXNzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgc2ltcGxlTmFtZSA9IFRlc3RSZXNvdXJjZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNpbXBsZU5hbWUgKyBzaW1wbGVOYW1lLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2ltcGxlTmFtZSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSkucG9zdChFbnRpdHkuZW50aXR5KCJhYWFhIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzaW1wbGVOYW1lICsgc2ltcGxlTmFtZSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSkucG9zdChFbnRpdHkuZW50aXR5KCJhYWFhIiwgTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNpbXBsZU5hbWUsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhbWJpZ3VvdXMgcmVzb3VyY2UgY2xhc3MuCisgICAgICovCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBzdWIoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc3Vic3ViKCkgeworICAgICAgICAgICAgcmV0dXJuIHN1YigpICsgc3ViKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHN1YigpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Z2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHN1YnN1YigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXBwTmFtZUJpbmRpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BcHBOYW1lQmluZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjFkZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXBwTmFtZUJpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEFwcE5hbWVCaW5kaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBOYW1lQmluZGluZworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHJpdmF0ZSBzdGF0aWMgQGludGVyZmFjZSBHbG9iYWwge30KKworICAgIEBOYW1lQmluZGluZworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHJpdmF0ZSBzdGF0aWMgQGludGVyZmFjZSBOYW1lQm91bmRSZXF1ZXN0IHt9CisKKyAgICBAR2xvYmFsCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHbG9iYWxOYW1lQm91bmRGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5vaygiZ2xvYmFsIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJvdW5kUmVxdWVzdAorICAgIEBQcmlvcml0eSgxKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZUJvdW5kUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCJuYW1lQm91bmRSZXF1ZXN0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAR2xvYmFsCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlQ29uZmlnIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworICAgICAgICBwdWJsaWMgTXlSZXNvdXJjZUNvbmZpZygpIHsKKyAgICAgICAgICAgIHN1cGVyKAorICAgICAgICAgICAgICAgICAgICBNeVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBHbG9iYWxOYW1lQm91bmRGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIE5hbWVCb3VuZFJlcXVlc3RGaWx0ZXIuY2xhc3MKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAgICAgICAgQFBhdGgoIm5hbWVCb3VuZFJlcXVlc3QiKQorICAgICAgICBAR0VUCisgICAgICAgIEBOYW1lQm91bmRSZXF1ZXN0CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUJvdW5kUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJnbG9iYWwiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdE1hdGNoaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeVJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUJvdW5kUmVxdWVzdCgpIHsKKyAgICAgICAgdGVzdCgibmFtZUJvdW5kUmVxdWVzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdsb2JhbCgpIHsKKyAgICAgICAgdGVzdCgiZ2xvYmFsIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldChuYW1lKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FwcE5hbWVCaW5kaW5nVGVzdDIuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FwcE5hbWVCaW5kaW5nVGVzdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWU5MDAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXBwTmFtZUJpbmRpbmdUZXN0Mi5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3Qge0BsaW5rIE5hbWVCaW5kaW5nIG5hbWUgYmluZGluZ30gYW5ub3RhdGlvbnMgb24gdGhlIHtAbGluayBBcHBsaWNhdGlvbn0gY2xhc3MuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQXBwTmFtZUJpbmRpbmdUZXN0MiBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcCgpOworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBGaXJzdEdsb2JhbE5hbWVCaW5kaW5nIHsKKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgU2Vjb25kR2xvYmFsTmFtZUJpbmRpbmcgeworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUaGlyZEdsb2JhbE5hbWVCaW5kaW5nIHsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBARmlyc3RHbG9iYWxOYW1lQmluZGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWRkT25lSW50ZXJjZXB0b3IgaW1wbGVtZW50cworICAgICAgICAgICAgV3JpdGVySW50ZXJjZXB0b3IgeworICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIGVudGl0eSA9IChTdHJpbmcpIGNvbnRleHQuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICBJbnRlZ2VyIGkgPSBJbnRlZ2VyLnBhcnNlSW50KGVudGl0eSk7CisgICAgICAgICAgICBlbnRpdHkgPSBTdHJpbmcudmFsdWVPZihpICsgMSk7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBARmlyc3RHbG9iYWxOYW1lQmluZGluZworICAgIEBTZWNvbmRHbG9iYWxOYW1lQmluZGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWRkSHVuZHJlZEludGVyY2VwdG9yIGltcGxlbWVudHMKKyAgICAgICAgICAgIFdyaXRlckludGVyY2VwdG9yIHsKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBlbnRpdHkgPSAoU3RyaW5nKSBjb250ZXh0LmdldEVudGl0eSgpOworICAgICAgICAgICAgSW50ZWdlciBpID0gSW50ZWdlci5wYXJzZUludChlbnRpdHkpOworICAgICAgICAgICAgZW50aXR5ID0gU3RyaW5nLnZhbHVlT2YoaSArIDEwMCk7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBARmlyc3RHbG9iYWxOYW1lQmluZGluZworICAgIEBTZWNvbmRHbG9iYWxOYW1lQmluZGluZworICAgIEBUaGlyZEdsb2JhbE5hbWVCaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBZGRUaG91c2FuZEludGVyY2VwdG9yIGltcGxlbWVudHMKKyAgICAgICAgICAgIFdyaXRlckludGVyY2VwdG9yIHsKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBlbnRpdHkgPSAoU3RyaW5nKSBjb250ZXh0LmdldEVudGl0eSgpOworICAgICAgICAgICAgSW50ZWdlciBpID0gSW50ZWdlci5wYXJzZUludChlbnRpdHkpOworICAgICAgICAgICAgZW50aXR5ID0gU3RyaW5nLnZhbHVlT2YoaSArIDEwMDApOworICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoZW50aXR5KTsKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQEZpcnN0R2xvYmFsTmFtZUJpbmRpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFkZFRlbkZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgZW50aXR5ID0gKFN0cmluZykgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpOworICAgICAgICAgICAgSW50ZWdlciBpID0gSW50ZWdlci52YWx1ZU9mKGVudGl0eSk7CisgICAgICAgICAgICBlbnRpdHkgPSBTdHJpbmcudmFsdWVPZihpICsgMTApOworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eShlbnRpdHksIChBbm5vdGF0aW9uW10pIG51bGwsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgQEZpcnN0R2xvYmFsTmFtZUJpbmRpbmcKKyAgICBAU2Vjb25kR2xvYmFsTmFtZUJpbmRpbmcKKyAgICBwdWJsaWMgY2xhc3MgTXlBcHAgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICAgICAgcHVibGljIGphdmEudXRpbC5TZXQ8amF2YS5sYW5nLkNsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgU2V0PENsYXNzPD8+PiByZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5hZGQoUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChBZGRPbmVJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuYWRkKEFkZFRlbkZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuYWRkKEFkZEh1bmRyZWRJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuYWRkKEFkZFRob3VzYW5kSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImJpbmQiKQorICAgICAgICBARmlyc3RHbG9iYWxOYW1lQmluZGluZworICAgICAgICBAVGhpcmRHbG9iYWxOYW1lQmluZGluZworICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9XaXRoQmluZChTdHJpbmcgZWNobykgeworICAgICAgICAgICAgLy8gbm90ZTogQWRkVGhvdXNhbmRJbnRlcmNlcHRvciB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQgZXZlbiB3ZSBoYXZlIGhlcmUgQFRoaXJkR2xvYmFsTmFtZUJpbmRpbmcuIEFubm90YXRpb25zIGZyb20KKyAgICAgICAgICAgIC8vIEFwcGxpY2F0aW9uIGNsYXNzIGFuZCBmcm9tIHJlc291cmNlIG1ldGhvZHMgYXJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5LgorCisgICAgICAgICAgICByZXR1cm4gZWNobzsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJub2JpbmQiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9Ob0JpbmQoU3RyaW5nIGVjaG8pIHsKKyAgICAgICAgICAgIHJldHVybiBlY2hvOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9iaW5kIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5wb3N0KAorICAgICAgICAgICAgICAgIEVudGl0eS5lbnRpdHkoSW50ZWdlci52YWx1ZU9mKDApLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgSW50ZWdlciBpbnRlZ2VyID0gcmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDExMSwgaW50ZWdlci5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vQmluZCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9ub2JpbmQiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLnBvc3QoCisgICAgICAgICAgICAgICAgRW50aXR5LmVudGl0eShJbnRlZ2VyLnZhbHVlT2YoMCksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBJbnRlZ2VyIGludGVnZXIgPSByZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTExLCBpbnRlZ2VyLmludFZhbHVlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXN5bmNDYWxsYmFja1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FzeW5jQ2FsbGJhY2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkZjAzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FzeW5jQ2FsbGJhY2tUZXN0LmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db25uZWN0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMge0BsaW5rIENvbm5lY3Rpb25DYWxsYmFjayBjb25uZWN0aW9uIGNhbGxiYWNrfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBBc3luY0NhbGxiYWNrVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIG9uRGlzY29ubmVjdENhbGxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgIHB1YmxpYyBzdGF0aWMgQ291bnREb3duTGF0Y2ggc3RyZWFtQ2xvc2VkU2lnbmFsOworICAgIHB1YmxpYyBzdGF0aWMgQ291bnREb3duTGF0Y2ggY2FsbGJhY2tDYWxsZWRTaWduYWw7CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQE1hbmFnZWRBc3luYworICAgICAgICBAUGF0aCgib3V0cHV0U3RyZWFtIikKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVnaXN0ZXIoTXlDb25uZWN0aW9uQ2FsbGJhY2suY2xhc3MpOworICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaXMgPSBuZXcgSW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjUgKyAoKytjb3VudGVyICUgMzUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQE1hbmFnZWRBc3luYworICAgICAgICBAUGF0aCgiY2h1bmtlZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIGdldENodW5rZWRPdXRwdXQoQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZWdpc3RlcihNeUNvbm5lY3Rpb25DYWxsYmFjay5jbGFzcyk7CisgICAgICAgICAgICBDaHVua2VkT3V0cHV0PFN0cmluZz4gY2h1bmtlZE91dHB1dCA9IG5ldyBDaHVua2VkT3V0cHV0PFN0cmluZz4oU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKGNodW5rZWRPdXRwdXQpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2h1bmtlZE91dHB1dC53cml0ZSgic29tZXRoaW5nLSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TGF0Y2ggZXh0ZW5kcyBDb3VudERvd25MYXRjaCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbXVsdGlwbGllcjsKKworICAgICAgICBwdWJsaWMgVGVzdExhdGNoKGludCBjb3VudCwgU3RyaW5nIG5hbWUsIGludCBtdWx0aXBsaWVyKSB7CisgICAgICAgICAgICBzdXBlcihjb3VudCk7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy5tdWx0aXBsaWVyID0gbXVsdGlwbGllcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb3VudERvd24oKSB7CisgICAgICAgICAgICBzdXBlci5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhd2FpdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHN1Y2Nlc3MgPSBzdXBlci5hd2FpdCgxMCAqIG11bHRpcGxpZXIsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIjogTGF0Y2ggWyIgKyBuYW1lICsgIl0gYXdhaXRpbmcgLT4gdGltZW91dCEhISIsCisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBvbkRpc2Nvbm5lY3RDYWxsZWQuc2V0KGZhbHNlKTsKKyAgICAgICAgc3RyZWFtQ2xvc2VkU2lnbmFsID0gbmV3IFRlc3RMYXRjaCgxLCAic3RyZWFtQ2xvc2VkU2lnbmFsIiwgZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpKTsKKyAgICAgICAgY2FsbGJhY2tDYWxsZWRTaWduYWwgPSBuZXcgVGVzdExhdGNoKDEsICJjYWxsYmFja0NhbGxlZFNpZ25hbCIsIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RDb25uZWN0aW9uQ2FsbGJhY2soInJlc291cmNlL291dHB1dFN0cmVhbSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENodW5rZWRPdXRwdXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RDb25uZWN0aW9uQ2FsbGJhY2soInJlc291cmNlL2NodW5rZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RDb25uZWN0aW9uQ2FsbGJhY2soU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocGF0aCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDsgaSsrKSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgc3RyZWFtQ2xvc2VkU2lnbmFsLmNvdW50RG93bigpOworICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbC5hd2FpdCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvbkRpc2Nvbm5lY3RDYWxsZWQuZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDb25uZWN0aW9uQ2FsbGJhY2sgaW1wbGVtZW50cyBDb25uZWN0aW9uQ2FsbGJhY2sgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc2Nvbm5lY3QoQXN5bmNSZXNwb25zZSBkaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgIG9uRGlzY29ubmVjdENhbGxlZC5zZXQodHJ1ZSk7CisgICAgICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FzeW5jUmVzcG9uc2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Bc3luY1Jlc3BvbnNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWZmNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Bc3luY1Jlc3BvbnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFzeW5jUmVzcG9uc2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIENvdW50RG93bkxhdGNoIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMTsKKyAgICBwdWJsaWMgc3RhdGljIENvdW50RG93bkxhdGNoIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMSA9IG5ldyBBc3luY0NhbGxiYWNrVGVzdC5UZXN0TGF0Y2goMywgImNhbmNlbCgpIHJldHVybiB2YWx1ZTEiLCBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCkpOworICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbDIgPSBuZXcgQXN5bmNDYWxsYmFja1Rlc3QuVGVzdExhdGNoKDMsICJjYW5jZWwoKSByZXR1cm4gdmFsdWUyIiwgZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpKTsKKworICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuRklORS5pbnRWYWx1ZSgpKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBFcnJvclJlc291cmNlLmNsYXNzLCBNYXBwZWRFeGNlcHRpb25NYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRW50aXR5QW5ub3RhdGlvbkNoZWNrZXJXcml0ZXIuY2xhc3MsIEFzeW5jTWVzc2FnZUJvZHlQcm92aWRlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhbmNlbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlLzEiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbDEuYXdhaXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxBZnRlclJlc3VtZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlLzIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbDIuYXdhaXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN1bWVXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UmVzdW1lRXhjZXB0aW9uKCJyZXN1bWVXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsICJyZXN1bWVXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc3VtZU1hcHBlZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UmVzdW1lRXhjZXB0aW9uKCJyZXN1bWVNYXBwZWRFeGNlcHRpb24iLCAicmVzdW1lTWFwcGVkRXhjZXB0aW9uIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdW1lUnVudGltZUV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UmVzdW1lRXhjZXB0aW9uKCJyZXN1bWVSdW50aW1lRXhjZXB0aW9uIiwgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRMYXN0TG9nZ2VkUmVjb3JkKCkuZ2V0VGhyb3duKCksIGluc3RhbmNlT2YoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc3VtZUNoZWNrZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlc3VtZUV4Y2VwdGlvbigicmVzdW1lQ2hlY2tlZEV4Y2VwdGlvbiIsIG51bGwpOworCisgICAgICAgIGFzc2VydFRoYXQoZ2V0TGFzdExvZ2dlZFJlY29yZCgpLmdldFRocm93bigpLCBpbnN0YW5jZU9mKElPRXhjZXB0aW9uLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZXN1bWVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBlbnRpdHkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZXJyb3JSZXNvdXJjZSA9IHRhcmdldCgiZXJyb3JSZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gc3VzcGVuZGVkID0gZXJyb3JSZXNvdXJjZS5wYXRoKCJzdXNwZW5kIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gZXJyb3JSZXNvdXJjZS5wYXRoKHBhdGgpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygib2siKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2Ugc3VzcGVuZGVkUmVzcG9uc2UgPSBzdXNwZW5kZWQuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChzdXNwZW5kZWRSZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg1MDApKTsKKyAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHN1c3BlbmRlZFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhlbnRpdHkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1c3BlbmRlZFJlc3BvbnNlLmNsb3NlKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhlcmUgaXMgbm8gTlBFLgorICAgICAgICBmb3IgKGZpbmFsIExvZ1JlY29yZCByZWNvcmQgOiBnZXRMb2dnZWRSZWNvcmRzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSB0aHJvd24gPSByZWNvcmQuZ2V0VGhyb3duKCk7CisgICAgICAgICAgICBpZiAodGhyb3duICE9IG51bGwgJiYgdGhyb3duIGluc3RhbmNlb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIE5QRS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiMSIpCisgICAgICAgIEBNYW5hZ2VkQXN5bmMKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0MShAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoYXN5bmNSZXNwb25zZS5jYW5jZWwoKSkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMS5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhc3luY1Jlc3BvbnNlLmNhbmNlbCgpKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tDYWxsZWRTaWduYWwxLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFzeW5jUmVzcG9uc2UuY2FuY2VsKCkpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbDEuY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIyIikKKyAgICAgICAgQE1hbmFnZWRBc3luYworICAgICAgICBwdWJsaWMgdm9pZCBnZXQyKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKCJvayIpOworCisgICAgICAgICAgICBpZiAoIWFzeW5jUmVzcG9uc2UuY2FuY2VsKCkpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbDIuY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFzeW5jUmVzcG9uc2UuY2FuY2VsKCkpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbDIuY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFzeW5jUmVzcG9uc2UuY2FuY2VsKCkpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbDIuY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcHBlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBNYXBwZWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXBwZWRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TWFwcGVkRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIE1hcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eShleGNlcHRpb24uZ2V0TWVzc2FnZSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImVycm9yUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3JSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmxvY2tpbmdRdWV1ZTxBc3luY1Jlc3BvbnNlPiBzdXNwZW5kZWQgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+KDEpOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1c3BlbmQiKQorICAgICAgICBwdWJsaWMgdm9pZCBzdXNwZW5kKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBzdXNwZW5kZWQuYWRkKGFzeW5jUmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzdW1lV2ViQXBwbGljYXRpb25FeGNlcHRpb24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc3VtZVdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gcmVzdW1lKG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eSgicmVzdW1lV2ViQXBwbGljYXRpb25FeGNlcHRpb24iKS5idWlsZCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXN1bWVNYXBwZWRFeGNlcHRpb24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc3VtZU1hcHBlZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHJlc3VtZShuZXcgTWFwcGVkRXhjZXB0aW9uKCJyZXN1bWVNYXBwZWRFeGNlcHRpb24iKSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXN1bWVSdW50aW1lRXhjZXB0aW9uIikKKyAgICAgICAgcHVibGljIFN0cmluZyByZXN1bWVSdW50aW1lRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gcmVzdW1lKG5ldyBSdW50aW1lRXhjZXB0aW9uKCJyZXN1bWVSdW50aW1lRXhjZXB0aW9uIikpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzdW1lQ2hlY2tlZEV4Y2VwdGlvbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzdW1lQ2hlY2tlZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHJlc3VtZShuZXcgSU9FeGNlcHRpb24oInJlc3VtZUNoZWNrZWRFeGNlcHRpb24iKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyByZXN1bWUoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3VzcGVuZGVkLnRha2UoKS5yZXN1bWUodGhyb3dhYmxlKSA/ICJvayIgOiAia28iOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlBbm5vdGF0aW9uQ2hlY2tlciB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlBbm5vdGF0aW9uQ2hlY2tlcldyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEVudGl0eUFubm90YXRpb25DaGVja2VyPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBFbnRpdHlBbm5vdGF0aW9uQ2hlY2tlciBlbnRpdHlBbm5vdGF0aW9uQ2hlY2tlciwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEVudGl0eUFubm90YXRpb25DaGVja2VyIGVudGl0eUFubm90YXRpb25DaGVja2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSBhbm5vdGF0aW9ucy5sZW5ndGggPiAwID8gIm9rIiA6ICJrbyI7CisKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShlbnRpdHkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiYW5ub3RhdGlvbnMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNNZXNzYWdlQm9keVByb3ZpZGVyUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4gc3VzcGVuZGVkID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxBc3luY1Jlc3BvbnNlPigxKTsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdXNwZW5kIikKKyAgICAgICAgcHVibGljIHZvaWQgc3VzcGVuZChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgc3VzcGVuZGVkLmFkZChhc3luY1Jlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1c3BlbmQtcmVzdW1lIikKKyAgICAgICAgcHVibGljIHZvaWQgc3VzcGVuZFJlc3VtZShAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IEVudGl0eUFubm90YXRpb25DaGVja2VyKCkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzdW1lIikKKyAgICAgICAgcHVibGljIFN0cmluZyByZXN1bWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzdXNwZW5kZWQudGFrZSgpLnJlc3VtZShuZXcgRW50aXR5QW5ub3RhdGlvbkNoZWNrZXIoKSkgPyAib2siIDogImtvIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlcnJvclJlc291cmNlID0gdGFyZ2V0KCJhbm5vdGF0aW9ucyIpOworCisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gc3VzcGVuZGVkID0gZXJyb3JSZXNvdXJjZS5wYXRoKCJzdXNwZW5kIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gZXJyb3JSZXNvdXJjZS5wYXRoKCJyZXN1bWUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygib2siKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2Ugc3VzcGVuZGVkUmVzcG9uc2UgPSBzdXNwZW5kZWQuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoIkVudGl0eSBhbm5vdGF0aW9ucyBhcmUgbm90IHByb3BhZ2F0ZWQgdG8gTUJXLiIsIHN1c3BlbmRlZFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIm9rIikpOworICAgICAgICBzdXNwZW5kZWRSZXNwb25zZS5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25zU3VzcGVuZFJlc3VtZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYW5ub3RhdGlvbnMiKS5wYXRoKCJzdXNwZW5kLXJlc3VtZSIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KCJFbnRpdHkgYW5ub3RhdGlvbnMgYXJlIG5vdCBwcm9wYWdhdGVkIHRvIE1CVy4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJvayIpKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9CZWFuUGFyYW1FeGNlcHRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9CZWFuUGFyYW1FeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3ZjM3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0JlYW5QYXJhbUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQmVhblBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlclByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5qc29uLkphY2tzb25KYXhiSnNvblByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5QYXJhbUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblByb3BlcnR5OworCisvKioKKyAqIFRlc3RzIHRoZSBhYmlsaXR5IHRvIGNhdGNoIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHRocm93biBpbiBQYXJhbUNvbnZlcnRlcgorICogdXNlZCBhbG9uZyB3aXRoIEJlYW5QYXJhbSBhbm5vdGF0aW9uLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICoqLworcHVibGljIGNsYXNzIEJlYW5QYXJhbUV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9OT1RfRk9VTkQgPSAie1wibWVzc2FnZVwiOlwiVGhpcyBwYXJhbWV0ZXIgd2FzIG5vdCBmb3VuZFwiLFwic3RhdHVzXCI6NDAwfSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIEJlYW5QYXJhbUNvbnRyb2xsZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgTW9kZWxPYmplY3RQYXJhbUNvbnZlcnRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBRdWVyeVBhcmFtRXJyb3JNYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgSmFja3NvbkpheGJKc29uUHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhblBhcmFtQ29udHJvbGxlciB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL3F1ZXJ5IikKKyAgICAgICAgcHVibGljIFN0cmluZyBxdWVyeVBhcmFtKEBRdWVyeVBhcmFtKCJxdWVyeVBhcmFtIikgZmluYWwgTW9kZWxPYmplY3QgbW9kZWxPYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiAiUXVlcnkgUGFyYW06ICIgKyBtb2RlbE9iamVjdC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL2JlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGJlYW5QYXJhbShAQmVhblBhcmFtIGZpbmFsIEJlYW5QYXJhbU9iamVjdCBiZWFuUGFyYW1PYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiAiQmVhbiBQYXJhbTogIiArIGJlYW5QYXJhbU9iamVjdC5nZXRNb2RlbE9iamVjdCgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9kZWxPYmplY3RQYXJhbUNvbnZlcnRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyPE1vZGVsT2JqZWN0PiwgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNb2RlbE9iamVjdCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgICAgICBpZiAoImV4Y2VwdGlvbiIuZXF1YWxzSWdub3JlQ2FzZShzKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRQYXJhbWV0ZXJFeGNlcHRpb24oIlRoaXMgcGFyYW1ldGVyIHdhcyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxPYmplY3Qocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhNb2RlbE9iamVjdCBtb2RlbE9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIG1vZGVsT2JqZWN0LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKENsYXNzPFQ+IGFDbGFzcywgVHlwZSB0eXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiBhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhNb2RlbE9iamVjdC5jbGFzcy5nZXROYW1lKCkpID8gKFBhcmFtQ29udmVydGVyPFQ+KSB0aGlzIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUXVlcnlQYXJhbUVycm9yTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFBhcmFtRXhjZXB0aW9uLlF1ZXJ5UGFyYW1FeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgUGFyYW1FeGNlcHRpb24uUXVlcnlQYXJhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBSZXNwb25zZS5TdGF0dXMgc3RhdHVzID0gUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUOworICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgQmFkUGFyYW1ldGVyRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmVudGl0eShuZXcgRXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRTdGF0dXNDb2RlKCksIGNhdXNlLmdldE1lc3NhZ2UoKSkpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcnNoYWxsRXhjZXB0aW9uUXVlcnkoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicXVlcnkiKS5xdWVyeVBhcmFtKCJxdWVyeVBhcmFtIiwgImV4Y2VwdGlvbiIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFSQU1fTk9UX0ZPVU5ELCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcnNoYWxsRXhjZXB0aW9uQmVhbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJiZWFuIikucXVlcnlQYXJhbSgicXVlcnlQYXJhbSIsICJleGNlcHRpb24iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBUkFNX05PVF9GT1VORCwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXJzaGFsbE1vZGVsUXVlcnkoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicXVlcnkiKS5xdWVyeVBhcmFtKCJxdWVyeVBhcmFtIiwgIm1vZGVsIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUXVlcnkgUGFyYW06IG1vZGVsIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXJzaGFsbE1vZGVsQmVhbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJiZWFuIikucXVlcnlQYXJhbSgicXVlcnlQYXJhbSIsICJtb2RlbCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJlYW4gUGFyYW06IG1vZGVsIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCYWRQYXJhbWV0ZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgICAgICBwdWJsaWMgQmFkUGFyYW1ldGVyRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhblBhcmFtT2JqZWN0IHsKKworICAgICAgICBmaW5hbCBNb2RlbE9iamVjdCBtb2RlbE9iamVjdDsKKworICAgICAgICBwdWJsaWMgQmVhblBhcmFtT2JqZWN0KEBRdWVyeVBhcmFtKCJxdWVyeVBhcmFtIikgZmluYWwgTW9kZWxPYmplY3QgbW9kZWxPYmplY3QpIHsKKyAgICAgICAgICAgIHRoaXMubW9kZWxPYmplY3QgPSBtb2RlbE9iamVjdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNb2RlbE9iamVjdCBnZXRNb2RlbE9iamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtb2RlbE9iamVjdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9kZWxPYmplY3QgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByaXZhdGVEYXRhOworCisgICAgICAgIHB1YmxpYyBNb2RlbE9iamVjdChmaW5hbCBTdHJpbmcgcHJpdmF0ZURhdGEpIHsKKyAgICAgICAgICAgIHRoaXMucHJpdmF0ZURhdGEgPSBwcml2YXRlRGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHByaXZhdGVEYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFcnJvck1lc3NhZ2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3RhdHVzOworCisgICAgICAgIHB1YmxpYyBFcnJvck1lc3NhZ2UoZmluYWwgaW50IHN0YXR1cywgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIEBKc29uUHJvcGVydHkKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBASnNvblByb3BlcnR5CisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQmVhblBhcmFtVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQmVhblBhcmFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzJiM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9CZWFuUGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuQ29va2llUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMge0BsaW5rIEJlYW5QYXJhbSBiZWFuIHBhcmFtIGluamVjdGlvbnN9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEJlYW5QYXJhbVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VJbml0aWFsaXplZEJ5U2V0dGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbXBhcmVCZWFuV2l0aFN0YW5kYXJkUGFyYW1zKCkgeworICAgICAgICBGdWxsQmVhbiBiZWFuID0gZ2V0RnVsbEJlYW4oKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBkb1JlcXVlc3QoYmVhbiwgInJlc291cmNlL2NvbXBhcmVCZWFuIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRydWUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUZ1bGxCZWFuKCkgeworICAgICAgICBGdWxsQmVhbiBiZWFuID0gZ2V0RnVsbEJlYW4oKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBkb1JlcXVlc3QoYmVhbiwgInJlc291cmNlL3NpbmdsZUJlYW4iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhiZWFuLnRvU3RyaW5nKCksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4oKSB7CisgICAgICAgIEZ1bGxCZWFuIGJlYW4gPSBnZXRGdWxsQmVhbigpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGRvUmVxdWVzdChiZWFuLCAicmVzb3VyY2UvY29uc3RydWN0b3JCZWFuIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYmVhbi50b1N0cmluZygpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR3b0Z1bGxCZWFucygpIHsKKyAgICAgICAgRnVsbEJlYW4gYmVhbiA9IGdldEZ1bGxCZWFuKCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gZG9SZXF1ZXN0KGJlYW4sICJyZXNvdXJjZS90d29CZWFucyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGJlYW4udG9TdHJpbmcoKSArICIgLyAiICsgYmVhbi50b1N0cmluZygpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR3b0RpZmZlcmVudEJlYW5zKCkgeworICAgICAgICBGdWxsQmVhbiBmdWxsQmVhbiA9IGdldEZ1bGxCZWFuKCk7CisgICAgICAgIFNtYWxsQmVhbiBzbWFsbEJlYW4gPSBuZXcgU21hbGxCZWFuKGZ1bGxCZWFuKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBkb1JlcXVlc3QoZnVsbEJlYW4sICJyZXNvdXJjZS9kaWZmZXJlbnRCZWFucyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZ1bGxCZWFuLnRvU3RyaW5nKCkgKyAiIC8gIiArIHNtYWxsQmVhbi50b1N0cmluZygpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRCZWFuKCkgeworICAgICAgICBGdWxsQmVhbiBmdWxsQmVhbiA9IGdldEZ1bGxCZWFuKCk7CisgICAgICAgIGZ1bGxCZWFuLnNldFF1ZXJ5UGFyYW0oImVuY29kZWQvYT8mJisuLz8iKTsKKyAgICAgICAgZnVsbEJlYW4uc2V0TWF0cml4UGFyYW0oIm5vdC1lbmNvZGVkL2E/JiYrLi8/Iik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBkb1JlcXVlc3QoZnVsbEJlYW4sICJyZXNvdXJjZS9lbmNvZGVkQmVhbiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIEVuY29kZWRCZWFuIGJlYW4gPSBuZXcgRW5jb2RlZEJlYW4oIm5vdC1lbmNvZGVkL2E/JiYrLi8/IiwgImVuY29kZWQlMkZhJTNGJTI2JTI2JTJCLiUyRiUzRiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGJlYW4udG9TdHJpbmcoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlIGRvUmVxdWVzdChGdWxsQmVhbiBiZWFuLCBTdHJpbmcgcGF0aCkgeworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLmFzTWFwKCkucHV0KCJmb3JtIiwgQXJyYXlzLmFzTGlzdChiZWFuLmdldEZvcm1QYXJhbSgpKSk7CisKKyAgICAgICAgcmV0dXJuIHRhcmdldCgpLnBhdGgocGF0aCkucGF0aChiZWFuLmdldFBhdGhQYXJhbSgpKS5tYXRyaXhQYXJhbSgibWF0cml4IiwKKyAgICAgICAgICAgICAgICBiZWFuLmdldE1hdHJpeFBhcmFtKCkpLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwKKyAgICAgICAgICAgICAgICBiZWFuLmdldFF1ZXJ5UGFyYW0oKSkucmVxdWVzdCgpLmhlYWRlcigiaGVhZGVyIiwgYmVhbi5nZXRIZWFkZXJQYXJhbSgpKS5jb29raWUoImNvb2tpZSIsCisgICAgICAgICAgICAgICAgYmVhbi5nZXRDb29raWUoKSkucG9zdChFbnRpdHkuZW50aXR5KGZvcm0sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSkpOworICAgIH0KKworICAgIHByaXZhdGUgRnVsbEJlYW4gZ2V0RnVsbEJlYW4oKSB7CisgICAgICAgIEZ1bGxCZWFuIGJlYW4gPSBuZXcgRnVsbEJlYW4oKTsKKyAgICAgICAgYmVhbi5zZXRQYXRoUGFyYW0oInBhdGhQYXJhbWV0ZXIiKTsKKyAgICAgICAgYmVhbi5zZXRNYXRyaXhQYXJhbSgibWF0cml4UGFyYW1ldGVyIik7CisgICAgICAgIGJlYW4uc2V0UXVlcnlQYXJhbSgicXVlcnlQYXJhbWV0ZXIiKTsKKyAgICAgICAgYmVhbi5zZXRIZWFkZXJQYXJhbSgiaGVhZGVyUGFyYW1ldGVyIik7CisgICAgICAgIGJlYW4uc2V0Q29va2llKCJjb29raWVQYXJhbWV0ZXIiKTsKKyAgICAgICAgYmVhbi5zZXRGb3JtUGFyYW0oImZvcm1QYXJhbWV0ZXIiKTsKKyAgICAgICAgYmVhbi5zZXRPdmVycmlkZVJlcXVlc3ROdWxsKHRydWUpOworICAgICAgICByZXR1cm4gYmVhbjsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzaW5nbGVCZWFuL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEJlYW5QYXJhbShAQmVhblBhcmFtIEZ1bGxCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiBiZWFuID09IG51bGwgPyAiZmFpbDogYmVhbiBwYXJhbSBpcyBudWxsISEhIiA6IGJlYW4udG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjb25zdHJ1Y3RvckJlYW4ve3BhdGh9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBjb25zdHJ1Y3RvckJlYW5QYXJhbShAQmVhblBhcmFtIENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiBiZWFuID09IG51bGwgPyAiZmFpbDogYmVhbiBwYXJhbSBpcyBudWxsISEhIiA6IGJlYW4udG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjb21wYXJlQmVhbi97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBhcmVCZWFuUGFyYW0oQEJlYW5QYXJhbSBDb25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbiBiZWFuLCBAQ29va2llUGFyYW0oImNvb2tpZSIpIFN0cmluZyBjb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJmb3JtIikgU3RyaW5nIGZvcm1QYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgU3RyaW5nIGhlYWRlclBhcmFtLCBATWF0cml4UGFyYW0oIm1hdHJpeCIpIFN0cmluZyBtYXRyaXhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeVBhcmFtLCBAUGF0aFBhcmFtKCJwYXRoIikgU3RyaW5nIHBhdGhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4gbmV3QmVhbiA9IG5ldyBDb25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbihjb29raWUsIGZvcm1QYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyYW0sIG1hdHJpeFBhcmFtLAorICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtLCBwYXRoUGFyYW0sIHJlcXVlc3QpOworCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoYmVhbi50b1N0cmluZygpLmVxdWFscyhuZXdCZWFuLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ0d29CZWFucy97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RUd29TYW1lQmVhbnMoQEJlYW5QYXJhbSBGdWxsQmVhbiBiZWFuMSwgQEJlYW5QYXJhbSBGdWxsQmVhbiBiZWFuMikgeworICAgICAgICAgICAgaWYgKGJlYW4xID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZhaWw6IGJlYW4xIHBhcmFtIGlzIG51bGwhISEiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJlYW4yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZhaWw6IGJlYW4yIHBhcmFtIGlzIG51bGwhISEiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJlYW4xLnRvU3RyaW5nKCkgKyAiIC8gIiArIGJlYW4yLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiZGlmZmVyZW50QmVhbnMve3BhdGh9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0VHdvRGlmZmVyZW50QmVhbnMoQEJlYW5QYXJhbSBGdWxsQmVhbiBiZWFuMSwgQEJlYW5QYXJhbSBTbWFsbEJlYW4gYmVhbjIpIHsKKyAgICAgICAgICAgIGlmIChiZWFuMSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJmYWlsOiBiZWFuMSBwYXJhbSBpcyBudWxsISEhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiZWFuMiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJmYWlsOiBiZWFuMiBwYXJhbSBpcyBudWxsISEhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiZWFuMS50b1N0cmluZygpICsgIiAvICIgKyBiZWFuMi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImVuY29kZWRCZWFuL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEVuY29kZWRQYXJhbShAQmVhblBhcmFtIEVuY29kZWRCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiBiZWFuID09IG51bGwgPyAiZmFpbDogYmVhbiBwYXJhbSBpcyBudWxsISEhIiA6IGJlYW4udG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTbWFsbEJlYW4geworCisgICAgICAgIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyUGFyYW07CisKKyAgICAgICAgQFBhdGhQYXJhbSgicGF0aCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGhQYXJhbTsKKworICAgICAgICBwdWJsaWMgU21hbGxCZWFuKEZ1bGxCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIGhlYWRlclBhcmFtID0gYmVhbi5nZXRIZWFkZXJQYXJhbSgpOworICAgICAgICAgICAgcGF0aFBhcmFtID0gYmVhbi5nZXRQYXRoUGFyYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTbWFsbEJlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiU21hbGxCZWFueyIKKyAgICAgICAgICAgICAgICAgICAgKyAiaGVhZGVyUGFyYW09JyIgKyBoZWFkZXJQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBwYXRoUGFyYW09JyIgKyBwYXRoUGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbmNvZGVkQmVhbiB7CisKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBtYXRyaXhQYXJhbTsKKworICAgICAgICBARW5jb2RlZAorICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBxdWVyeVBhcmFtOworCisgICAgICAgIHB1YmxpYyBFbmNvZGVkQmVhbihTdHJpbmcgbWF0cml4UGFyYW0sIFN0cmluZyBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVuY29kZWRCZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkVuY29kZWRCZWFueyIKKyAgICAgICAgICAgICAgICAgICAgKyAibWF0cml4UGFyYW09JyIgKyBtYXRyaXhQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBxdWVyeVBhcmFtPSciICsgcXVlcnlQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZ1bGxCZWFuIHsKKworICAgICAgICBASGVhZGVyUGFyYW0oImhlYWRlciIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlclBhcmFtOworCisgICAgICAgIEBQYXRoUGFyYW0oInBhdGgiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoUGFyYW07CisKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBtYXRyaXhQYXJhbTsKKworICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBxdWVyeVBhcmFtOworCisgICAgICAgIEBDb29raWVQYXJhbSgiY29va2llIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29va2llOworCisgICAgICAgIEBGb3JtUGFyYW0oImZvcm0iKQorICAgICAgICBwcml2YXRlIFN0cmluZyBmb3JtUGFyYW07CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRlUmVxdWVzdE51bGw7CisKKyAgICAgICAgcHVibGljIEZ1bGxCZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb29raWUoKSB7CisgICAgICAgICAgICByZXR1cm4gY29va2llOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29va2llKFN0cmluZyBjb29raWUpIHsKKyAgICAgICAgICAgIHRoaXMuY29va2llID0gY29va2llOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gZm9ybVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9ybVBhcmFtKFN0cmluZyBmb3JtUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMuZm9ybVBhcmFtID0gZm9ybVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXJQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlclBhcmFtKFN0cmluZyBoZWFkZXJQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5oZWFkZXJQYXJhbSA9IGhlYWRlclBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYXRyaXhQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRyaXhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeFBhcmFtKFN0cmluZyBtYXRyaXhQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5tYXRyaXhQYXJhbSA9IG1hdHJpeFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGF0aFBhcmFtKFN0cmluZyBwYXRoUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMucGF0aFBhcmFtID0gcGF0aFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeVBhcmFtKFN0cmluZyBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlcXVlc3QgZ2V0UmVxdWVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRlUmVxdWVzdE51bGwoKSB7CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVSZXF1ZXN0TnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlUmVxdWVzdE51bGwoYm9vbGVhbiBvdmVycmlkZVJlcXVlc3ROdWxsKSB7CisgICAgICAgICAgICB0aGlzLm92ZXJyaWRlUmVxdWVzdE51bGwgPSBvdmVycmlkZVJlcXVlc3ROdWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdFRvU3RyaW5nKCkgeworICAgICAgICAgICAgaWYgKG92ZXJyaWRlUmVxdWVzdE51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5vdC1udWxsIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QgPT0gbnVsbCA/ICJudWxsIiA6ICJub3QtbnVsbCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQmVhbnsiCisgICAgICAgICAgICAgICAgICAgICsgImNvb2tpZT0nIiArIGNvb2tpZSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBmb3JtUGFyYW09JyIgKyBmb3JtUGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgaGVhZGVyUGFyYW09JyIgKyBoZWFkZXJQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtYXRyaXhQYXJhbT0nIiArIG1hdHJpeFBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIHBhdGhQYXJhbT0nIiArIHBhdGhQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBxdWVyeVBhcmFtPSciICsgcXVlcnlQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCByZXF1ZXN0PSciICsgcmVxdWVzdFRvU3RyaW5nKCkgKyAiJyIKKyAgICAgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFBhcmFtOworICAgICAgICBwcml2YXRlIFN0cmluZyBtYXRyaXhQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29va2llOworICAgICAgICBwcml2YXRlIFN0cmluZyBmb3JtUGFyYW07CisgICAgICAgIHByaXZhdGUgUmVxdWVzdCByZXF1ZXN0OworCisgICAgICAgIHB1YmxpYyBDb25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbihAQ29va2llUGFyYW0oImNvb2tpZSIpIFN0cmluZyBjb29raWUsIEBGb3JtUGFyYW0oImZvcm0iKSBTdHJpbmcgZm9ybVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBTdHJpbmcgaGVhZGVyUGFyYW0sIEBNYXRyaXhQYXJhbSgibWF0cml4IikgU3RyaW5nIG1hdHJpeFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5UGFyYW0sIEBQYXRoUGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICB0aGlzLmNvb2tpZSA9IGNvb2tpZTsKKyAgICAgICAgICAgIHRoaXMuZm9ybVBhcmFtID0gZm9ybVBhcmFtOworICAgICAgICAgICAgdGhpcy5oZWFkZXJQYXJhbSA9IGhlYWRlclBhcmFtOworICAgICAgICAgICAgdGhpcy5tYXRyaXhQYXJhbSA9IG1hdHJpeFBhcmFtOworICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICAgICAgICAgIHRoaXMucGF0aFBhcmFtID0gcGF0aFBhcmFtOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZVJlcXVlc3ROdWxsOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29va2llKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvb2tpZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZShTdHJpbmcgY29va2llKSB7CisgICAgICAgICAgICB0aGlzLmNvb2tpZSA9IGNvb2tpZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIGZvcm1QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvcm1QYXJhbShTdHJpbmcgZm9ybVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLmZvcm1QYXJhbSA9IGZvcm1QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJQYXJhbShTdHJpbmcgaGVhZGVyUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyUGFyYW0gPSBoZWFkZXJQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF0cml4UGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0cml4UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNYXRyaXhQYXJhbShTdHJpbmcgbWF0cml4UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMubWF0cml4UGFyYW0gPSBtYXRyaXhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGhQYXJhbShTdHJpbmcgcGF0aFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLnBhdGhQYXJhbSA9IHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UXVlcnlQYXJhbShTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPdmVycmlkZVJlcXVlc3ROdWxsKCkgeworICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlUmVxdWVzdE51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZVJlcXVlc3ROdWxsKGJvb2xlYW4gb3ZlcnJpZGVSZXF1ZXN0TnVsbCkgeworICAgICAgICAgICAgdGhpcy5vdmVycmlkZVJlcXVlc3ROdWxsID0gb3ZlcnJpZGVSZXF1ZXN0TnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlcXVlc3RUb1N0cmluZygpIHsKKyAgICAgICAgICAgIGlmIChvdmVycmlkZVJlcXVlc3ROdWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJub3QtbnVsbCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0ID09IG51bGwgPyAibnVsbCIgOiAibm90LW51bGwiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkJlYW57IgorICAgICAgICAgICAgICAgICAgICArICJjb29raWU9JyIgKyBjb29raWUgKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgZm9ybVBhcmFtPSciICsgZm9ybVBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIGhlYWRlclBhcmFtPSciICsgaGVhZGVyUGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgbWF0cml4UGFyYW09JyIgKyBtYXRyaXhQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBwYXRoUGFyYW09JyIgKyBwYXRoUGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgcXVlcnlQYXJhbT0nIiArIHF1ZXJ5UGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdD0nIiArIHJlcXVlc3RUb1N0cmluZygpICsgIiciCisgICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlLXNldHRlciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUluaXRpYWxpemVkQnlTZXR0ZXIgeworCisgICAgICAgIHByaXZhdGUgRnVsbEJlYW4gZnVsbEJlYW47CisKKyAgICAgICAgQEJlYW5QYXJhbQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRGdWxsQmVhbihGdWxsQmVhbiBmdWxsQmVhbikgeworICAgICAgICAgICAgdGhpcy5mdWxsQmVhbiA9IGZ1bGxCZWFuOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIntwYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmdWxsQmVhbi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VJbml0aWFsaXplZEJ5U2V0dGVyKCkgeworICAgICAgICBGdWxsQmVhbiBiZWFuID0gZ2V0RnVsbEJlYW4oKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBkb1JlcXVlc3QoYmVhbiwgInJlc291cmNlLXNldHRlciIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGJlYW4udG9TdHJpbmcoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0Jyb2FkY2FzdGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQnJvYWRjYXN0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5NjdjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0Jyb2FkY2FzdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Ccm9hZGNhc3Rlckxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBCcm9hZGNhc3RlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBzdGF0aWMgQnJvYWRjYXN0ZXI8U3RyaW5nPiBicm9hZGNhc3RlciA9IG5ldyBCcm9hZGNhc3RlcjxTdHJpbmc+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZShDaHVua2VkT3V0cHV0PFN0cmluZz4gc3RyaW5nQ2h1bmtlZE91dHB1dCkgeworICAgICAgICAgICAgY2xvc2VkT3V0cHV0cy5hZGQoc3RyaW5nQ2h1bmtlZE91dHB1dCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RhdGljIExpc3Q8Q2h1bmtlZE91dHB1dDxTdHJpbmc+PiBvdXRwdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgc3RhdGljIExpc3Q8Q2h1bmtlZE91dHB1dDxTdHJpbmc+PiBjbG9zZWRPdXRwdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgc3RhdGljIGludCBsaXN0ZW5lckNsb3NlZCA9IDA7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIENodW5rZWRPdXRwdXQ8U3RyaW5nPiBnZXQoKSB7CisgICAgICAgICAgICBDaHVua2VkT3V0cHV0PFN0cmluZz4gcmVzdWx0ID0gbmV3IENodW5rZWRPdXRwdXQ8U3RyaW5nPigpIHt9OworCisgICAgICAgICAgICAvLyB3cml0ZSBzb21ldGhpbmcgdG8gZW5zdXJlIHRoZSBjbGllbnQgZG9lcyBub3QgZ2V0IGJsb2NrZWQgb24gd2FpdGluZyBmb3IgdGhlIGZpcnN0IGJ5dGUKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LndyaXRlKCJmaXJzdENodW5rIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0cHV0cy5hZGQocmVzdWx0KTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmFkZChyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KHRleHQpOworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJyb2FkY2FzdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMxID0gZ2V0Q2h1bmtTdHJlYW0oKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMyID0gZ2V0Q2h1bmtTdHJlYW0oKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMzID0gZ2V0Q2h1bmtTdHJlYW0oKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXM0ID0gZ2V0Q2h1bmtTdHJlYW0oKTsKKworICAgICAgICB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgidGV4dDEiKSk7CisgICAgICAgIGNoZWNrQ2xvc2VkKDApOworICAgICAgICBjaGVja1N0cmVhbSgiZmlyc3RDaHVua3RleHQxIiwgaXMxLCBpczIsIGlzMywgaXM0KTsKKworICAgICAgICBvdXRwdXRzLnJlbW92ZSgwKS5jbG9zZSgpOworCisgICAgICAgIHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJ0ZXh0MiIpKTsKKyAgICAgICAgY2hlY2tTdHJlYW0oInRleHQyIiwgaXMyLCBpczMsIGlzNCk7CisgICAgICAgIGNoZWNrQ2xvc2VkKDEpOworCisgICAgICAgIG91dHB1dHMucmVtb3ZlKDApLmNsb3NlKCk7CisKKyAgICAgICAgQnJvYWRjYXN0ZXJMaXN0ZW5lcjxTdHJpbmc+IGJsID0gbmV3IEJyb2FkY2FzdGVyTGlzdGVuZXI8U3RyaW5nPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FeGNlcHRpb24oQ2h1bmtlZE91dHB1dDxTdHJpbmc+IHN0cmluZ0NodW5rZWRSZXNwb25zZSwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2UoQ2h1bmtlZE91dHB1dDxTdHJpbmc+IHN0cmluZ0NodW5rZWRSZXNwb25zZSkgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyQ2xvc2VkKys7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgYnJvYWRjYXN0ZXIuYWRkKGJsKTsKKworICAgICAgICB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgidGV4dDMiKSk7CisgICAgICAgIGNoZWNrQ2xvc2VkKDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdGVuZXJDbG9zZWQpOworCisgICAgICAgIGJyb2FkY2FzdGVyLnJlbW92ZShibCk7CisgICAgICAgIGJyb2FkY2FzdGVyLmNsb3NlQWxsKCk7CisKKyAgICAgICAgY2hlY2tDbG9zZWQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBsaXN0ZW5lckNsb3NlZCk7CisKKyAgICAgICAgY2hlY2tTdHJlYW0oInRleHQzIiwgaXMzLCBpczQpOworICAgIH0KKworICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0Q2h1bmtTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTdHJlYW0oU3RyaW5nIGdvbGRlbiwgSW5wdXRTdHJlYW0uLi4gaW5wdXRTdHJlYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBnb2xkZW4uZ2V0Qnl0ZXMoKTsKKyAgICAgICAgYnl0ZVtdIGVudGl0eSA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aF07CisgICAgICAgIGZvciAoSW5wdXRTdHJlYW0gaXMgOiBpbnB1dFN0cmVhbXMpIHsKKyAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSAwOworICAgICAgICAgICAgaW50IHByZXZpb3VzID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkICs9IGlzLnJlYWQoZW50aXR5LCBieXRlc1JlYWQsIGVudGl0eS5sZW5ndGggLSBieXRlc1JlYWQpKSA8IGVudGl0eS5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgJiYgcHJldmlvdXMgIT0gYnl0ZXNSZWFkKSB7CisgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBieXRlc1JlYWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ29sZGVuLCBuZXcgU3RyaW5nKGVudGl0eSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VkKGludCBjb3VudCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsb3NlZCBjb3VudCBkb2VzIG5vdCBtYXRjaCIsIGNvdW50LCBjbG9zZWRPdXRwdXRzLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ2h1bmtlZElucHV0T3V0cHV0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ2h1bmtlZElucHV0T3V0cHV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YWVjMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DaHVua2VkSW5wdXRPdXRwdXRUZXN0LmphdmEKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNodW5rZWRJbnB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW5PckVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQ2h1bmtlZCBpbnB1dC9vdXRwdXQgdGVzdHMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDaHVua2VkSW5wdXRPdXRwdXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ2h1bmtlZElucHV0T3V0cHV0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogVGVzdCByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBjaHVuayBzdHJlYW0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gY2h1bmsgc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IGdldCgpIHsKKyAgICAgICAgICAgIGZpbmFsIENodW5rZWRPdXRwdXQ8U3RyaW5nPiBvdXRwdXQgPSBuZXcgQ2h1bmtlZE91dHB1dDw+KFN0cmluZy5jbGFzcywgIlxyXG4iKTsKKworICAgICAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoInRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZSgidGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiRXJyb3Igd3JpdGluZyBjaHVuay4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiRXJyb3IgY2xvc2luZyBjaHVua2VkIG91dHB1dC4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0uc3RhcnQoKTsKKworICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgY2h1bmsgc3RyZWFtIHdpdGggYW4gYXR0YWNoZWQgaW50ZXJjZXB0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gaW50ZXJjZXB0ZWQgY2h1bmsgc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiaW50ZXJjZXB0ZWQiKQorICAgICAgICBASW50ZXJjZXB0ZWQKKyAgICAgICAgcHVibGljIENodW5rZWRPdXRwdXQ8U3RyaW5nPiBpbnRlcmNlcHRlZEdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaW50ZXJjZXB0b3IgYmluZGluZy4KKyAgICAgKi8KKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEludGVyY2VwdGVkIHsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaW50ZXJjZXB0b3IgLSBjb3VudHMgbnVtYmVyIG9mIGludGVyY2VwdGlvbiBhcyB3ZWxsIGFzIG51bWJlciBvZiB3cmFwcGVyIG91dHB1dCBzdHJlYW0gbWV0aG9kIGNhbGxzLgorICAgICAqLworICAgIEBJbnRlcmNlcHRlZAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgaW50ZXJjZXB0Q291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHdyaXRlQ291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIGZsdXNoQ291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIGNsb3NlQ291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludGVyY2VwdENvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0ID0gY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKG5ldyBPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlQ291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICB3cml0ZUNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlQ291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzLCBUZXN0V3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmV0cmlldmluZyBjaHVua2VkIHJlc3BvbnNlIHN0cmVhbSBhcyBhIHNpbmdsZSByZXNwb25zZSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIHRlc3QgZXhlY3V0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENodW5rZWRPdXRwdXRUb1NpbmdsZVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB2YWx1ZSBvZiBjaHVua2VkIHJlc3BvbnNlIHVubWFyc2hhbGxlZCBhcyBhIHNpbmdsZSBzdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAidGVzdFxyXG50ZXN0XHJcbnRlc3RcclxuIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmV0cmlldmluZyBjaHVua2VkIHJlc3BvbnNlIHN0cmVhbSBzZXF1ZW50aWFsbHkgYXMgaW5kaXZpZHVhbCBjaHVua3MgdXNpbmcgY2h1bmtlZCBpbnB1dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZE91dHB1dFRvQ2h1bmtJbnB1dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua2VkSW5wdXQ8U3RyaW5nPiBpbnB1dCA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxDaHVua2VkSW5wdXQ8U3RyaW5nPj4oKSB7CisgICAgICAgIH0pOworCisgICAgICAgIGludCBjb3VudGVyID0gMDsKKyAgICAgICAgU3RyaW5nIGNodW5rOworICAgICAgICB3aGlsZSAoKGNodW5rID0gaW5wdXQucmVhZCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdmFsdWUgb2YgY2h1bmsgIiArIGNvdW50ZXIsICJ0ZXN0IiwgY2h1bmspOworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlZCBvZiByZWNlaXZlZCBjaHVua3MuIiwgMywgY291bnRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZXRyaWV2aW5nIGludGVyY2VwdGVkIGNodW5rZWQgcmVzcG9uc2Ugc3RyZWFtIHNlcXVlbnRpYWxseSBhcyBpbmRpdmlkdWFsIGNodW5rcyB1c2luZyBjaHVua2VkIGlucHV0LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSB0ZXN0IGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcmNlcHRlZENodW5rZWRPdXRwdXRUb0NodW5rSW5wdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtlZElucHV0PFN0cmluZz4gaW5wdXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2ludGVyY2VwdGVkIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChuZXcgR2VuZXJpY1R5cGU8Q2h1bmtlZElucHV0PFN0cmluZz4+KCkgeworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGludCBjb3VudGVyID0gMDsKKyAgICAgICAgU3RyaW5nIGNodW5rOworICAgICAgICB3aGlsZSAoKGNodW5rID0gaW5wdXQucmVhZCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdmFsdWUgb2YgY2h1bmsgIiArIGNvdW50ZXIsICJ0ZXN0IiwgY2h1bmspOworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBudW1iZWQgb2YgcmVjZWl2ZWQgY2h1bmtzLiIsCisgICAgICAgICAgICAgICAgY291bnRlciwgZXF1YWxUbygzKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBudW1iZXIgb2YgY2h1bmtlZCBvdXRwdXQgaW50ZXJjZXB0aW9ucy4iLAorICAgICAgICAgICAgICAgIFRlc3RXcml0ZXJJbnRlcmNlcHRvci5pbnRlcmNlcHRDb3VudGVyLmdldCgpLCBlcXVhbFRvKDEpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBudW1iZXIgb2YgaW50ZXJjZXB0ZWQgb3V0cHV0IHdyaXRlIGNhbGxzLiIsCisgICAgICAgICAgICAgICAgVGVzdFdyaXRlckludGVyY2VwdG9yLndyaXRlQ291bnRlci5nZXQoKSwgZ3JlYXRlclRoYW5PckVxdWFsVG8oMSkpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIG51bWJlciBvZiBpbnRlcmNlcHRlZCBvdXRwdXQgZmx1c2ggY2FsbHMuIiwKKyAgICAgICAgICAgICAgICBUZXN0V3JpdGVySW50ZXJjZXB0b3IuZmx1c2hDb3VudGVyLmdldCgpLCBncmVhdGVyVGhhbk9yRXF1YWxUbygzKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGludGVyY2VwdGVkIG91dHB1dCBjbG9zZSBjYWxscy4iLAorICAgICAgICAgICAgICAgIFRlc3RXcml0ZXJJbnRlcmNlcHRvci5jbG9zZUNvdW50ZXIuZ2V0KCksIGVxdWFsVG8oMSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NsaWVudFJlc3BvbnNlT25TZXJ2ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DbGllbnRSZXNwb25zZU9uU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDI4NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DbGllbnRSZXNwb25zZU9uU2VydmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVXJpOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGZvciBzdXBwb3J0IG9mIGNsaWVudC1zaWRlIHJlc3BvbnNlIGluIHRoZSBzZXJ2ZXItc2lkZSByZXNvdXJjZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50UmVzcG9uc2VPblNlcnZlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJyb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvb3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0UmVzcG9uc2UoQFVyaSgiaW50ZXJuYWwvcmVzcG9uc2UiKSBXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgICAgICAvLyByZXR1cm5zIGNsaWVudC1zaWRlIHJlc3BvbnNlIGluc3RhbmNlCisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQYXRoKCJlcnJvciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoQFVyaSgiaW50ZXJuYWwvZXJyb3IiKSBXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgICAgICAvLyB0aHJvd3MgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gd2l0aCBhbiBlcnJvciByZXNwb25zZQorICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJpbnRlcm5hbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQYXRoKCJyZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gInJlc3BvbnNlIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBAUGF0aCgiZXJyb3IiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0RXJyb3IoKSB7CisgICAgICAgICAgICAvLyBUZXN0aW5nIGZvciBhIGNyb3NzLXN0YWNrIHN1cHBvcnQgb2YgYSBjb21wbGV0ZWx5IGN1c3RvbSBzdGF0dXMgY29kZS4KKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNjk5KS50eXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOKS5lbnRpdHkoImVycm9yIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEludGVybmFsUmVzb3VyY2UuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRSZXNwb25zZVVzYWdlT25TZXJ2ZXIoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJvb3Qve3R5cGV9Iik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVzb2x2ZVRlbXBsYXRlKCJ0eXBlIiwgInJlc3BvbnNlIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXNwb25zZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVzb2x2ZVRlbXBsYXRlKCJ0eXBlIiwgImVycm9yIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg2OTksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ2xvc2VhYmxlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ2xvc2VhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmYzOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DbG9zZWFibGVUZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2xvc2VhYmxlU2VydmljZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcmMgSGFkbGV5CisgKi8KK3B1YmxpYyBjbGFzcyBDbG9zZWFibGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggcGVyUmVxdWVzdENkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBzaW5nbGV0b25DZGwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBAUGF0aCgicGVyLXJlcXVlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyUmVxdWVzdFJlc291cmNlIGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKyAgICAgICAgc3RhdGljIGJvb2xlYW4gaXNDbG9zZWQ7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgQ2xvc2VhYmxlU2VydmljZSBjczsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoKSB7CisgICAgICAgICAgICBpc0Nsb3NlZCA9IGZhbHNlOworICAgICAgICAgICAgY3MuYWRkKHRoaXMpOworICAgICAgICAgICAgcmV0dXJuICJvayI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICBwZXJSZXF1ZXN0Q2RsLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInNpbmdsZXRvbiIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uUmVzb3VyY2UgZXh0ZW5kcyBQZXJSZXF1ZXN0UmVzb3VyY2UgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBpc0Nsb3NlZCA9IHRydWU7CisgICAgICAgICAgICBzaW5nbGV0b25DZGwuY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFBlclJlcXVlc3RSZXNvdXJjZS5jbGFzcywgU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBlclJlcXVlc3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICB0YXJnZXQoKS5wYXRoKCJwZXItcmVxdWVzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgcGVyUmVxdWVzdENkbC5hd2FpdCgxMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3NlcnRUcnVlKFBlclJlcXVlc3RSZXNvdXJjZS5pc0Nsb3NlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBwZXJSZXF1ZXN0Q2RsLmF3YWl0KDEwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGFzc2VydFRydWUoU2luZ2xldG9uUmVzb3VyY2UuaXNDbG9zZWQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ29tcGxldGlvblN0YWdlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ29tcGxldGlvblN0YWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxY2U3NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Db21wbGV0aW9uU3RhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRpb25TdGFnZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29tcGxldGlvblN0YWdlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiZW50aXR5IjsKKyAgICAvLyBkZWxheSBvZiBhc3luYyBvcGVyYXRpb25zIGluIHNlY29uZHMuCisgICAgc3RhdGljIGZpbmFsIGludCBERUxBWSA9IDE7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENvbXBsZXRpb25TdGFnZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21wbGV0ZWQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjcy9jb21wbGV0ZWQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhFTlRJVFkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGNlcHRpb240MDAoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjcy9leGNlcHRpb240MDAiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9uNDA1KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY3MvZXhjZXB0aW9uNDA1IikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDQwNSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENhbmNlbGxlZCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNzL2NhbmNlbGxlZCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg1MDMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21wbGV0ZWRBc3luYygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNzL2NvbXBsZXRlZEFzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoRU5USVRZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9uNDAwQXN5bmMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjcy9leGNlcHRpb240MDBBc3luYyIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGNlcHRpb240MDVBc3luYygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNzL2V4Y2VwdGlvbjQwNUFzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDQwNSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENhbmNlbGxlZEFzeW5jKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY3MvY2FuY2VsbGVkQXN5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoNTAzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9tQ29tcGxldGVkKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY3MvY3VzdG9tIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoRU5USVRZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9tQXN5bmMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjcy9jdXN0b21Bc3luYyIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKEVOVElUWSkpOworICAgIH0KKworICAgIEBQYXRoKCIvY3MiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGxldGlvblN0YWdlUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBFWEVDVVRPUl9TRVJWSUNFID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvY29tcGxldGVkIikKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxTdHJpbmc+IGdldENvbXBsZXRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBDb21wbGV0YWJsZUZ1dHVyZS5jb21wbGV0ZWRGdXR1cmUoRU5USVRZKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9leGNlcHRpb240MDAiKQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFN0cmluZz4gZ2V0RXhjZXB0aW9uNDAwKCkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8U3RyaW5nPiBjcyA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgICAgICBjcy5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkobmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwMCkpOworCisgICAgICAgICAgICByZXR1cm4gY3M7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvZXhjZXB0aW9uNDA1IikKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxTdHJpbmc+IGdldEV4Y2VwdGlvbjQwNSgpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gY3MgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICAgICAgY3MuY29tcGxldGVFeGNlcHRpb25hbGx5KG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDUpKTsKKworICAgICAgICAgICAgcmV0dXJuIGNzOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL2NhbmNlbGxlZCIpCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiBnZXRDYW5jZWxsZWQoKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGNzID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgICAgIGNzLmNhbmNlbCh0cnVlKTsKKworICAgICAgICAgICAgcmV0dXJuIGNzOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL2NvbXBsZXRlZEFzeW5jIikKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxTdHJpbmc+IGdldENvbXBsZXRlZEFzeW5jKCkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8U3RyaW5nPiBjcyA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgICAgICBkZWxheVN1Ym1pdCgoKSAtPiBjcy5jb21wbGV0ZShFTlRJVFkpKTsKKyAgICAgICAgICAgIHJldHVybiBjczsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9leGNlcHRpb240MDBBc3luYyIpCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiBnZXRFeGNlcHRpb240MDBBc3luYygpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gY3MgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICAgICAgZGVsYXlTdWJtaXQoKCkgLT4gY3MuY29tcGxldGVFeGNlcHRpb25hbGx5KG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDApKSk7CisKKyAgICAgICAgICAgIHJldHVybiBjczsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9leGNlcHRpb240MDVBc3luYyIpCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiBnZXRFeGNlcHRpb240MDVBc3luYygpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gY3MgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICAgICAgZGVsYXlTdWJtaXQoKCkgLT4gY3MuY29tcGxldGVFeGNlcHRpb25hbGx5KG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDUpKSk7CisKKyAgICAgICAgICAgIHJldHVybiBjczsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9jYW5jZWxsZWRBc3luYyIpCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiBnZXRDYW5jZWxsZWRBc3luYygpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gY3MgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICAgICAgZGVsYXlTdWJtaXQoKCkgLT4gY3MuY2FuY2VsKHRydWUpKTsKKworICAgICAgICAgICAgcmV0dXJuIGNzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiBjb21wbGV0ZWQgQ29tcGxldGlvblN0YWdlIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCAjdG9Db21wbGV0YWJsZUZ1dHVyZSgpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIENvbXBsZXRpb25TdGFnZSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgI3RvQ29tcGxldGFibGVGdXR1cmUoKS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9jdXN0b20iKQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFN0cmluZz4gZ2V0Q3VzdG9tQ29tcGxldGlvblN0YWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21Db21wbGV0aW9uU3RhZ2U8PihDb21wbGV0YWJsZUZ1dHVyZS5jb21wbGV0ZWRGdXR1cmUoRU5USVRZKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHVuY29tcGxldGVkIENvbXBsZXRpb25TdGFnZSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgI3RvQ29tcGxldGFibGVGdXR1cmUoKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBDb21wbGV0aW9uU3RhZ2Ugd2hpY2ggZG9lc24ndCBzdXBwb3J0ICN0b0NvbXBsZXRhYmxlRnV0dXJlKCkuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvY3VzdG9tQXN5bmMiKQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFN0cmluZz4gZ2V0Q3VzdG9tQ29tcGxldGlvblN0YWdlQXN5bmMoKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGNmID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgICAgIEN1c3RvbUNvbXBsZXRpb25TdGFnZTxTdHJpbmc+IGNzID0gbmV3IEN1c3RvbUNvbXBsZXRpb25TdGFnZTw+KGNmKTsKKyAgICAgICAgICAgIGRlbGF5U3VibWl0KCgpIC0+IGNmLmNvbXBsZXRlKEVOVElUWSkpOworCisgICAgICAgICAgICByZXR1cm4gY3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZGVsYXlTdWJtaXQoUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgICAgIEVYRUNVVE9SX1NFUlZJQ0Uuc3VibWl0KCgpIC0+IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoREVMQVkgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21Db21wbGV0aW9uU3RhZ2U8VD4gaW1wbGVtZW50cyBDb21wbGV0aW9uU3RhZ2U8VD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29tcGxldGlvblN0YWdlPFQ+IGNvbXBsZXRlZEZ1dHVyZTsKKworICAgICAgICBDdXN0b21Db21wbGV0aW9uU3RhZ2UoQ29tcGxldGlvblN0YWdlPFQ+IGNvbXBsZXRlZEZ1dHVyZSkgeworICAgICAgICAgICAgdGhpcy5jb21wbGV0ZWRGdXR1cmUgPSBjb21wbGV0ZWRGdXR1cmU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8VT4gdGhlbkFwcGx5KEZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFU+IGZuKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5BcHBseShmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8VT4gdGhlbkFwcGx5QXN5bmMoRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgVT4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkFwcGx5QXN5bmMoZm4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IHRoZW5BcHBseUFzeW5jKEZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIFU+IGZuLCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQXBwbHlBc3luYyhmbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gdGhlbkFjY2VwdChDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQWNjZXB0KGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiB0aGVuQWNjZXB0QXN5bmMoQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkFjY2VwdEFzeW5jKGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiB0aGVuQWNjZXB0QXN5bmMoQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5BY2NlcHRBc3luYyhhY3Rpb24sIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IHRoZW5SdW4oUnVubmFibGUgYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5SdW4oYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IHRoZW5SdW5Bc3luYyhSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlblJ1bkFzeW5jKGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiB0aGVuUnVuQXN5bmMoUnVubmFibGUgYWN0aW9uLCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuUnVuQXN5bmMoYWN0aW9uLCBleGVjdXRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVLCBWPiBDb21wbGV0aW9uU3RhZ2U8Vj4gdGhlbkNvbWJpbmUoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBVPiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsID8gc3VwZXIgVSwgPyBleHRlbmRzIFY+IGZuKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5Db21iaW5lKG90aGVyLCBmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVLCBWPiBDb21wbGV0aW9uU3RhZ2U8Vj4gdGhlbkNvbWJpbmVBc3luYyhDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpRnVuY3Rpb248PyBzdXBlciBULCA/IHN1cGVyIFUsID8gZXh0ZW5kcyBWPiBmbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQ29tYmluZUFzeW5jKG90aGVyLCBmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVLCBWPiBDb21wbGV0aW9uU3RhZ2U8Vj4gdGhlbkNvbWJpbmVBc3luYyhDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpRnVuY3Rpb248PyBzdXBlciBULCA/IHN1cGVyIFUsID8gZXh0ZW5kcyBWPiBmbiwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkNvbWJpbmVBc3luYyhvdGhlciwgZm4sIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxWb2lkPiB0aGVuQWNjZXB0Qm90aChDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBVPiBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkFjY2VwdEJvdGgob3RoZXIsIGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gdGhlbkFjY2VwdEJvdGhBc3luYyhDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFU+IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQWNjZXB0Qm90aEFzeW5jKG90aGVyLCBhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFZvaWQ+IHRoZW5BY2NlcHRCb3RoQXN5bmMoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBVPiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBVPiBhY3Rpb24sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5BY2NlcHRCb3RoQXN5bmMob3RoZXIsIGFjdGlvbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gcnVuQWZ0ZXJCb3RoKENvbXBsZXRpb25TdGFnZTw/PiBvdGhlciwgUnVubmFibGUgYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnJ1bkFmdGVyQm90aChvdGhlciwgYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IHJ1bkFmdGVyQm90aEFzeW5jKENvbXBsZXRpb25TdGFnZTw/PiBvdGhlciwgUnVubmFibGUgYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnJ1bkFmdGVyQm90aEFzeW5jKG90aGVyLCBhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gcnVuQWZ0ZXJCb3RoQXN5bmMoQ29tcGxldGlvblN0YWdlPD8+IG90aGVyLCBSdW5uYWJsZSBhY3Rpb24sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnJ1bkFmdGVyQm90aEFzeW5jKG90aGVyLCBhY3Rpb24sIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxVPiBhcHBseVRvRWl0aGVyKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsIEZ1bmN0aW9uPD8gc3VwZXIgVCwgVT4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUuYXBwbHlUb0VpdGhlcihvdGhlciwgZm4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IGFwcGx5VG9FaXRoZXJBc3luYyhDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFQ+IG90aGVyLCBGdW5jdGlvbjw/IHN1cGVyIFQsIFU+IGZuKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLmFwcGx5VG9FaXRoZXJBc3luYyhvdGhlciwgZm4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IGFwcGx5VG9FaXRoZXJBc3luYyhDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFQ+IG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248PyBzdXBlciBULCBVPiBmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLmFwcGx5VG9FaXRoZXJBc3luYyhvdGhlciwgZm4sIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IGFjY2VwdEVpdGhlcihDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFQ+IG90aGVyLCBDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5hY2NlcHRFaXRoZXIob3RoZXIsIGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiBhY2NlcHRFaXRoZXJBc3luYyhDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFQ+IG90aGVyLCBDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5hY2NlcHRFaXRoZXJBc3luYyhvdGhlciwgYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IGFjY2VwdEVpdGhlckFzeW5jKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZXI8PyBzdXBlciBUPiBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUuYWNjZXB0RWl0aGVyQXN5bmMob3RoZXIsIGFjdGlvbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gcnVuQWZ0ZXJFaXRoZXIoQ29tcGxldGlvblN0YWdlPD8+IG90aGVyLCBSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUucnVuQWZ0ZXJFaXRoZXIob3RoZXIsIGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiBydW5BZnRlckVpdGhlckFzeW5jKENvbXBsZXRpb25TdGFnZTw/PiBvdGhlciwgUnVubmFibGUgYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnJ1bkFmdGVyRWl0aGVyQXN5bmMob3RoZXIsIGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiBydW5BZnRlckVpdGhlckFzeW5jKENvbXBsZXRpb25TdGFnZTw/PiBvdGhlciwgUnVubmFibGUgYWN0aW9uLCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5ydW5BZnRlckVpdGhlckFzeW5jKG90aGVyLCBhY3Rpb24sIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxVPiB0aGVuQ29tcG9zZShGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8VT4+IGZuKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5Db21wb3NlKGZuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxVPiB0aGVuQ29tcG9zZUFzeW5jKEZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIENvbXBsZXRpb25TdGFnZTxVPj4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkNvbXBvc2VBc3luYyhmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8VT4gdGhlbkNvbXBvc2VBc3luYyhGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBDb21wbGV0aW9uU3RhZ2U8VT4+IGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5Db21wb3NlQXN5bmMoZm4sIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFQ+IGV4Y2VwdGlvbmFsbHkoRnVuY3Rpb248VGhyb3dhYmxlLCA/IGV4dGVuZHMgVD4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUuZXhjZXB0aW9uYWxseShmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxUPiB3aGVuQ29tcGxldGUoQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVGhyb3dhYmxlPiBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUud2hlbkNvbXBsZXRlKGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxUPiB3aGVuQ29tcGxldGVBc3luYyhCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBUaHJvd2FibGU+IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS53aGVuQ29tcGxldGVBc3luYyhhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8VD4gd2hlbkNvbXBsZXRlQXN5bmMoQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVGhyb3dhYmxlPiBhY3Rpb24sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLndoZW5Db21wbGV0ZUFzeW5jKGFjdGlvbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IGhhbmRsZShCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVT4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUuaGFuZGxlKGZuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxVPiBoYW5kbGVBc3luYyhCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgVGhyb3dhYmxlLCA/IGV4dGVuZHMgVT4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUuaGFuZGxlQXN5bmMoZm4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IGhhbmRsZUFzeW5jKEJpRnVuY3Rpb248PyBzdXBlciBULCBUaHJvd2FibGUsID8gZXh0ZW5kcyBVPiBmbiwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUuaGFuZGxlQXN5bmMoZm4sIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8VD4gdG9Db21wbGV0YWJsZUZ1dHVyZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ29udGFpbmVyTGlzdGVuZXJSZWdpc3RyYXRpb25Bc1Byb3ZpZGVyc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NvbnRhaW5lckxpc3RlbmVyUmVnaXN0cmF0aW9uQXNQcm92aWRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0NmJlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NvbnRhaW5lckxpc3RlbmVyUmVnaXN0cmF0aW9uQXNQcm92aWRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyTGlzdGVuZXJSZWdpc3RyYXRpb25Bc1Byb3ZpZGVyc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIE15TGlzdGVuZXIgbGlzdGVuZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBsaXN0ZW5lciA9IG5ldyBNeUxpc3RlbmVyKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc3VsdCA9IG5ldyBSZXNvdXJjZUNvbmZpZyhPbmUuY2xhc3MsIFlldEFub3RoZXJMaXN0ZW5lci5jbGFzcykucmVnaXN0ZXJJbnN0YW5jZXMobGlzdGVuZXIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBZZXRBbm90aGVyTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgICAgICBzdGF0aWMgYm9vbGVhbiBzdGFydGVkOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTXlMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgICAgIGJvb2xlYW4gc3RhcnR1cEludm9rZWQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cChDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICBzdGFydHVwSW52b2tlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aGF0ZXZlciIsIHRhcmdldCgpLnBhdGgoImRvZXNOb3RNYXR0ZXIiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5zdGFydHVwSW52b2tlZCk7CisgICAgICAgIGFzc2VydFRydWUoWWV0QW5vdGhlckxpc3RlbmVyLnN0YXJ0ZWQpOworICAgIH0KKworICAgIEBQYXRoKCJkb2VzTm90TWF0dGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9uZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIndoYXRldmVyIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NvbnRlbnROZWdvdGlhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NvbnRlbnROZWdvdGlhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzczMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ29udGVudE5lZ290aWF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5pbnRlcm5hbC5IdHRwVXJsQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgZGV0ZXJtaW5pbmcgbWVkaWEgdHlwZSBvZiB0aGUgcmVzcG9uc2UgKGVzcGVjaWFsbHkgdGhhdCBxcyBxdWFsaXR5IHBhcmFtZXRlciBpcyByZXNwZWN0ZWQgd2hlbgorICogbW9yZSBtZWRpYSB0eXBlcyBhcmUgZGVmaW5lZCBvbiB0aGUgcmVzb3VyY2UgbWV0aG9kKS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZW50TmVnb3RpYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgicGVyc29ucyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVyc29uW10gTElTVCA9IG5ldyBQZXJzb25bXSB7CisgICAgICAgICAgICAgICAgbmV3IFBlcnNvbigiUGVubnkiLCAxKSwKKyAgICAgICAgICAgICAgICBuZXcgUGVyc29uKCJIb3dhcmQiLCAyKSwKKyAgICAgICAgICAgICAgICBuZXcgUGVyc29uKCJTaGVsZG9uIiwgMykKKyAgICAgICAgfTsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbDtxcz0wLjc1IiwgImFwcGxpY2F0aW9uL2pzb247cXM9MS4wIn0pCisgICAgICAgIHB1YmxpYyBQZXJzb25bXSBnZXRMaXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIExJU1Q7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL2pzb247cXM9MSIsICJhcHBsaWNhdGlvbi94bWw7cXM9MC43NSJ9KQorICAgICAgICBAUGF0aCgicmVvcmRlcmVkIikKKyAgICAgICAgcHVibGljIFBlcnNvbltdIGdldExpc3RSZW9yZGVyZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gTElTVDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vanNvbjtxcz0wLjc1IiwgImFwcGxpY2F0aW9uL3htbDtxcz0xIn0pCisgICAgICAgIEBQYXRoKCJpbnZlcnRlZCIpCisgICAgICAgIHB1YmxpYyBQZXJzb25bXSBnZXRMaXN0SW52ZXJ0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gTElTVDsKKyAgICAgICAgfQorCisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWw7cXM9MC43NSIsICJhcHBsaWNhdGlvbi9qc29uO3FzPTAuOSIsICJ1bmtub3duL2hlbGxvO3FzPTEuMCJ9KQorICAgICAgICBAUGF0aCgidW5rb3duTVQiKQorICAgICAgICBwdWJsaWMgUGVyc29uW10gZ2V0TGlzdFdpdGhVbmtvd25UeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIExJU1Q7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL2pzb24iLCAiYXBwbGljYXRpb24veG1sIiwgInRleHQvcGxhaW4ifSkKKyAgICAgICAgQFBhdGgoInNob3VsZFBpY2tGaXJzdEpzb24iKQorICAgICAgICBwdWJsaWMgUGVyc29uW10gZ2V0SnNvbkFycmF5VW5sZXNzT3RoZXJ3aXNlU3BlY2lmaWVkKCkgeworICAgICAgICAgICAgcmV0dXJuIExJU1Q7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICAgICAgQFBhdGgoInNob3VsZFBpY2tGaXJzdFhtbCIpCisgICAgICAgIHB1YmxpYyBQZXJzb25bXSBnZXRYbWxVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gTElTVDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uO3FzPTAuNzUiKQorICAgICAgICBAUGF0aCgidHdvTWV0aG9kc09uZUVuZHBvaW50IikKKyAgICAgICAgcHVibGljIFBlcnNvbltdIGdldEpzb25BcnJheSgpIHsKKyAgICAgICAgICAgIHJldHVybiBMSVNUOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbDtxcz0xIikKKyAgICAgICAgQFBhdGgoInR3b01ldGhvZHNPbmVFbmRwb2ludCIpCisgICAgICAgIHB1YmxpYyBQZXJzb25bXSBnZXRYbWwoKSB7CisgICAgICAgICAgICByZXR1cm4gTElTVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYWdlOworCisgICAgICAgIHB1YmxpYyBQZXJzb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBpbnQgYWdlKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy5hZ2UgPSBhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEFnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZ2UoaW50IGFnZSkgeworICAgICAgICAgICAgdGhpcy5hZ2UgPSBhZ2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lICsgIigiICsgYWdlICsgIikiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBIdHRwVXJsQ29ubmVjdG9yfSBieSBkZWZhdWx0IGFkZHMgc29tZSBtZWRpYSB0eXBlcworICAgICAqIHRvIHRoZSBBY2NlcHQgaGVhZGVyIGlmIHdlIGRvbid0IHNwZWNpZnkgdGhlbS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0RGVmaW5lZFJlcXVlc3RlZE1lZGlhVHlwZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoIi9wZXJzb25zIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dERlZmluZWRSZXF1ZXN0ZWRNZWRpYVR5cGVBbmRUd29NZXRob2RzKCkgeworICAgICAgICAvL1dlIGNhbiBub3QgcmVseSBvbiBtZXRob2QgZGVjbGFyYXRpb24gb3JkZXJpbmc6CisgICAgICAgIC8vRnJvbSBDbGFzcyBqYXZhZG9jOiAiVGhlIGVsZW1lbnRzIGluIHRoZSByZXR1cm5lZCBhcnJheSBhcmUgbm90IHNvcnRlZCBhbmQgYXJlIG5vdCBpbiBhbnkgcGFydGljdWxhciBvcmRlci4iCisgICAgICAgIC8vSWYgdGhlcmUgYXJlIHNhbWUgZW5kcG9pbnRzIGl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgcXVhbGl0eSBwYXJhbWV0ZXIgdG8gZW5zdXJlIG9yZGVyaW5nLgorICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIi9wZXJzb25zL3R3b01ldGhvZHNPbmVFbmRwb2ludCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0RGVmaW5lZFJlcXVlc3RlZE1lZGlhVHlwZU9yUXVhbGl0eU1vZGlmaWVyc0pzb24oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiL3BlcnNvbnMvc2hvdWxkUGlja0ZpcnN0SnNvbiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dERlZmluZWRSZXF1ZXN0ZWRNZWRpYVR5cGVPclF1YWxpdHlNb2RpZmllcnNYbWwoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiL3BlcnNvbnMvc2hvdWxkUGlja0ZpcnN0WG1sIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoIi9wZXJzb25zIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLldJTERDQVJEKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52ZXJ0ZWQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCIvcGVyc29ucy9pbnZlcnRlZCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KE1lZGlhVHlwZS5XSUxEQ0FSRCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52ZXJ0ZWRXaXRoSlNPTlByZWZlcnJlZEJ5Q2xpZW50KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiL3BlcnNvbnMvaW52ZXJ0ZWQiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbjtxPTEuMCIsICJhcHBsaWNhdGlvbi94bWw7cT0wLjgiKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVvcmRlcmVkKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiL3BlcnNvbnMvcmVvcmRlcmVkIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLldJTERDQVJEKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xpZW50IGFuZCBzZXJ2ZXIgcHJlZmVycyAidW5rbm93bi9oZWxsbyIgYnV0IHRoZXJlIGlzIG5vIE1CVyBvbiBzZXJ2ZXIgdG8gd3JpdGUgc3VjaCBhIHR5cGUuIFRoZXJlZm9yZQorICAgICAqIHRoaXMgdHlwZSBpcyBpZ25vcmVkIGFuZCAiYXBwbGljYXRpb24veG1sIiBpcyBjaG9zZW4gKGJlY2F1c2UgaXQgaXMgdGhlIHNlY29uZCBwcmVmZXJyZWQgdHlwZSBieSB0aGUgY2xpZW50KS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoVW5rbm93blR5cGVQcmVmZXJyZWRCeUNsaWVudCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoIi9wZXJzb25zL3Jlb3JkZXJlZCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uO3E9MC44IiwgImFwcGxpY2F0aW9uL3htbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgInVua25vd24vaGVsbG87cXM9MS4wIikuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ3VzdG9tSW5qZWN0YWJsZXNBcHBsaWNhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0N1c3RvbUluamVjdGFibGVzQXBwbGljYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0YmZmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0N1c3RvbUluamVjdGFibGVzQXBwbGljYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5IazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkhrMlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5DbGFzc0JpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21JbmplY3RhYmxlc0FwcGxpY2F0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgICAgIGFkZChSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH19OworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIE15QXBwbGljYXRpb24oSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlZ2lzdGVyaW5nIGluamVjdGFibGVzLi4uIik7CisgICAgICAgICAgICBDbGFzc0JpbmRpbmc8TXlJbmplY3RhYmxlUGVyUmVxdWVzdD4gaW5qZWN0Q2xhc3NSZXF1ZXN0ID0KKyAgICAgICAgICAgICAgICAgICAgQmluZGluZ3Muc2VydmljZUFzQ29udHJhY3QoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgIENsYXNzQmluZGluZzxNeUluamVjdGFibGVTaW5nbGV0b24+IGluamVjdENsYXNzU2luZ2xldG9uID0KKyAgICAgICAgICAgICAgICAgICAgQmluZGluZ3Muc2VydmljZUFzQ29udHJhY3QoTXlJbmplY3RhYmxlU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgICAgICBJbnN0YW5jZUJpbmRpbmc8TXlJbmplY3RhYmxlU2luZ2xldG9uPiBpbmplY3RJbnN0YW5jZVNpbmdsZXRvbiA9CisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzLnNlcnZpY2VBc0NvbnRyYWN0KG5ldyBNeUluamVjdGFibGVTaW5nbGV0b24oKSk7CisKKyAgICAgICAgICAgIENsYXNzQmluZGluZzxNeUluamVjdGFibGVQZXJSZXF1ZXN0PiBpbmplY3RRdWFsaWZpZWRDbGFzc1JlcXVlc3QgPQorICAgICAgICAgICAgICAgICAgICBCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChNeUluamVjdGFibGVQZXJSZXF1ZXN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWFsaWZpZWRCeShuZXcgTXlRdWFsaWZpZXJJbXBsKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgIGluamVjdENsYXNzUmVxdWVzdCwgaW5qZWN0Q2xhc3NTaW5nbGV0b24sIGluamVjdEluc3RhbmNlU2luZ2xldG9uLCBpbmplY3RRdWFsaWZpZWRDbGFzc1JlcXVlc3QpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgeworICAgICAgICBwdWJsaWMgaW50IGkgPSAwOworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5qZWN0YWJsZVNpbmdsZXRvbiB7CisgICAgICAgIHB1YmxpYyBpbnQgaSA9IDA7CisgICAgfQorCisgICAgQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQorICAgIEBRdWFsaWZpZXIKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgTXlRdWFsaWZpZXIgeworCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlRdWFsaWZpZXJJbXBsIGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8TXlRdWFsaWZpZXI+IGltcGxlbWVudHMgTXlRdWFsaWZpZXIgeworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBNeUluamVjdGFibGVQZXJSZXF1ZXN0IG15SW5qZWN0YWJsZVBlclJlcXVlc3Q7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBNeUluamVjdGFibGVTaW5nbGV0b24gbXlJbmplY3RhYmxlU2luZ2xldG9uOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQE15UXVhbGlmaWVyCisgICAgICAgIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgbXlJbmplY3RhYmxlUGVyUmVxdWVzdDI7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL3BlcnJlcXVlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFuZEluY1BlclJlcXVlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKCsrbXlJbmplY3RhYmxlUGVyUmVxdWVzdC5pKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL3BlcnJlcXVlc3RDdXN0b21RdWFsaWZpZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFuZEluY1BlclJlcXVlc3QyKCkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZigrK215SW5qZWN0YWJsZVBlclJlcXVlc3QyLmkpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvc2luZ2xldG9uIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbmRJbmNTaW5nbGV0b24oKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXlJbmplY3RhYmxlU2luZ2xldG9uKTsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoKytteUluamVjdGFibGVTaW5nbGV0b24uaSkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgLy8gSWYgc3RyYXRlZ3kgaXMgbm90IElNTUVESUFURSB0aGVuIHRlc3Qgd2lsbCBmYWlsIGV2ZW4gYmVmb3JlIEBCZWZvcmUgc2V0dXAgbWV0aG9kIGludm9jYXRpb24uCisgICAgICAgIC8vIEl0IGhhcyBubyBvdGhlciByZWFzb24gdGhlbiBqdXN0IHJ1biB0aGUgdGVzdHMgaW4gSU1NRURJQVRFIHN0cmF0ZWd5LgorICAgICAgICBpZiAoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKSB7CisgICAgICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQubmV3SW5zdGFuY2UoTXlBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQubmV3SW5zdGFuY2UobmV3IFJlc291cmNlQ29uZmlnKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyUmVxdWVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0IHBlcnJlcXVlc3QgPSB0YXJnZXQoKS5wYXRoKCJwZXJyZXF1ZXN0Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVycmVxdWVzdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJyZXF1ZXN0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBlcnJlcXVlc3QucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldCBwZXJyZXF1ZXN0ID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVycmVxdWVzdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBwZXJyZXF1ZXN0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMyIsIHBlcnJlcXVlc3QucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21RdWFsaWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldCBwZXJyZXF1ZXN0Q3VzdG9tQW5ub3RhdGlvbiA9IHRhcmdldCgpLnBhdGgoInBlcnJlcXVlc3RDdXN0b21RdWFsaWZpZXIiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJyZXF1ZXN0Q3VzdG9tQW5ub3RhdGlvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJyZXF1ZXN0Q3VzdG9tQW5ub3RhdGlvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJyZXF1ZXN0Q3VzdG9tQW5ub3RhdGlvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGxhaW5ISzJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigKKyAgICAgICAgICAgICAgICBuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKEhrMlJlcXVlc3RTY29wZS5jbGFzcykudG8oUmVxdWVzdFNjb3BlLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kQXNDb250cmFjdChNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworCisgICAgICAgIGZpbmFsIFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGUgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFJlcXVlc3RTY29wZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgTXlJbmplY3RhYmxlU2luZ2xldG9uIG15SW5qZWN0YWJsZVNpbmdsZXRvbiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTXlJbmplY3RhYmxlU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15SW5qZWN0YWJsZVNpbmdsZXRvbiwgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpKTsKKworICAgICAgICBmaW5hbCBNeUluamVjdGFibGVQZXJSZXF1ZXN0IG15SW5qZWN0YWJsZVBlclJlcXVlc3QgPSByZXF1ZXN0U2NvcGUucnVuSW5TY29wZShuZXcgQ2FsbGFibGU8TXlJbmplY3RhYmxlUGVyUmVxdWVzdD4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGZpbmFsIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgbXlJbmplY3RhYmxlUGVyUmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG15SW5qZWN0YWJsZVBlclJlcXVlc3QsIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykpOworICAgICAgICAgICAgICAgIHJldHVybiBteUluamVjdGFibGVQZXJSZXF1ZXN0OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXF1ZXN0U2NvcGUucnVuSW5TY29wZShuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdFNhbWUobXlJbmplY3RhYmxlUGVyUmVxdWVzdCwgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNeUluamVjdGFibGVQZXJSZXF1ZXN0LmNsYXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwbGFpbkhLMkR5bmFtaWNUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJpbmRlciBiaW5kZXIgPSBuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kKEhrMlJlcXVlc3RTY29wZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhSZXF1ZXN0U2NvcGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBiaW5kQXNDb250cmFjdChNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoYmluZGVyKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworCisgICAgICAgIGZpbmFsIFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGUgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFJlcXVlc3RTY29wZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgTXlJbmplY3RhYmxlU2luZ2xldG9uIG15SW5qZWN0YWJsZVNpbmdsZXRvbiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTXlJbmplY3RhYmxlU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15SW5qZWN0YWJsZVNpbmdsZXRvbiwgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpKTsKKworICAgICAgICBmaW5hbCBNeUluamVjdGFibGVQZXJSZXF1ZXN0IG15SW5qZWN0YWJsZVBlclJlcXVlc3QgPSByZXF1ZXN0U2NvcGUucnVuSW5TY29wZShuZXcgQ2FsbGFibGU8TXlJbmplY3RhYmxlUGVyUmVxdWVzdD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBNeUluamVjdGFibGVQZXJSZXF1ZXN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNeUluamVjdGFibGVQZXJSZXF1ZXN0IG15SW5qZWN0YWJsZVBlclJlcXVlc3QgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhteUluamVjdGFibGVQZXJSZXF1ZXN0LCBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXlJbmplY3RhYmxlUGVyUmVxdWVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShteUluamVjdGFibGVQZXJSZXF1ZXN0LCBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ3VzdG9tSW5qZWN0YWJsZXNSZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0N1c3RvbUluamVjdGFibGVzUmVzb3VyY2VDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2ZmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0N1c3RvbUluamVjdGFibGVzUmVzb3VyY2VDb25maWdUZXN0LmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21JbmplY3RhYmxlc1Jlc291cmNlQ29uZmlnVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUhLMkJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgLy8gcmVxdWVzdCBzY29wZSBiaW5kaW5nCisgICAgICAgICAgICBiaW5kQXNDb250cmFjdChNeUluamVjdGFibGVQZXJSZXF1ZXN0LmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgLy8gc2luZ2xldG9uIGJpbmRpbmcKKyAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKworICAgICAgICAgICAgLy8gc2luZ2xldG9uIGluc3RhbmNlIGJpbmRpbmcKKyAgICAgICAgICAgIGJpbmQobmV3IE15SW5qZWN0YWJsZVNpbmdsZXRvbigpKS50byhNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgICAgICAvLyByZXF1ZXN0IHNjb3BlIGJpbmRpbmcgd2l0aCBzcGVjaWZpZWQgY3VzdG9tIGFubm90YXRpb24KKyAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpLnF1YWxpZmllZEJ5KG5ldyBNeVF1YWxpZmllckltcGwoKSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgeworICAgICAgICBwdWJsaWMgaW50IGkgPSAwOworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5qZWN0YWJsZVNpbmdsZXRvbiB7CisgICAgICAgIHB1YmxpYyBpbnQgaSA9IDA7CisgICAgfQorCisgICAgQFJldGVudGlvbihqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQorICAgIEBRdWFsaWZpZXIKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgTXlRdWFsaWZpZXIgeworCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlRdWFsaWZpZXJJbXBsIGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8TXlRdWFsaWZpZXI+IGltcGxlbWVudHMgTXlRdWFsaWZpZXIgeworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBNeUluamVjdGFibGVQZXJSZXF1ZXN0IG15SW5qZWN0YWJsZVBlclJlcXVlc3Q7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBNeUluamVjdGFibGVTaW5nbGV0b24gbXlJbmplY3RhYmxlU2luZ2xldG9uOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQE15UXVhbGlmaWVyCisgICAgICAgIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgbXlJbmplY3RhYmxlUGVyUmVxdWVzdDI7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL3BlcnJlcXVlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFuZEluY1BlclJlcXVlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKCsrbXlJbmplY3RhYmxlUGVyUmVxdWVzdC5pKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL3BlcnJlcXVlc3RDdXN0b21RdWFsaWZpZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFuZEluY1BlclJlcXVlc3QyKCkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZigrK215SW5qZWN0YWJsZVBlclJlcXVlc3QyLmkpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvc2luZ2xldG9uIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbmRJbmNTaW5nbGV0b24oKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obXlJbmplY3RhYmxlU2luZ2xldG9uKTsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoKytteUluamVjdGFibGVTaW5nbGV0b24uaSkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJjLnJlZ2lzdGVyQ2xhc3NlcyhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJjLnJlZ2lzdGVyKG5ldyBNeUhLMkJpbmRlcigpKTsKKworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyUmVxdWVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0IHBlclJlcXVlc3QgPSB0YXJnZXQoKS5wYXRoKCJwZXJyZXF1ZXN0Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVyUmVxdWVzdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJSZXF1ZXN0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBlclJlcXVlc3QucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldCBwZXJSZXF1ZXN0ID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVyUmVxdWVzdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBwZXJSZXF1ZXN0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMyIsIHBlclJlcXVlc3QucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQgcGVyUmVxdWVzdEN1c3RvbUFubm90YXRpb24gPSB0YXJnZXQoKS5wYXRoKCJwZXJyZXF1ZXN0Q3VzdG9tUXVhbGlmaWVyIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVyUmVxdWVzdEN1c3RvbUFubm90YXRpb24ucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVyUmVxdWVzdEN1c3RvbUFubm90YXRpb24ucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVyUmVxdWVzdEN1c3RvbUFubm90YXRpb24ucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DdXN0b21NdWx0aXZhbHVlZE1hcFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ3VzdG9tTXVsdGl2YWx1ZWRNYXBQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTA4OGRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ3VzdG9tTXVsdGl2YWx1ZWRNYXBQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoYXQgdGhlIEN1c3RvbSBNdWx0aXZhbHVlZE1hcCBwcm92aWRlciBvdmVycmlkZXMgdGhlIGRlZmF1bHQKKyAqIEVudGl0eVByb3ZpZGVyCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21NdWx0aXZhbHVlZE1hcFByb3ZpZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBUZXN0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQ3VzdG9tTXVsdGl2YWx1ZWRNYXBQcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21NdWx0aXZhbHVlZE1hcFByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8TXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3MgdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gTXVsdGl2YWx1ZWRNYXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwIHJlYWRGcm9tKENsYXNzIHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcCBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwIG1hcCA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXAoKTsKKyAgICAgICAgICAgIG1hcC5hZGQoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLnJlcGxhY2UoIlByb3ZpZGVyIiwgIlJlYWRlciIpKTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtYXAoTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEZvcm1QYXJhbSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgibWFwIiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDdXN0b21NdWx0aXZhbHVlZE1hcFByb3ZpZGVyPUN1c3RvbU11bHRpdmFsdWVkTWFwUmVhZGVyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0VuY29kZWRGb3JtUGFyYW1UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FbmNvZGVkRm9ybVBhcmFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDAzNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FbmNvZGVkRm9ybVBhcmFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBQcm9wZXIgZW5jb2Rpbmcgb2YgRm9ybSBwYXJhbXMKKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEVuY29kZWRGb3JtUGFyYW1UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiZW5jb2RlZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVcmxFbmNvZGVkUmVzb3VyY2UgeworCisgICAgICAgIEBFbmNvZGVkCisgICAgICAgIEBGb3JtUGFyYW0oIm5hbWUiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgICAgIEBGb3JtUGFyYW0oIm5hbWUiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBvdGhlck5hbWU7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBGb3JtUGFyYW0oIm5hbWUiKSBMaXN0PFN0cmluZz4gbmFtZSkgIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lLnRvU3RyaW5nKCkgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVXJsRW5jb2RlZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkUGFyYW0oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IHRhcmdldCgpLnBhdGgoImVuY29kZWQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJuYW1lJm5hbWU9R2VvcmdlIiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiW251bGwsIEdlb3JnZV0gbnVsbCIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRW5jb2RlZFNsYXNoSW5QYXRoU2VnbWVudFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0VuY29kZWRTbGFzaEluUGF0aFNlZ21lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4MjhmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0VuY29kZWRTbGFzaEluUGF0aFNlZ21lbnRUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBmb3IgSkVSU0VZLTExNjcuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVuY29kZWRTbGFzaEluUGF0aFNlZ21lbnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEVuY29kZWRTbGFzaFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3Rlc3Qve3B9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuY29kZWRTbGFzaFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBQYXRoUGFyYW0oInAiKSBTdHJpbmcgcCkgeworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkU2xhc2hJblBhdGhQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9vbmUlMkZ0d28iKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZS90d28iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRW50aXR5RXhwYW5zaW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRW50aXR5RXhwYW5zaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTdkZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FbnRpdHlFeHBhbnNpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuU2F4SGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIFRlc3RzIHByb3BlcnRpZXMgY29uZmlndXJpbmcgc2VjdXJlIHNheCBwYXJzaW5nLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEVudGl0eUV4cGFuc2lvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEVudGl0eUV4cGFuc2lvblRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWGRrID0gZmFsc2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImVudGl0eUV4cGFuc2lvbkxpbWl0IiwgIjEwIik7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZWxlbWVudEF0dHJpYnV0ZUxpbWl0IiwgIjEiKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MsIEJhZFJlcXVlc3RNYXBwZXIuY2xhc3MpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYWRSZXF1ZXN0TWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPEJhZFJlcXVlc3RFeGNlcHRpb24+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEJhZFJlcXVlc3RFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV4Y2VwdGlvbjsKKyAgICAgICAgICAgIHdoaWxlICh0ICE9IG51bGwgJiYgdC5nZXRDbGFzcygpICE9IFNBWFBhcnNlRXhjZXB0aW9uLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgdCA9IHQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkoIlBBU1NFRDoiICsgdC5nZXRNZXNzYWdlKCkpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDUwMCkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChUZXN0QmVhbiBiZWFuKSB7CisgICAgICAgICAgICByZXR1cm4gYmVhbi5nZXRJbnB1dCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAWG1sUm9vdEVsZW1lbnQoKQorICAgIEBYbWxBY2Nlc3NvclR5cGUodmFsdWUgPSBYbWxBY2Nlc3NUeXBlLkZJRUxEKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEJlYW4geworICAgICAgICBAWG1sRWxlbWVudAorICAgICAgICBwcml2YXRlIFN0cmluZyBpbnB1dDsKKworICAgICAgICBAWG1sQXR0cmlidXRlCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHN0cjsKKworICAgICAgICBAWG1sQXR0cmlidXRlCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHN0cjI7CisKKyAgICAgICAgQFhtbEF0dHJpYnV0ZQorICAgICAgICBwcml2YXRlIFN0cmluZyBzdHIzOworCisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHIyKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0cjI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHIyKFN0cmluZyBzdHIyKSB7CisgICAgICAgICAgICB0aGlzLnN0cjIgPSBzdHIyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHIoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3RyKFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyID0gc3RyOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cjMoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyMzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0cjMoU3RyaW5nIHN0cjMpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyMyA9IHN0cjM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElucHV0KCkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0WGRrRmxhZygpIHsKKyAgICAgICAgLy8gWERLIFNBWFBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgc28gdGhlIHRlc3QgaGFzIHRvIGJlIHNraXBwZWQgaWYgWERLIGRldGVjdGVkLgorICAgICAgICBpZiAoU2F4SGVscGVyLmlzWGRrUGFyc2VyRmFjdG9yeShTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkpKSB7CisgICAgICAgICAgICBMT0cud2FybmluZygiWERLIFNBWFBhcnNlciBkZXRlY3RlZCwgRkVBVFVSRV9TRUNVUkVfUFJPQ0VTU0lORyBpcyBub3Qgc3VwcG9ydGVkLiBUZXN0cyB3aWxsIGJlIHNraXBwZWQuIik7CisgICAgICAgICAgICBpc1hkayA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIWlzWGRrKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlFeHBhbnNpb24oKSB7CisgICAgICAgIFN0cmluZyBzdHIgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PiIKKyAgICAgICAgICAgICAgICArICJcbjwhRE9DVFlQRSBsb2x6IFtcbiIKKyAgICAgICAgICAgICAgICArICIgIDwhRU5USVRZIGxvbCBcImxvbGxvbGxvbGxvbGxvbGxvbGxvbFsuLi5dXCI+XG4iCisgICAgICAgICAgICAgICAgKyAiICA8IUVOVElUWSBsb2wyIFwiJmxvbDsmbG9sOyZsb2w7JmxvbDsmbG9sOyZsb2w7JmxvbDsmbG9sOyZsb2w7JmxvbDtcIj5cbiIKKyAgICAgICAgICAgICAgICArICIgIDwhRU5USVRZIGxvbDMgXCImbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjsmbG9sMjtcIj5cbiIKKyAgICAgICAgICAgICAgICArICJdPlxuIgorICAgICAgICAgICAgICAgICsgIjx0ZXN0QmVhbj48aW5wdXQ+JmxvbDM7PC9pbnB1dD48L3Rlc3RCZWFuPiI7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoc3RyLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGVudGl0eS5zdGFydHNXaXRoKCJQQVNTRUQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4QXR0cmlidXRlcygpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+IgorICAgICAgICAgICAgICAgICsgIjx0ZXN0QmVhbiBzdHI9XCJhYWFcIiBzdHIyPVwiYmJiXCIgc3RyMz1cImNjY1wiPjxpbnB1dD50ZXN0PC9pbnB1dD48L3Rlc3RCZWFuPiI7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHN0ciwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShlbnRpdHkuc3RhcnRzV2l0aCgiUEFTU0VEIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTG9nZ2luZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4Y2VwdGlvbkxvZ2dpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzM2FlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4Y2VwdGlvbkxvZ2dpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBNYWtlIHN1cmUgZXhjZXB0aW9ucywgdGhhdCBhcmUgbm90IG1hcHBlZCB0byByZXNwb25zZXMgZ2V0IGxvZ2dlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uTG9nZ2luZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15Q2hlY2tlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7fQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7fQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJydW50aW1lIikKKyAgICAgICAgcHVibGljIFN0cmluZyBydW50aW1lRXhjZXB0aW9uKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE15UnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNoZWNrZWRFeGNlcHRpb24oKSB0aHJvd3MgTXlDaGVja2VkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNeUNoZWNrZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5GSU5FLmludFZhbHVlKCkpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsIFdyaXRlci5jbGFzcywgUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJydW50aW1lIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRMYXN0TG9nZ2VkUmVjb3JkKCkuZ2V0VGhyb3duKCkuZ2V0Q2xhc3MoKSwgTXlSdW50aW1lRXhjZXB0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiY2hlY2tlZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0TGFzdExvZ2dlZFJlY29yZCgpLmdldFRocm93bigpLmdldENsYXNzKCksIE15Q2hlY2tlZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5XSUxEQ0FSRCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEV4Y2VwdGlvbkxvZ2dpbmdUZXN0UE9KTz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEV4Y2VwdGlvbkxvZ2dpbmdUZXN0UE9KTy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKEV4Y2VwdGlvbkxvZ2dpbmdUZXN0UE9KTyBlbnRpdHlGb3JSZWFkZXIsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKEV4Y2VwdGlvbkxvZ2dpbmdUZXN0UE9KTyBlbnRpdHlGb3JSZWFkZXIsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidGVzdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgiZW50aXR5IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgRXhjZXB0aW9uTG9nZ2luZ1Rlc3RQT0pPIGVudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZXB0aW9uTG9nZ2luZ1Rlc3RQT0pPKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJGYWlscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2VudGl0eSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhnZXRMYXN0TG9nZ2VkUmVjb3JkKCkuZ2V0VGhyb3duKCkuZ2V0TWVzc2FnZSgpLCAidGVzdCIpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25Mb2dnaW5nVGVzdFBPSk8geworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTWFwcGVyUHJpb3JpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeGNlcHRpb25NYXBwZXJQcmlvcml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI1MjM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTWFwcGVyUHJpb3JpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuSXMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyUHJpb3JpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEV4Y2VwdGlvbk1hcHBlclByaW9yaXR5UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlGaXJzdEV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeVNlY29uZEV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeVRoaXJkRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByaW9yaXR5VGVzdCgpIHsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UsIGlzKE15U2Vjb25kRXhjZXB0aW9uTWFwcGVyLmNsYXNzLmdldE5hbWUoKSkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlclByaW9yaXR5UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB0aHJvd3MgTXlFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IE15RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSgzMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpcnN0RXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE15RXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKE15RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKE15Rmlyc3RFeGNlcHRpb25NYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByaW9yaXR5KDEwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U2Vjb25kRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE15RXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKE15RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKE15U2Vjb25kRXhjZXB0aW9uTWFwcGVyLmNsYXNzLmdldE5hbWUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSgyMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVRoaXJkRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE15RXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKE15RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKE15VGhpcmRFeGNlcHRpb25NYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTWFwcGVyUHJvcGFnYXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeGNlcHRpb25NYXBwZXJQcm9wYWdhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjlkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTWFwcGVyUHJvcGFnYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGV4Y2VwdGlvbiBtYXBwZXJzIGhhbmRsaW5nIGV4Y2VwdGlvbnMgdGhyb3duIGZyb20gZGlmZmVyZW50IHBhcnQgb2YgY29kZS4KKyAqIDxwLz4KKyAqIFRoZXJlIGFyZSBtb3JlIHRlc3RzIGZvciBleGNlcHRpb24gbWFwcGVycy4gVGhpcyBvbmUgZm9jdXNlcyBvbiB0ZXN0aW5nIHRoYXQgZXhjZXB0aW9ucworICogdGhyb3duIGZyb20gcHJvdmlkZXJzIGFyZSBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byB0aGUgZXhjZXB0aW9uIG1hcHBlci4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlclByb3BhZ2F0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX1RZUEUgPSAiZXhjZXB0aW9uLXR5cGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRCA9ICItbWFwcGVkLSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX1dBRSA9ICItd2FlLSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVIgPSAicHJvdmlkZXIiOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBUZXN0UnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdENoZWNrZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBUZXN0Q2hlY2tlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFdlYkFwcEV4Y2VwdGlvbiBleHRlbmRzIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBwdWJsaWMgVGVzdFdlYkFwcEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBVbml2ZXJzYWxUaHJvd2FibGVNYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdFJlc3BvbnNlRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RSZXF1ZXN0RmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFdlYkFwcE1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0TUJSLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RNQlcuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdFdyaXRlckludGVyY2VwdG9yLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RSZWFkZXJJbnRlcmNlcHRvci5jbGFzcworICAgICAgICApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVW5pdmVyc2FsVGhyb3dhYmxlTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFRocm93YWJsZT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkoZXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgTUFQUEVEICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXZWJBcHBNYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VGVzdFdlYkFwcEV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUZXN0V2ViQXBwRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBleGNlcHRpb24uZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMocmVzcG9uc2UuZ2V0U3RhdHVzKCkpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoZXhjZXB0aW9uLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgTUFQUEVEX1dBRSArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKFN0cmluZyBleGNlcHRpb25UeXBlLCBTdHJpbmcgcHJvdmlkZXIsIENsYXNzPD8+IGN1cnJlbnRDbGFzcykgdGhyb3dzIFRocm93YWJsZSB7CisKKyAgICAgICAgaWYgKHNob3VsZFRocm93KGV4Y2VwdGlvblR5cGUsIHByb3ZpZGVyLCBjdXJyZW50Q2xhc3MpKSB7CisgICAgICAgICAgICBpZiAoZXhjZXB0aW9uVHlwZS5lcXVhbHMoVGVzdENoZWNrZWRFeGNlcHRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0Q2hlY2tlZEV4Y2VwdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvblR5cGUuZXF1YWxzKFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdFJ1bnRpbWVFeGNlcHRpb24ocHJvdmlkZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChleGNlcHRpb25UeXBlLmVxdWFscyhUZXN0V2ViQXBwRXhjZXB0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdFdlYkFwcEV4Y2VwdGlvbihwcm92aWRlciwgUmVzcG9uc2Uub2soKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uVHlwZS5lcXVhbHMoUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24ocHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzaG91bGRUaHJvdyhTdHJpbmcgZXhjZXB0aW9uVHlwZSwgU3RyaW5nIHByb3ZpZGVyLCBDbGFzczw/PiBjdXJyZW50Q2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvblR5cGUgIT0gbnVsbCAmJiBjdXJyZW50Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyhwcm92aWRlcik7CisgICAgfQorCisgICAgQFBhdGgoImV4Y2VwdGlvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25SZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImdlbmVyYWwiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdChASGVhZGVyUGFyYW0oRVhDRVBUSU9OX1RZUEUpIFN0cmluZyBleGNlcHRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oUFJPVklERVIpIFN0cmluZyBwcm92aWRlciwgU3RyaW5nIGVudGl0eSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGNlcHRpb25UeXBlLCBwcm92aWRlciwgdGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eSgiZXhjZXB0aW9uL2dlbmVyYWwjZ2V0IGNhbGxlZCIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoRVhDRVBUSU9OX1RZUEUsIGV4Y2VwdGlvblR5cGUpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoUFJPVklERVIsIHByb3ZpZGVyKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZUxvY2F0b3Igc3ViUmVzb3VyY2VMb2NhdG9yKEBIZWFkZXJQYXJhbShFWENFUFRJT05fVFlQRSkgU3RyaW5nIGV4Y2VwdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbShQUk9WSURFUikgU3RyaW5nIHByb3ZpZGVyKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uKGV4Y2VwdGlvblR5cGUsIHByb3ZpZGVyLCB0aGlzLmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZUxvY2F0b3IoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZUxvY2F0b3IgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChASGVhZGVyUGFyYW0oRVhDRVBUSU9OX1RZUEUpIFN0cmluZyBleGNlcHRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKFBST1ZJREVSKSBTdHJpbmcgcHJvdmlkZXIsIFN0cmluZyBlbnRpdHkpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oZXhjZXB0aW9uVHlwZSwgcHJvdmlkZXIsIHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gInN1Yi1nZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNlcHRpb25UeXBlID0gcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlclN0cmluZyhFWENFUFRJT05fVFlQRSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKFBST1ZJREVSKTsKKworICAgICAgICAgICAgdGhyb3dSdW50aW1lRXhjZXB0aW9uQW5kSU8oZXhjZXB0aW9uVHlwZSwgdGhpcy5nZXRDbGFzcygpLCBwcm92aWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNlcHRpb25UeXBlID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKEVYQ0VQVElPTl9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZyhQUk9WSURFUik7CisKKyAgICAgICAgICAgIHRocm93UnVudGltZUV4Y2VwdGlvbkFuZElPKGV4Y2VwdGlvblR5cGUsIHRoaXMuZ2V0Q2xhc3MoKSwgcHJvdmlkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE1CUiBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFN0cmluZz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZyb20oQ2xhc3M8U3RyaW5nPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IGh0dHBIZWFkZXJzLmdldEZpcnN0KEVYQ0VQVElPTl9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9IGh0dHBIZWFkZXJzLmdldEZpcnN0KFBST1ZJREVSKTsKKyAgICAgICAgICAgIHRocm93UnVudGltZUV4Y2VwdGlvbkFuZElPKGV4Y2VwdGlvblR5cGUsIHRoaXMuZ2V0Q2xhc3MoKSwgcHJvdmlkZXIpOworCisgICAgICAgICAgICBieXRlIGI7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHdoaWxlICgoYiA9IChieXRlKSBlbnRpdHlTdHJlYW0ucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGJhb3Mud3JpdGUoYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKHsidGV4dC9wbGFpbiIsICIqLyoifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNQlcgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShTdHJpbmcgcywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4Y2VwdGlvblR5cGUgPSAoU3RyaW5nKSBodHRwSGVhZGVycy5nZXRGaXJzdChFWENFUFRJT05fVFlQRSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvdmlkZXIgPSAoU3RyaW5nKSBodHRwSGVhZGVycy5nZXRGaXJzdChQUk9WSURFUik7CisgICAgICAgICAgICB0aHJvd1J1bnRpbWVFeGNlcHRpb25BbmRJTyhleGNlcHRpb25UeXBlLCB0aGlzLmdldENsYXNzKCksIHByb3ZpZGVyKTsKKworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0uZmx1c2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZWFkZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IGNvbnRleHQuZ2V0SGVhZGVycygpLmdldEZpcnN0KEVYQ0VQVElPTl9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9IGNvbnRleHQuZ2V0SGVhZGVycygpLmdldEZpcnN0KFBST1ZJREVSKTsKKworICAgICAgICAgICAgdGhyb3dSdW50aW1lRXhjZXB0aW9uQW5kSU8oZXhjZXB0aW9uVHlwZSwgdGhpcy5nZXRDbGFzcygpLCBwcm92aWRlcik7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IChTdHJpbmcpIGNvbnRleHQuZ2V0SGVhZGVycygpLmdldEZpcnN0KEVYQ0VQVElPTl9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9IChTdHJpbmcpIGNvbnRleHQuZ2V0SGVhZGVycygpLmdldEZpcnN0KFBST1ZJREVSKTsKKworICAgICAgICAgICAgdGhyb3dSdW50aW1lRXhjZXB0aW9uQW5kSU8oZXhjZXB0aW9uVHlwZSwgdGhpcy5nZXRDbGFzcygpLCBwcm92aWRlcik7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dSdW50aW1lRXhjZXB0aW9uQW5kSU8oU3RyaW5nIGV4Y2VwdGlvblR5cGUsIENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MsIFN0cmluZyBwcm92aWRlcikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzaG91bGRUaHJvdyhleGNlcHRpb25UeXBlLCBwcm92aWRlciwgcHJvdmlkZXJDbGFzcykpIHsKKyAgICAgICAgICAgIGlmIChleGNlcHRpb25UeXBlLmVxdWFscyhUZXN0UnVudGltZUV4Y2VwdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RSdW50aW1lRXhjZXB0aW9uKHByb3ZpZGVyQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uVHlwZS5lcXVhbHMoSU9FeGNlcHRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihwcm92aWRlckNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvblR5cGUuZXF1YWxzKFRlc3RXZWJBcHBFeGNlcHRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0V2ViQXBwRXhjZXB0aW9uKHByb3ZpZGVyQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBSZXNwb25zZS5vaygpLmJ1aWxkKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChleGNlcHRpb25UeXBlLmVxdWFscyhQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXNvdXJjZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrZWRFeGNlcHRpb25JblJlc291cmNlKCkgeworICAgICAgICBfdGVzdChUZXN0Q2hlY2tlZEV4Y2VwdGlvbi5jbGFzcywgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVFeGNlcHRpb25JblJlc291cmNlKCkgeworICAgICAgICBfdGVzdChUZXN0UnVudGltZUV4Y2VwdGlvbi5jbGFzcywgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uSW5SZXNvdXJjZSgpIHsKKyAgICAgICAgX3Rlc3RXYWUoRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NpbmdFeGNlcHRpb25JblJlc291cmNlKCkgeworICAgICAgICBfdGVzdChQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzLCBFeGNlcHRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgLy8gU3ViIHJlc291cmNlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tlZEV4Y2VwdGlvbkluU3ViUmVzb3VyY2VMb2NhdG9yTWV0aG9kKCkgeworICAgICAgICBfdGVzdChUZXN0Q2hlY2tlZEV4Y2VwdGlvbi5jbGFzcywgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsICJleGNlcHRpb24vc3ViIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkluU3ViUmVzb3VyY2VMb2NhdG9yTWV0aG9kKCkgeworICAgICAgICBfdGVzdChUZXN0UnVudGltZUV4Y2VwdGlvbi5jbGFzcywgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsICJleGNlcHRpb24vc3ViIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FlSW5TdWJSZXNvdXJjZUxvY2F0b3JNZXRob2QoKSB7CisgICAgICAgIF90ZXN0V2FlKEV4Y2VwdGlvblJlc291cmNlLmNsYXNzLCAiZXhjZXB0aW9uL3N1YiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NpbmdFeGNlcHRpb25JblN1YlJlc291cmNlTG9jYXRvck1ldGhvZCgpIHsKKyAgICAgICAgX3Rlc3QoUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcywgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsICJleGNlcHRpb24vc3ViIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tlZEV4Y2VwdGlvbkluU3ViUmVzb3VyY2UoKSB7CisgICAgICAgIF90ZXN0KFRlc3RDaGVja2VkRXhjZXB0aW9uLmNsYXNzLCBTdWJSZXNvdXJjZUxvY2F0b3IuY2xhc3MsICJleGNlcHRpb24vc3ViIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkluU3ViUmVzb3VyY2UoKSB7CisgICAgICAgIF90ZXN0KFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLCBTdWJSZXNvdXJjZUxvY2F0b3IuY2xhc3MsICJleGNlcHRpb24vc3ViIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FlSW5TdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgX3Rlc3RXYWUoU3ViUmVzb3VyY2VMb2NhdG9yLmNsYXNzLCAiZXhjZXB0aW9uL3N1YiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NpbmdFeGNlcHRpb25JblN1YlJlc291cmNlKCkgeworICAgICAgICBfdGVzdChQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzLCBTdWJSZXNvdXJjZUxvY2F0b3IuY2xhc3MsICJleGNlcHRpb24vc3ViIik7CisgICAgfQorCisgICAgLy8gcmVzcG9uc2UgZmlsdGVycworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVFeGNlcHRpb25JblJlc3BvbnNlRmlsdGVyKCkgeworICAgICAgICBfdGVzdChUZXN0UnVudGltZUV4Y2VwdGlvbi5jbGFzcywgVGVzdFJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJT0V4Y2VwdGlvbkluUmVzcG9uc2VGaWx0ZXIoKSB7CisgICAgICAgIF90ZXN0KElPRXhjZXB0aW9uLmNsYXNzLCBUZXN0UmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhZUluUmVzcG9uc2VGaWx0ZXIoKSB7CisgICAgICAgIF90ZXN0V2FlKFRlc3RSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc2luZ0V4Y2VwdGlvbkluUmVzcG9uc2VGaWx0ZXIoKSB7CisgICAgICAgIF90ZXN0KFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MsIFRlc3RSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgLy8gcmVzcG9uc2UgZmlsdGVycworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVFeGNlcHRpb25JblJlcXVlc3RGaWx0ZXIoKSB7CisgICAgICAgIF90ZXN0KFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLCBUZXN0UmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SU9FeGNlcHRpb25JblJlcXVlc3RGaWx0ZXIoKSB7CisgICAgICAgIF90ZXN0KElPRXhjZXB0aW9uLmNsYXNzLCBUZXN0UmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FlSW5SZXF1ZXN0RmlsdGVyKCkgeworICAgICAgICBfdGVzdFdhZShUZXN0UmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc2luZ0V4Y2VwdGlvbkluUmVxdWVzdEZpbHRlcigpIHsKKyAgICAgICAgX3Rlc3QoUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcywgVGVzdFJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIC8vIE1CUi9XCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkluTUJXKCkgeworICAgICAgICBfdGVzdChUZXN0UnVudGltZUV4Y2VwdGlvbi5jbGFzcywgVGVzdE1CVy5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SU9FeGNlcHRpb25Jbk1CVygpIHsKKyAgICAgICAgX3Rlc3QoSU9FeGNlcHRpb24uY2xhc3MsIFRlc3RNQlcuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhZUluTUJXKCkgeworICAgICAgICBfdGVzdFdhZShUZXN0TUJXLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzaW5nRXhjZXB0aW9uSW5NQlcoKSB7CisgICAgICAgIF90ZXN0KFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MsIFRlc3RNQlcuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVFeGNlcHRpb25Jbk1CUigpIHsKKyAgICAgICAgX3Rlc3QoVGVzdFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MsIFRlc3RNQlIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElPRXhjZXB0aW9uSW5NQlIoKSB7CisgICAgICAgIF90ZXN0KElPRXhjZXB0aW9uLmNsYXNzLCBUZXN0TUJSLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYWVJbk1CUigpIHsKKyAgICAgICAgX3Rlc3RXYWUoVGVzdE1CUi5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc2luZ0V4Y2VwdGlvbkluTUJSKCkgeworICAgICAgICBfdGVzdChQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzLCBUZXN0TUJSLmNsYXNzKTsKKyAgICB9CisKKyAgICAvLyBpbnRlcmNlcHRvcnMKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSW5SZWFkZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgX3Rlc3QoVGVzdFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MsIFRlc3RSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SU9FeGNlcHRpb25JblJlYWRlckludGVyY2VwdG9yKCkgeworICAgICAgICBfdGVzdChJT0V4Y2VwdGlvbi5jbGFzcywgVGVzdFJlYWRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYWVJblJlYWRlckludGVyY2VwdG9yKCkgeworICAgICAgICBfdGVzdFdhZShUZXN0UmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NpbmdFeGNlcHRpb25JblJlYWRlckludGVyY2VwdG9yKCkgeworICAgICAgICBfdGVzdChQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzLCBUZXN0UmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVFeGNlcHRpb25JbldyaXRlckludGVyY2VwdG9yKCkgeworICAgICAgICBfdGVzdChUZXN0UnVudGltZUV4Y2VwdGlvbi5jbGFzcywgVGVzdFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJT0V4Y2VwdGlvbkluV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIF90ZXN0KElPRXhjZXB0aW9uLmNsYXNzLCBUZXN0V3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhZUluV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIF90ZXN0V2FlKFRlc3RXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc2luZ0V4Y2VwdGlvbkluV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIF90ZXN0KFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MsIFRlc3RXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KENsYXNzPD8+IGV4Y2VwdGlvbkNsYXNzLCBDbGFzczw/PiBwcm92aWRlckNsYXNzLCBTdHJpbmcgcGF0aCkgeworICAgICAgICAvLyBOT1RFOiBIdHRwVXJsQ29ubmVjdG9yIHNlbmRzIHNldmVyYWwgYWNjZXB0ZWQgdHlwZXMgYnkgZGVmYXVsdCB3aGVuIG5vdCBleHBsaWNpdGx5IHNldCBieSB0aGUgY2FsbGVyLgorICAgICAgICAvLyBJbiBzdWNoIGNhc2UsIHRoZSAuYWNjZXB0KCJ0ZXh0L2h0bWwiKSBjYWxsIGlzIG5vdCBuZWNlc3NhcnkuIEhvd2V2ZXIsIG90aGVyIGNvbm5lY3RvcnMgYWN0IGluIGEgZGlmZmVyZW50IHdheSBhbmQKKyAgICAgICAgLy8gdGhpcyBsZWFkcyBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHdoZW4gc2VsZWN0aW5nIHRoZSBNZXNzYWdlQm9keVdyaXRlci4gTGVhdmluZyB0aGUgZGVmaW5pdGlvbiBleHBsaWNpdCBmb3IgYnJvYWRlcgorICAgICAgICAvLyBjb21wYXRpYmlsaXR5LgorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKEVYQ0VQVElPTl9UWVBFLCBleGNlcHRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCkpLmhlYWRlcihQUk9WSURFUiwgcHJvdmlkZXJDbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLmFjY2VwdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4Y2VwdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSArIE1BUFBFRCArIHByb3ZpZGVyQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFdhZShDbGFzczw/PiBwcm92aWRlckNsYXNzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gImV4Y2VwdGlvbi9nZW5lcmFsIjsKKyAgICAgICAgX3Rlc3RXYWUocHJvdmlkZXJDbGFzcywgcGF0aCk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RXYWUoQ2xhc3M8Pz4gcHJvdmlkZXJDbGFzcywgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gZXhjZXB0aW9uQ2xhc3MgPSBUZXN0V2ViQXBwRXhjZXB0aW9uLmNsYXNzOworCisgICAgICAgIC8vIE5PVEU6IEh0dHBVcmxDb25uZWN0b3Igc2VuZHMgc2V2ZXJhbCBhY2NlcHRlZCB0eXBlcyBieSBkZWZhdWx0IHdoZW4gbm90IGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSBjYWxsZXIuCisgICAgICAgIC8vIEluIHN1Y2ggY2FzZSwgdGhlIC5hY2NlcHQoInRleHQvaHRtbCIpIGNhbGwgaXMgbm90IG5lY2Vzc2FyeS4gSG93ZXZlciwgb3RoZXIgY29ubmVjdG9ycyBhY3QgaW4gYSBkaWZmZXJlbnQgd2F5IGFuZAorICAgICAgICAvLyB0aGlzIGxlYWRzIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiBzZWxlY3RpbmcgdGhlIE1lc3NhZ2VCb2R5V3JpdGVyLiBMZWF2aW5nIHRoZSBkZWZpbml0aW9uIGV4cGxpY2l0IGZvciBicm9hZGVyCisgICAgICAgIC8vIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KHBhdGgpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoRVhDRVBUSU9OX1RZUEUsIGV4Y2VwdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSkuaGVhZGVyKFBST1ZJREVSLCBwcm92aWRlckNsYXNzLmdldFNpbXBsZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYWNjZXB0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgicG9zdCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhjZXB0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgTUFQUEVEX1dBRSArIHByb3ZpZGVyQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KENsYXNzPD8+IGV4Y2VwdGlvbkNsYXNzLCBDbGFzczw/PiBwcm92aWRlckNsYXNzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gImV4Y2VwdGlvbi9nZW5lcmFsIjsKKyAgICAgICAgX3Rlc3QoZXhjZXB0aW9uQ2xhc3MsIHByb3ZpZGVyQ2xhc3MsIHBhdGgpOworICAgIH0KKworICAgIC8vIHN1YiByZXNvdXJjZSBsb2NhdG9yCisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4Y2VwdGlvbk1hcHBlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4Y2VwdGlvbk1hcHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJiYWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTWFwcGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5DbGllbnRFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhyb3dpbmcgZXhjZXB0aW9ucyBpbiB7QGxpbmsgTWVzc2FnZUJvZHlSZWFkZXJ9IGFuZCB7QGxpbmsgTWVzc2FnZUJvZHlXcml0ZXJ9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTXlNZXNzYWdlQm9keVdyaXR0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgTXlNZXNzYWdlQm9keVJlYWRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBDbGllbnRFcnJvckV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNeUV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVNYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgTXlFeGNlcHRpb25NYXBwZXJDYXVzZUFub3RoZXJFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgLy8gSkVSU0VZLTE1MTUKKyAgICAgICAgICAgICAgICBUZXN0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmlzaWJpbGl0eUV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICAvLyBKRVJTRVktMTUyNQorICAgICAgICAgICAgICAgIEV4Y2VwdGlvblRlc3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25UaHJvd2luZ0ZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbk1lc3NhZ2VSZWFkZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb25SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBQcm92aWRlck5vdEZvdW5kRXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIC8vIEpFUlNFWS0xODg3CisgICAgICAgICAgICAgICAgSmVyc2V5MTg4N1Jlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEplcnNleTE4ODdFeGNlcHRpb25NYXBwZXJJbXBsLmNsYXNzLAorICAgICAgICAgICAgICAgIC8vIEpFUlNFWS0yMzgyCisgICAgICAgICAgICAgICAgSmVyc2V5MjM4MlJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEplcnNleTIzODJFeGNlcHRpb25NYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgSmVyc2V5MjM4MlByb3ZpZGVyLmNsYXNzCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGVyVGhyb3dzRXhjZXB0aW9uKCkgeworICAgICAgICBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdCgidGVzdC90ZXN0IikuaGVhZGVyKCJyZWFkZXItZXhjZXB0aW9uIiwgInRocm93IikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwgInRlc3QvdGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlcy5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVhZGVyLWV4Y2VwdGlvbi1tYXBwZXIiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlclRocm93c0V4Y2VwdGlvbkJlZm9yZUZpcnN0Qnl0ZXNBcmVXcml0dGVuKCkgeworICAgICAgICBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2JlZm9yZSIpLnJlcXVlc3QoInRlc3QvdGVzdCIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImV4Y2VwdGlvbi1iZWZvcmUtZmlyc3QtYnl0ZXMtZXhjZXB0aW9uLW1hcHBlciIsIHJlcy5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlclRocm93c0V4Y2VwdGlvbkFmdGVyRmlyc3RCeXRlc0FyZVdyaXR0ZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2FmdGVyIikucmVxdWVzdCgidGVzdC90ZXN0IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpOworICAgICAgICBieXRlIGI7CisgICAgICAgIGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgTXlNZXNzYWdlQm9keVdyaXR0ZXIuZmlyc3RCeXRlc1JlY2VpdmVkID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKChiID0gKGJ5dGUpIGlucHV0U3RyZWFtLnJlYWQoKSkgPj0gMCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdhJywgYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmV2ZW50TXVsdGlwbGVFeGNlcHRpb25NYXBwaW5nKCkgeworICAgICAgICBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2V4Y2VwdGlvbiIpLnJlcXVlc3QoInRlc3QvdGVzdCIpLmdldCgpOworICAgICAgICAvLyBmaXJzdGx5IGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gdGhlIHJlc291cmNlIG1ldGhvZCBhbmQgaXMgY29ycmVjdGx5IG1hcHBlZC4gVGhlbiBpdCBpcyBhZ2FpbiB0aHJvd24gaW4gTUJXcml0ZXIgYnV0CisgICAgICAgIC8vIGV4Y2VwdGlvbiBjYW4gYmUgbWFwcGVkIG9ubHkgb25jZSwgc28gc2Vjb25kIGV4Y2VwdGlvbiBpbiBNQldyaXRlciBjYXVzZSA1MDAgcmVzcG9uc2UgY29kZS4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYmVmb3JlIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXN0L3Rlc3QiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZXhjZXB0aW9uQmVmb3JlRmlyc3RCeXRlc0FyZVdyaXR0ZW4oKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDIwMCkuaGVhZGVyKCJ3cml0ZXItZXhjZXB0aW9uIiwgImJlZm9yZS1maXJzdC1ieXRlIikuZW50aXR5KCJvayIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhZnRlciIpCisgICAgICAgIEBQcm9kdWNlcygidGVzdC90ZXN0IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGV4Y2VwdGlvbkFmdGVyRmlyc3RCeXRlc0FyZVdyaXR0ZW4oKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDIwMCkuaGVhZGVyKCJ3cml0ZXItZXhjZXB0aW9uIiwgImFmdGVyLWZpcnN0LWJ5dGUiKS5lbnRpdHkoImFhYWFhIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGVzdC90ZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIHJldHVybiAicG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgICAgICBAUHJvZHVjZXMoInRlc3QvdGVzdCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0aHJvd3NFeGNlcHRpb24oKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTXlBbm90aGVyRXhjZXB0aW9uKCJyZXNvdXJjZSIpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInRocm93YWJsZSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyB0aHJvd3NUaHJvd2FibGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUaHJvd2FibGUoInRocm93YWJsZSIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lRXhjZXB0aW9uKCJydW50aW1lLWV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsaWVudEVycm9yRXhjZXB0aW9uKCJjbGllbnQtZXJyb3IiLCA0OTkpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEVycm9yRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPENsaWVudEVycm9yRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKENsaWVudEVycm9yRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuT0spLmVudGl0eSgibWFwcGVkLWNsaWVudC1lcnJvci0iCisgICAgICAgICAgICAgICAgICAgICsgZXhjZXB0aW9uLmdldFJlc3BvbnNlKCkuZ2V0U3RhdHVzKCkgKyAiLSIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxNeUV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShNeUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShleGNlcHRpb24uZ2V0TWVzc2FnZSgpICsgIi1leGNlcHRpb24tbWFwcGVyIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhyb3dhYmxlTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFRocm93YWJsZT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykuZW50aXR5KCJtYXBwZWQtdGhyb3dhYmxlLSIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uTWFwcGVyQ2F1c2VBbm90aGVyRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE15QW5vdGhlckV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShNeUFub3RoZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAvLyB0aGUgaGVhZGVyIGNhdXNlcyBleGNlcHRpb24gdG8gYmUgdGhyb3duIGFnYWluIGluIE15TWVzc2FnZUJvZHlXcml0ZXIKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmhlYWRlcigid3JpdGVyLWV4Y2VwdGlvbiIsICJiZWZvcmUtZmlyc3QtYnl0ZSIpLmVudGl0eShleGNlcHRpb24uZ2V0TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICsgIi1hbm90aGVyLWV4Y2VwdGlvbi1tYXBwZXIiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJ0ZXN0L3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNZXNzYWdlQm9keVdyaXR0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZmlyc3RCeXRlc1JlY2VpdmVkOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBzLmxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaXJzdEJ5dGVzUmVjZWl2ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IGhlYWRlciA9IGh0dHBIZWFkZXJzLmdldCgid3JpdGVyLWV4Y2VwdGlvbiIpOworCisgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwgJiYgaGVhZGVyLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmdldCgwKS5lcXVhbHMoImJlZm9yZS1maXJzdC1ieXRlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE15RXhjZXB0aW9uKCJleGNlcHRpb24tYmVmb3JlLWZpcnN0LWJ5dGVzIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIuZ2V0KDApLmVxdWFscygiYWZ0ZXItZmlyc3QtYnl0ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFmaXJzdEJ5dGVzUmVjZWl2ZWQgJiYgaSsrIDwgNTAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoJ2EnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNeUV4Y2VwdGlvbigiZXhjZXB0aW9uLWFmdGVyLWZpcnN0LWJ5dGVzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgICAgIG9zdy53cml0ZShzKTsKKyAgICAgICAgICAgICAgICBvc3cuZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBDb25zdW1lcygidGVzdC90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TWVzc2FnZUJvZHlSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRGcm9tKENsYXNzPFN0cmluZz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGhlYWRlciA9IGh0dHBIZWFkZXJzLmdldCgicmVhZGVyLWV4Y2VwdGlvbiIpOworICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsICYmIGhlYWRlci5zaXplKCkgPiAwICYmIGhlYWRlci5nZXQoMCkuZXF1YWxzKCJ0aHJvdyIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE15RXhjZXB0aW9uKCJyZWFkZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiYWFhIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgICAgICBwdWJsaWMgTXlFeGNlcHRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXlFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE15RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlBbm90aGVyRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIE15QW5vdGhlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNeUFub3RoZXJFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXlBbm90aGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNeUFub3RoZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQkVHSU46IEpFUlNFWS0xNTE1IHJlcHJvZHVjZXIgY29kZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmlzaWJpbGl0eUV4Y2VwdGlvbiBleHRlbmRzIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTE1OTQwNzMxMjY5MTM3MjQyOUw7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZpc2liaWxpdHlFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VmlzaWJpbGl0eUV4Y2VwdGlvbj4geworCisgICAgICAgIHByaXZhdGUgSHR0cEhlYWRlcnMgaGVhZGVyczsKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIGluZm87CisgICAgICAgIHByaXZhdGUgQXBwbGljYXRpb24gYXBwbGljYXRpb247CisgICAgICAgIHByaXZhdGUgUmVxdWVzdCByZXF1ZXN0OworICAgICAgICBwcml2YXRlIFByb3ZpZGVycyBwcm92aWRlcjsKKworICAgICAgICBwcm90ZWN0ZWQgVmlzaWJpbGl0eUV4Y2VwdGlvbk1hcHBlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIGluZm8sIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QsIEBDb250ZXh0IFByb3ZpZGVycyBwcm92aWRlcikgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaXNpYmlsaXR5RXhjZXB0aW9uTWFwcGVyKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gaW5mbywgQENvbnRleHQgQXBwbGljYXRpb24gYXBwbGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaXNpYmlsaXR5RXhjZXB0aW9uTWFwcGVyKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gaW5mbywgQENvbnRleHQgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWaXNpYmlsaXR5RXhjZXB0aW9uTWFwcGVyKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gaW5mbykgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpc2liaWxpdHlFeGNlcHRpb25NYXBwZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoVmlzaWJpbGl0eUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygidmlzaWJsZSIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgidGVzdC92aXNpYmxlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRocm93VmlzaWJsZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBWaXNpYmlsaXR5RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkxNTE1KCkgeworICAgICAgICBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L3Zpc2libGUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmlzaWJsZSIsIHJlcy5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKyAgICAvKioKKyAgICAgKiBFTkQ6IEpFUlNFWS0xNTE1IHJlcHJvZHVjZXIgY29kZQorICAgICAqLworCisgICAgLyoqCisgICAgICogQkVHSU46IEpFUlNFWS0xNTI1IHJlcHJvZHVjZXIgY29kZS4KKyAgICAgKi8KKyAgICBAUGF0aCgidGVzdC9yZXNwb25zZUZpbHRlciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25UZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFRocm93c05QRQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gIm1ldGhvZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHByaXZhdGUgc3RhdGljIEBpbnRlcmZhY2UgVGhyb3dzTlBFIHsKKyAgICB9CisKKyAgICBAVGhyb3dzTlBFCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25UaHJvd2luZ0ZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIFRoZSBpZiBjbGF1c2UgcHJldmVudHMgdGhyb3dpbmcgZXhjZXB0aW9uIG9uIGEgbWFwcGVkIHJlc3BvbnNlLgorICAgICAgICAgICAgLy8gTm90IGRvaW5nIHNvIHdvdWxkIHJlc3VsdCBpbiBhIHNlY29uZCBleGNlcHRpb24gYmVpbmcgdGhyb3duCisgICAgICAgICAgICAvLyB3aGljaCB3b3VsZCBub3QgYmUgbWFwcGVkIGFnYWluOyBpbnN0ZWFkLCBpdCB3b3VsZCBiZSBwcm9wYWdhdGVkCisgICAgICAgICAgICAvLyB0byB0aGUgaG9zdGluZyBjb250YWluZXIgZGlyZWN0bHkuCisgICAgICAgICAgICBpZiAoISJtYXBwZWQtdGhyb3dhYmxlLXJlc3BvbnNlLWZpbHRlci1leGNlcHRpb24iLmVxdWFscyhyZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJyZXNwb25zZS1maWx0ZXItZXhjZXB0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkxNTI1KCkgeworICAgICAgICBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L3Jlc3BvbnNlRmlsdGVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcHBlZC10aHJvd2FibGUtcmVzcG9uc2UtZmlsdGVyLWV4Y2VwdGlvbiIsIHJlcy5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVORDogSkVSU0VZLTE1MjUgcmVwcm9kdWNlciBjb2RlCisgICAgICovCisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElPRXhjZXB0aW9uTWVzc2FnZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPElPQmVhbj4sIE1lc3NhZ2VCb2R5V3JpdGVyPElPQmVhbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gSU9CZWFuLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJT0JlYW4gcmVhZEZyb20oQ2xhc3M8SU9CZWFuPiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiaW8tZXhjZXB0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBJT0JlYW4uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShJT0JlYW4gaW9CZWFuLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oSU9CZWFuIGlvQmVhbiwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShpb0JlYW4udmFsdWUuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSU9CZWFuIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgSU9CZWFuKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJT0V4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxJT0V4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygicGFzc2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJpbyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJT0V4Y2VwdGlvblJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoSU9CZWFuIGlvYmVhbikgeworICAgICAgICAgICAgcmV0dXJuIGlvYmVhbi52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElPRXhjZXB0aW9uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlZ2lzdGVyKElPRXhjZXB0aW9uTWVzc2FnZVJlYWRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucGF0aCgiaW8iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBJT0JlYW4oImlvLWJlYW4iKSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhc3NlZCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyb3dhYmxlRnJvbVJlc291cmNlTWV0aG9kKCkgeworICAgICAgICBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L3Rocm93YWJsZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXBwZWQtdGhyb3dhYmxlLXRocm93YWJsZSIsIHJlcy5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBQYXRoKCJub3QtZm91bmQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZUJvZHlQcm92aWRlck5vdEZvdW5kUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhYS9iYmIiKQorICAgICAgICBwdWJsaWMgVW5rbm93blR5cGUgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmtub3duVHlwZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbmtub3duVHlwZSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8SW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTWVzc2FnZUJvZHlQcm92aWRlck5vdEZvdW5kRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJtYXBwZWQtYnktUHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbk1hcHBlciIpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoIlVuZXhwZWN0ZWQgcm9vdCBjYXVzZSBvZiBJbnRlcm5hbFNlcnZlckVycm9yIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQge0BsaW5rIE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbn0gd3JhcHBlZCBpbnRvIHtAbGluayBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9ufQorICAgICAqIGlzIGNvcnJlY3RseSBtYXBwZWQgdXNpbmcgYW4ge0BsaW5rIEV4Y2VwdGlvbk1hcHBlcn0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90Rm91bmRSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJub3QtZm91bmQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXBwZWQtYnktUHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbk1hcHBlciIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXJzZXkxODg3RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSmVyc2V5MTg4N0V4Y2VwdGlvbk1hcHBlciBleHRlbmRzIEV4Y2VwdGlvbk1hcHBlcjxKZXJzZXkxODg3RXhjZXB0aW9uPiB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXJzZXkxODg3RXhjZXB0aW9uTWFwcGVySW1wbCBpbXBsZW1lbnRzIEplcnNleTE4ODdFeGNlcHRpb25NYXBwZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBKZXJzZXkxODg3RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJmb3VuZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiamVyc2V5MTg4NyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXJzZXkxODg3UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKZXJzZXkxODg3RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgd2UncmUgYWJsZSB0byB1c2UgY29ycmVjdCBleGNlcHRpb24gbWFwcGVyIGV2ZW4gd2hlbiB0aGUgbWFwcGVyIGhpZXJhcmNoeSBoYXMgY29tcGxleCBpbmhlcml0YW5jZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkxODg3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiamVyc2V5MTg4NyIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiZm91bmQiKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXJzZXkyMzgyRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXJzZXkyMzgyRW50aXR5IHsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTIzODJQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEplcnNleTIzODJFbnRpdHk+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIEplcnNleTIzODJFbnRpdHkgamVyc2V5MjM4MkVudGl0eSwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEplcnNleTIzODJFbnRpdHkgamVyc2V5MjM4MkVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKEplcnNleTIzODJFbnRpdHkuY2xhc3MgIT0gdHlwZSkgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgid3JvbmctdHlwZSIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEplcnNleTIzODJFbnRpdHkuY2xhc3MgIT0gZ2VuZXJpY1R5cGUpIHsKKyAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoIndyb25nLWdlbmVyaWMtdHlwZSIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgib2siLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXJzZXkyMzgyRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPEplcnNleTIzODJFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgSmVyc2V5MjM4MkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhuZXcgSmVyc2V5MjM4MkVudGl0eSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImplcnNleTIzODIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmVyc2V5MjM4MlJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBMaXN0PExpc3Q8SW50ZWdlcj4+IGdldCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBKZXJzZXkyMzgyRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgd2UncmUgYWJsZSB0byB1c2UgY29ycmVjdCBleGNlcHRpb24gbWFwcGVyIGV2ZW4gd2hlbiB0aGUgbWFwcGVyIGhpZXJhcmNoeSBoYXMgY29tcGxleCBpbmhlcml0YW5jZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkyMzgyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiamVyc2V5MjM4MiIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygib2siKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBiOGM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLkZJTkUuaW50VmFsdWUoKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBUZXN0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uTWFwcGVyQS5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25NYXBwZXJCLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbk1hcHBlckMuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uTWFwcGVyRC5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25NYXBwZXJFLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbk1hcHBlclguY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkEgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvbkEoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25CIGV4dGVuZHMgRXhjZXB0aW9uQSB7CisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25CKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uQyBleHRlbmRzIEV4Y2VwdGlvbkIgeworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uQyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkQgZXh0ZW5kcyBFeGNlcHRpb25DIHsKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvbkQoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25FIGV4dGVuZHMgRXhjZXB0aW9uRCB7CisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25FKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uWCBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uWChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyQSBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPEV4Y2VwdGlvbkE+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwYWJsZShFeGNlcHRpb25BIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuc3Vic3RyaW5nKDIpLmNvbnRhaW5zKCJBIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoRXhjZXB0aW9uQSBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiQSIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlckIgaW1wbGVtZW50cyBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxFeGNlcHRpb25CPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTWFwcGFibGUoRXhjZXB0aW9uQiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLnN1YnN0cmluZygyKS5jb250YWlucygiQiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEV4Y2VwdGlvbkIgZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkIiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25NYXBwZXJDIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPEV4Y2VwdGlvbkM+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoRXhjZXB0aW9uQyBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiQyIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlckQgaW1wbGVtZW50cyBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxFeGNlcHRpb25EPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTWFwcGFibGUoRXhjZXB0aW9uRCBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLnN1YnN0cmluZygyKS5jb250YWlucygiRCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEV4Y2VwdGlvbkQgZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25NYXBwZXJFIGltcGxlbWVudHMgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXI8RXhjZXB0aW9uRT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBhYmxlKEV4Y2VwdGlvbkUgZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKS5zdWJzdHJpbmcoMikuY29udGFpbnMoIkUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShFeGNlcHRpb25FIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJFIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyWCBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPEV4Y2VwdGlvblg+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwYWJsZShFeGNlcHRpb25YIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuc3Vic3RyaW5nKDIpLmNvbnRhaW5zKCJYIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoRXhjZXB0aW9uWCBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiWCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBlKSB7CisgICAgICAgICAgICBpZiAoZS5jaGFyQXQoMCkgPT0gJ0EnKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkEoU3RyaW5nLnZhbHVlT2YoZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlLmNoYXJBdCgwKSA9PSAnQicpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uQihTdHJpbmcudmFsdWVPZihlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY2hhckF0KDApID09ICdDJykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb25DKFN0cmluZy52YWx1ZU9mKGUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jaGFyQXQoMCkgPT0gJ0QnKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkQoU3RyaW5nLnZhbHVlT2YoZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlLmNoYXJBdCgwKSA9PSAnRScpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uRShTdHJpbmcudmFsdWVPZihlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY2hhckF0KDApID09ICdYJykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb25YKFN0cmluZy52YWx1ZU9mKGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgLy8gRm9ybWF0IG9mIGZpcnN0IHBhcmFtOiBbZXhjZXB0aW9uIHRocm93bl0tW2V4Y2VwdGlvbiBtYXBwZXJzIHdoaWNoIHdpbGwgcmV0dXJuIHRydWUgaW4gaXNNYXBwYWJsZV0KKyAgICAgICAgX3Rlc3QoIkEtQSIsICJBIik7CisgICAgICAgIF90ZXN0KCJBLUFCIiwgIkEiKTsKKyAgICAgICAgX3Rlc3QoIkEtQUJDIiwgIkEiKTsKKyAgICAgICAgX3Rlc3QoIkEtQUJDRCIsICJBIik7CisgICAgICAgIF90ZXN0KCJBLUFCQ0RFIiwgIkEiKTsKKyAgICAgICAgX3Rlc3QoIkEtQUJDREVYIiwgIkEiKTsKKyAgICAgICAgX3Rlc3QoIkEtQyIsIG51bGwpOworICAgICAgICBfdGVzdCgiQS1EIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJBLUUiLCBudWxsKTsKKyAgICAgICAgX3Rlc3QoIkEtRCIsIG51bGwpOworICAgICAgICBfdGVzdCgiQS1CQ0RFWCIsIG51bGwpOworICAgICAgICBfdGVzdCgiQS0wMDAwMCIsIG51bGwpOworICAgICAgICBfdGVzdCgiQS1YIiwgbnVsbCk7CisKKworICAgICAgICBfdGVzdCgiQi1BIiwgIkEiKTsKKyAgICAgICAgX3Rlc3QoIkItQiIsICJCIik7CisgICAgICAgIF90ZXN0KCJCLUFCIiwgIkIiKTsKKyAgICAgICAgX3Rlc3QoIkItQUJDIiwgIkIiKTsKKyAgICAgICAgX3Rlc3QoIkItQUJDRCIsICJCIik7CisgICAgICAgIF90ZXN0KCJCLUFCQ0RFIiwgIkIiKTsKKyAgICAgICAgX3Rlc3QoIkItQUJDREVYIiwgIkIiKTsKKyAgICAgICAgX3Rlc3QoIkItQyIsIG51bGwpOworICAgICAgICBfdGVzdCgiQi1EIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJCLUUiLCBudWxsKTsKKyAgICAgICAgX3Rlc3QoIkItQ0RFWCIsIG51bGwpOworICAgICAgICBfdGVzdCgiQi1YIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJCLTAwMCIsIG51bGwpOworCisgICAgICAgIC8vIEMgaXMgbm90IGFuIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyIGJ1dCBqdXN0IEV4Y2VwdGlvbk1hcHBlciAoYWx3YXlzIG1hcHBhYmxlKQorICAgICAgICBfdGVzdCgiQy1DIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkMtQSIsICJDIik7CisgICAgICAgIF90ZXN0KCJDLUFCIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkMtQUJDIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkMtQUVYIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkMtMDAwMDAiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy1BQkNERVgiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy1FIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkMtREUiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy1EIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkMtWCIsICJDIik7CisKKyAgICAgICAgX3Rlc3QoIkQtMDAwIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkQtQSIsICJDIik7CisgICAgICAgIF90ZXN0KCJELUIiLCAiQyIpOworICAgICAgICBfdGVzdCgiRC1DIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkQtRCIsICJEIik7CisgICAgICAgIF90ZXN0KCJELUUiLCAiQyIpOworICAgICAgICBfdGVzdCgiRC1BQkMiLCAiQyIpOworICAgICAgICBfdGVzdCgiRC1BQkNFWCIsICJDIik7CisgICAgICAgIF90ZXN0KCJELUFCQ0RFWCIsICJEIik7CisgICAgICAgIF90ZXN0KCJELURFIiwgIkQiKTsKKyAgICAgICAgX3Rlc3QoIkQtQUJFWCIsICJDIik7CisgICAgICAgIF90ZXN0KCJELUFFWCIsICJDIik7CisgICAgICAgIF90ZXN0KCJELVgiLCAiQyIpOworCisgICAgICAgIF90ZXN0KCJFLUEiLCAiQyIpOworICAgICAgICBfdGVzdCgiRS1CIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkUtQyIsICJDIik7CisgICAgICAgIF90ZXN0KCJFLUQiLCAiRCIpOworICAgICAgICBfdGVzdCgiRS1FIiwgIkUiKTsKKyAgICAgICAgX3Rlc3QoIkUtQUJDIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkUtQUJDRCIsICJEIik7CisgICAgICAgIF90ZXN0KCJFLUFCQ0RFIiwgIkUiKTsKKyAgICAgICAgX3Rlc3QoIkUtQUJDREVYIiwgIkUiKTsKKyAgICAgICAgX3Rlc3QoIkUtREUiLCAiRSIpOworICAgICAgICBfdGVzdCgiRS1YIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkUtMDAwMDAwIiwgIkMiKTsKKworICAgICAgICBfdGVzdCgiWC1BIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJYLUFCQ0RFIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJYLUFCQ0RFWCIsICJYIik7CisgICAgICAgIF90ZXN0KCJYLVgiLCAiWCIpOworCisgICAgICAgIC8vIENoZWNrIGxvZ3MuICg/PykKKyAgICAgICAgZm9yIChmaW5hbCBMb2dSZWNvcmQgbG9nUmVjb3JkIDogZ2V0TG9nZ2VkUmVjb3JkcygpKSB7CisKKyAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgdGVzdCBpcyBmcmFnaWxlLgorICAgICAgICAgICAgaWYgKGxvZ1JlY29yZC5nZXRMb2dnZXJOYW1lKCkuY29udGFpbnMoIkNsaWVudEV4ZWN1dG9yUHJvdmlkZXJzQ29uZmlndXJhdG9yIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbWVzc2FnZSA6IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfRVhDRVBUSU9OX01BUFBJTkdfT1JJR0lOQUxfRVhDRVBUSU9OKCksCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0VYQ0VQVElPTl9NQVBQSU5HX1RIUk9XTl9UT19DT05UQUlORVIoKX0pIHsKKworICAgICAgICAgICAgICAgIGlmIChsb2dSZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKG1lc3NhZ2UpICYmIGxvZ1JlY29yZC5nZXRMZXZlbCgpLmludFZhbHVlKCkgPiBMZXZlbC5GSU5FLmludFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiTG9nIG1lc3NhZ2Ugc2hvdWxkIGJlIGxvZ2dlZCBhdCBsb3dlciAoRklORSkgbGV2ZWw6ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoU3RyaW5nIGlucHV0LCBTdHJpbmcgZXhwZWN0ZWRNYXBwZXIpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbnB1dCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBpZiAoZXhwZWN0ZWRNYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWFwcGVyLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4dGVuZGVkVXJpSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4dGVuZGVkVXJpSW5mb1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhmOTRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXh0ZW5kZWRVcmlJbmZvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkVXJpSW5mbzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiB7QGxpbmsgRXh0ZW5kZWRVcmlJbmZvfSBlMmUgdGVzdHMgLSB0ZXN0aW5nIGUuZy4gZ2V0dGluZyBtYXRjaGVkIHJlc291cmNlcywgbWFwcGVkIHRocm93YWJsZSwgZXRjLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRXh0ZW5kZWRVcmlJbmZvVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUaHJvd2FibGVSZXNvdXJjZS5jbGFzcywgTWFwcGVkVGhyb3dhYmxlUmVzcG9uc2VGaWx0ZXIuY2xhc3MsIE1hcHBlZEV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKKyAgICBAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIE1hcHBlZFRocm93YWJsZSB7fQorCisgICAgQFBhdGgoIm1hcHBlZC10aHJvd2FibGUtdGVzdCIpCisgICAgQE1hcHBlZFRocm93YWJsZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhyb3dhYmxlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInVubWFwcGVkIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHVubWFwcGVkKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1hcHBlZCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBtYXBwZWQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFwcGVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ3ZWJhcHAiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugd2ViYXBwKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlZ3VsYXIiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcmVndWxhcigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcHBlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwcGVkRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE1hcHBlZEV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBNYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE1hcHBlZFRocm93YWJsZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwcGVkVGhyb3dhYmxlUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIEV4dGVuZGVkVXJpSW5mbyB1cmlJbmZvOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoT2JqZWN0cy50b1N0cmluZyh1cmlJbmZvLmdldE1hcHBlZFRocm93YWJsZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hcHBlZFRocm93YWJsZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQoIkludGVybmFsIFNlcnZlciBFcnJvciBleHBlY3RlZCAtIHJlc3BvbnNlIGZpbHRlciBub3QgaW52b2tlZCIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJtYXBwZWQtdGhyb3dhYmxlLXRlc3QvdW5tYXBwZWQiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksCisgICAgICAgICAgICAgICAgaXMoUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUi5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBwZWRUaHJvd2FibGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KCJNYXBwZWRFeGNlcHRpb24gZXhwZWN0ZWQgaW4gRXh0ZW5kZWRVcmlJbmZvI2dldE1hcHBlZFRocm93YWJsZSIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJtYXBwZWQtdGhyb3dhYmxlLXRlc3QvbWFwcGVkIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBpcygib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5FeHRlbmRlZFVyaUluZm9UZXN0JE1hcHBlZEV4Y2VwdGlvbiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJBcHBUaHJvd2FibGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KCJJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIGV4cGVjdGVkIGluIEV4dGVuZGVkVXJpSW5mbyNnZXRNYXBwZWRUaHJvd2FibGUiLAorICAgICAgICAgICAgICAgIHRhcmdldCgibWFwcGVkLXRocm93YWJsZS10ZXN0L3dlYmFwcCIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoImphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVndWxhclJlc291cmNlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdCgibnVsbCBleHBlY3RlZCBpbiBFeHRlbmRlZFVyaUluZm8jZ2V0TWFwcGVkVGhyb3dhYmxlIiwKKyAgICAgICAgICAgICAgICB0YXJnZXQoIm1hcHBlZC10aHJvd2FibGUtdGVzdC9yZWd1bGFyIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBpcygibnVsbCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Gb3JtUGFyYW1NdWx0aXZhbHVlZEluamVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0Zvcm1QYXJhbU11bHRpdmFsdWVkSW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzA4MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Gb3JtUGFyYW1NdWx0aXZhbHVlZEluamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoYXQgdGhlIE11bHRpdmFsdWVkTWFwIGluamVjdGlvbiBkb2VzIG5vdCBjbG9zZSB0aGUgcmVxdWVzdCBidWZmZXIgYW5kIGFsbG93cworICogdG8gcHJvY2VlZCBvdGhlciBGb3JtUGFyYW0gaW5qZWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEZvcm1QYXJhbU11bHRpdmFsdWVkSW5qZWN0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFREVGSU5FRF9SRVNQT05TRSA9ICJIZWxsbyBHZW9yZ2UgSmF2YXRhciI7CisKKyAgICBAUGF0aCgiZm9ybSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzaW1wbGUiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugc2ltcGxlKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiZmlyc3RuYW1lIikgU3RyaW5nIGZpcnN0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImxhc3RuYW1lIikgU3RyaW5nIGxhc3RuYW1lKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZm9ybVBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHZW9yZ2UiLCBmb3JtUGFyYW1zLmdldCgiZmlyc3RuYW1lIikuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSmF2YXRhciIsIGZvcm1QYXJhbXMuZ2V0KCJsYXN0bmFtZSIpLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykuZW50aXR5KCJIZWxsbyAiICsgZmlyc3RuYW1lICsgIiAiICsgbGFzdG5hbWUpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgibnVsbGFibGUiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbnVsbGFibGUoTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1QYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJmaXJzdG5hbWUiKSBTdHJpbmcgZmlyc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgibGFzdG5hbWUiKSBTdHJpbmcgbGFzdG5hbWUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBmb3JtUGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZm9ybVBhcmFtcy5nZXQoImZpcnN0bmFtZSIpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdlb3JnZSIsIGZvcm1QYXJhbXMuZ2V0KCJmaXJzdG5hbWUiKS5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKYXZhdGFyIiwgZm9ybVBhcmFtcy5nZXQoImxhc3RuYW1lIikuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk9LKS5lbnRpdHkoIkhlbGxvICIgKyBmaXJzdG5hbWUgKyAiICIgKyBsYXN0bmFtZSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJtaXhlZCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBtaXhlZChARm9ybVBhcmFtKCJmaXJzdG5hbWUiKSBTdHJpbmcgZmlyc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1QYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJsYXN0bmFtZSIpIFN0cmluZyBsYXN0bmFtZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZvcm1QYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBmb3JtUGFyYW1zLmdldCgiZmlyc3RuYW1lIikuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiR2VvcmdlIiwgZm9ybVBhcmFtcy5nZXQoImZpcnN0bmFtZSIpLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkphdmF0YXIiLCBmb3JtUGFyYW1zLmdldCgibGFzdG5hbWUiKS5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuT0spLmVudGl0eSgiSGVsbG8gIiArIGZpcnN0bmFtZSArICIgIiArIGxhc3RuYW1lKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImVuY29kZWQiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZW5jb2RlZChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZm9ybVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARW5jb2RlZCBARm9ybVBhcmFtKCJmaXJzdG5hbWUiKSBTdHJpbmcgZmlyc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImxhc3RuYW1lIikgU3RyaW5nIGxhc3RuYW1lKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZm9ybVBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHZW9yZ2UiLCBmb3JtUGFyYW1zLmdldCgiZmlyc3RuYW1lIikuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSmF2YXRhciIsIGZvcm1QYXJhbXMuZ2V0KCJsYXN0bmFtZSIpLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykuZW50aXR5KCJIZWxsbyAiICsgZmlyc3RuYW1lICsgIiAiICsgbGFzdG5hbWUpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQYXRoKCJmb3JtLWV4dCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtRXh0UmVzb3VyY2UgeworCisgICAgICAgIEBFbmNvZGVkIEBGb3JtUGFyYW0oImZpcnN0bmFtZSIpIFN0cmluZyBmaXJzdG5hbWU7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImVuY29kZWQiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZW5jb2RlZChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZm9ybVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJsYXN0bmFtZSIpIFN0cmluZyBsYXN0bmFtZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZvcm1QYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiR2VvcmdlIiwgZm9ybVBhcmFtcy5nZXQoImZpcnN0bmFtZSIpLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkphdmF0YXIiLCBmb3JtUGFyYW1zLmdldCgibGFzdG5hbWUiKS5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuT0spLmVudGl0eSgiSGVsbG8gIiArIGZpcnN0bmFtZSArICIgIiArIGxhc3RuYW1lKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEZvcm1SZXNvdXJjZS5jbGFzcywgRm9ybUV4dFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtTXVsdGl2YWx1ZWRQYXJhbSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiL2Zvcm0vc2ltcGxlIiwgImZpcnN0bmFtZT1HZW9yZ2UmbGFzdG5hbWU9SmF2YXRhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJFREVGSU5FRF9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybU11bHRpdmFsdWVkUGFyYW1XaXRoTnVsbCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiL2Zvcm0vbnVsbGFibGUiLCAiZmlyc3RuYW1lPUdlb3JnZSZmaXJzdG5hbWUmbGFzdG5hbWU9SmF2YXRhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJFREVGSU5FRF9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybU11bHRpdmFsdWVkUGFyYW1NaXhlZFBhcmFtT3JkZXIoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoIi9mb3JtL21peGVkIiwgImZpcnN0bmFtZT1HZW9yZ2UmZmlyc3RuYW1lJmxhc3RuYW1lPUphdmF0YXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBSRURFRklORURfUkVTUE9OU0UsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1NdWx0aXZhbHVlZFBhcmFtRW5jb2RlZCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiL2Zvcm0vZW5jb2RlZCIsICJmaXJzdG5hbWU9R2VvcmdlJmxhc3RuYW1lPUphdmF0YXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBSRURFRklORURfUkVTUE9OU0UsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1NdWx0aXZhbHVlZFBhcmFtRXh0ZXJuYWxFbmNvZGVkSW5qZWN0aW9uKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKCIvZm9ybS1leHQvZW5jb2RlZCIsICJmaXJzdG5hbWU9R2VvcmdlJmxhc3RuYW1lPUphdmF0YXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBSRURFRklORURfUkVTUE9OU0UsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzcG9uc2UgY2FsbChTdHJpbmcgcGF0aCwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICByZXR1cm4gdGFyZ2V0KCkucGF0aChwYXRoKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KGVudGl0eSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9HbG9iYWxOYW1lQm91bmRJbnRlcmNlcHRvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0dsb2JhbE5hbWVCb3VuZEludGVyY2VwdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWVjMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9HbG9iYWxOYW1lQm91bmRJbnRlcmNlcHRvclRlc3QuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIG5hbWUgYm91bmQgYW5kIGdsb2JhbCBib3VuZCBpbnRlcmNlcHRvcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIEdsb2JhbE5hbWVCb3VuZEludGVyY2VwdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBJbnRlcmNlcHRvclRlc3RCb3VuZC5jbGFzcywKKyAgICAgICAgICAgICAgICBJbnRlcmNlcHRvckdsb2JhbC5jbGFzcywKKyAgICAgICAgICAgICAgICBQcmVNYXRjaEZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdEV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXF1ZXN0RmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlYWRlckludGVyY2VwdG9yR2xvYmFsLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlYWRlckludGVyY2VwdG9yUG9zdEJvdW5kLmNsYXNzKTsKKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgVGVzdEJvdW5kIHt9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgUG9zdEJvdW5kIHt9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAVGVzdEJvdW5kCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3RhbmRhcmQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0YW5kYXJkKCkgeworICAgICAgICAgICAgcmV0dXJuICJvayI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUG9zdEJvdW5kCisgICAgICAgIEBQYXRoKCJwb3N0Qm91bmQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCb3VuZChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInBvc3RHbG9iYWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RHbG9iYWwoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgcmV0dXJuIHN0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgVGVzdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VGVzdEV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUZXN0RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJtYXBwZWQtIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBQcmVNYXRjaGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlTWF0Y2hGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCJleGNlcHRpb24iLmVxdWFscyhyZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJTdHJpbmcoInByZS1maWx0ZXIiKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdEV4Y2VwdGlvbigiKHByZS1tYXRjaGluZy1leGNlcHRpb24pIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJhYm9ydCIuZXF1YWxzKHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZygicHJlLWZpbHRlciIpKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5vaygiKHByZS1tYXRjaGluZy1hYm9ydCkiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoImV4Y2VwdGlvbiIuZXF1YWxzKHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZygicmVxdWVzdC1maWx0ZXIiKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdEV4Y2VwdGlvbigiKHJlcXVlc3QtZmlsdGVyLWV4Y2VwdGlvbikiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImFib3J0Ii5lcXVhbHMocmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKCJyZXF1ZXN0LWZpbHRlciIpKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5vaygiKHJlcXVlc3QtZmlsdGVyLWFib3J0KSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3RCb3VuZAorICAgIEBQcmlvcml0eSgyMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcmNlcHRvclRlc3RCb3VuZCBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBlbnRpdHkgPSBjb250ZXh0LmdldEVudGl0eSgpICsgIi1bdGVzdC1ib3VuZF0iOworICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoZW50aXR5KTsKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOyAvL0FkZCBvbmUKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgxMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcmNlcHRvckdsb2JhbCBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBlbnRpdHkgPSBjb250ZXh0LmdldEVudGl0eSgpICsgIi1bZ2xvYmFsLWJvdW5kXSI7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7IC8vQWRkIG9uZQorICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDIwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWRlckludGVyY2VwdG9yR2xvYmFsIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSAoU3RyaW5nKSBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHkgKyAiLVtnbG9iYWwtcmVhZGVyLWludGVyY2VwdG9yXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMTAwKQorICAgIEBQb3N0Qm91bmQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWRlckludGVyY2VwdG9yUG9zdEJvdW5kIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSAoU3RyaW5nKSBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHkgKyAiLVtwb3N0LXJlYWRlci1pbnRlcmNlcHRvcl0iOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlbWF0Y2hpbmdFeGNlcHRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5oZWFkZXIoInByZS1maWx0ZXIiLCAiZXhjZXB0aW9uIikuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm1hcHBlZC0ocHJlLW1hdGNoaW5nLWV4Y2VwdGlvbiktW2dsb2JhbC1ib3VuZF0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdGNoaW5nQWJvcnQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5oZWFkZXIoInByZS1maWx0ZXIiLCAiYWJvcnQiKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiKHByZS1tYXRjaGluZy1hYm9ydCktW2dsb2JhbC1ib3VuZF0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RGaWx0ZXJFeGNlcHRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5oZWFkZXIoInJlcXVlc3QtZmlsdGVyIiwgImV4Y2VwdGlvbiIpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJtYXBwZWQtKHJlcXVlc3QtZmlsdGVyLWV4Y2VwdGlvbiktW2dsb2JhbC1ib3VuZF0tW3Rlc3QtYm91bmRdIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0RmlsdGVyQWJvcnQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5oZWFkZXIoInJlcXVlc3QtZmlsdGVyIiwgImFib3J0IikuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIihyZXF1ZXN0LWZpbHRlci1hYm9ydCktW2dsb2JhbC1ib3VuZF0tW3Rlc3QtYm91bmRdIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFJlc291cmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2Uvc3RhbmRhcmQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9rLVtnbG9iYWwtYm91bmRdIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0UmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2V0LVtnbG9iYWwtYm91bmRdLVt0ZXN0LWJvdW5kXSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UvcG9zdEdsb2JhbCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInBvc3QtW2dsb2JhbC1yZWFkZXItaW50ZXJjZXB0b3JdLVtnbG9iYWwtYm91bmRdIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0Qm91bmQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZS9wb3N0Qm91bmQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwb3N0LVtnbG9iYWwtcmVhZGVyLWludGVyY2VwdG9yXS1bcG9zdC1yZWFkZXItaW50ZXJjZXB0b3JdLVtnbG9iYWwtYm91bmRdIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvR2xvYmFsbHlOYW1lQm91bmRSZXNvdXJjZUZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0dsb2JhbGx5TmFtZUJvdW5kUmVzb3VyY2VGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0OGI3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0dsb2JhbGx5TmFtZUJvdW5kUmVzb3VyY2VGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBKQVgtUlMgZ2xvYmFsIG5hbWUtYm91bmQgZmlsdGVyIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2VlIFJlc291cmNlRmlsdGVyVGVzdAorICovCitwdWJsaWMgY2xhc3MgR2xvYmFsbHlOYW1lQm91bmRSZXNvdXJjZUZpbHRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVRVUVTVF9IRUFERVIgPSAidGVzdC1yZXF1ZXN0LWhlYWRlciI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAR2xvYmFsbHlCb3VuZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICAgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgICAgICBzdXBlcigKKyAgICAgICAgICAgICAgICAgICAgTXlSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgR2xvYmFsbHlCb3VuZFJlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIEdsb2JhbGx5Qm91bmRSZXNwb25zZUZpbHRlci5jbGFzcworCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYmFseUJvdW5kUG9zdE1hdGNoaW5nKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJwb3N0TWF0Y2hpbmciKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoci5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyLmhhc0VudGl0eSgpLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oInJlcXVlc3RGaWx0ZXItbWV0aG9kLXJlc3BvbnNlRmlsdGVyIikpOworICAgIH0KKworICAgIC8vIFNlZSBKRVJTRVktMTU1NAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdsb2JhbHlCb3VuZFBvc3RNYXRjaGluZ1JlcXVlc3RGaWx0ZXJOb3RJbnZva2VkT240MDQoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoIm5vdEZvdW5kIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyLmhhc0VudGl0eSgpLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oInJlc3BvbnNlRmlsdGVyIikpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJwb3N0TWF0Y2hpbmciKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdE1hdGNoaW5nKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBoZWFkZXJzLmdldEhlYWRlclN0cmluZyhURVNUX1JFUVVFU1RfSEVBREVSKTsKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXIgKyAiLW1ldGhvZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHByaXZhdGUgc3RhdGljIEBpbnRlcmZhY2UgR2xvYmFsbHlCb3VuZCB7CisgICAgfQorCisgICAgQEdsb2JhbGx5Qm91bmQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdsb2JhbGx5Qm91bmRSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKFRFU1RfUkVRVUVTVF9IRUFERVIsICJyZXF1ZXN0RmlsdGVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAR2xvYmFsbHlCb3VuZAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2xvYmFsbHlCb3VuZFJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpID8gcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpICsgIi1yZXNwb25zZUZpbHRlciIgOiAicmVzcG9uc2VGaWx0ZXIiLAorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0dyaXp6bHlJbmplY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Hcml6emx5SW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGZlNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Hcml6emx5SW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5SZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBUZXN0IGZvciBKRVJTRVktMTE3MAorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEdyaXp6bHlJbmplY3Rpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBwcml2YXRlIGZpbmFsIFJlcXVlc3QgcmVxdWVzdDsKKworICAgICAgICBwdWJsaWMgUmVzb3VyY2UoCisgICAgICAgICAgICAgICAgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlcXVlc3QpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldE1ldGhvZCgpLmdldE1ldGhvZFN0cmluZygpLnRvVXBwZXJDYXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCIvIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0luaXRpYWxpemF0aW9uTG9nZ2luZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0luaXRpYWxpemF0aW9uTG9nZ2luZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJhZDIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW5pdGlhbGl6YXRpb25Mb2dnaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbml0aWFsaXphdGlvbkxvZ2dpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuRklORS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUcnVlKHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLmNvbnRhaW5zKCJ0ZXN0IikpOworCisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKworICAgICAgICBmb3IgKExvZ1JlY29yZCBsb2dSZWNvcmQgOiBnZXRMb2dnZWRSZWNvcmRzKCkpIHsKKyAgICAgICAgICAgIGlmIChsb2dSZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKExvY2FsaXphdGlvbk1lc3NhZ2VzLkxPR0dJTkdfQVBQTElDQVRJT05fSU5JVElBTElaRUQoKSkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKGZvdW5kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbmplY3Rpb25NYW5hZ2VyU2VydmVyUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbmplY3Rpb25NYW5hZ2VyU2VydmVyUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0NTIxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0luamVjdGlvbk1hbmFnZXJTZXJ2ZXJQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5JbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMge0BsaW5rIEluamVjdGlvbk1hbmFnZXJQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgSW5qZWN0aW9uTWFuYWdlclNlcnZlclByb3ZpZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJmZWF0dXJlIikKKyAgICAgICAgQEZlYXR1cmVCb3VuZAorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9GZWF0dXJlKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJyZWFkZXItaW50ZXJjZXB0b3IiKQorICAgICAgICBAUmVhZGVySW50ZXJjZXB0b3JCb3VuZAorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG9SZWFkZXJJbnRlcmNlcHRvcihTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIndyaXRlci1pbnRlcmNlcHRvciIpCisgICAgICAgIEBXcml0ZXJJbnRlcmNlcHRvckJvdW5kCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob1dyaXRlckludGVyY2VwdG9yKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kKG5ldyBNeUluamVjdGVkU2VydmljZSgiaGVsbG8iKSkudG8oTXlJbmplY3RlZFNlcnZpY2UuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IE15RmVhdHVyZSgpKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IE15UmVhZGVySW50ZXJjZXB0b3IoKSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG5ldyBNeVdyaXRlckludGVyY2VwdG9yKCkpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgRmVhdHVyZUJvdW5kIHsKKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgUmVhZGVySW50ZXJjZXB0b3JCb3VuZCB7CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKKyAgICBAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFdyaXRlckludGVyY2VwdG9yQm91bmQgeworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUluamVjdGVkU2VydmljZSB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgTXlJbmplY3RlZFNlcnZpY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoTXlGZWF0dXJlSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworCisgICAgICAgIEBGZWF0dXJlQm91bmQKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZlYXR1cmVJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgICAgIEBJbmplY3QKKyAgICAgICAgICAgIHB1YmxpYyBNeUZlYXR1cmVJbnRlcmNlcHRvcihNeUluamVjdGVkU2VydmljZSBpbmplY3RlZFNlcnZpY2UpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBpbmplY3RlZFNlcnZpY2UuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KCgoU3RyaW5nKSBjb250ZXh0LmdldEVudGl0eSgpKSArICItaW50ZXJjZXB0b3JmZWF0dXJlLSIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZlYXR1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZmVhdHVyZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtZXh0ZW5kZWQtYnkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsLWJlLWV4dGVuZGVkLWJ5LWludGVyY2VwdG9yZmVhdHVyZS1oZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFdyaXRlckludGVyY2VwdG9yQm91bmQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBzZXJ2aWNlTG9jYXRvciA9IEluamVjdGlvbk1hbmFnZXJQcm92aWRlci5nZXRJbmplY3Rpb25NYW5hZ2VyKGNvbnRleHQpOworICAgICAgICAgICAgZmluYWwgTXlJbmplY3RlZFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VMb2NhdG9yLmdldEluc3RhbmNlKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KCgoU3RyaW5nKSBjb250ZXh0LmdldEVudGl0eSgpKSArICItd3JpdGVyLWludGVyY2VwdG9yLSIgKyBzZXJ2aWNlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2Uvd3JpdGVyLWludGVyY2VwdG9yIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgid2lsbC1iZS1leHRlbmRlZC1ieSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpbGwtYmUtZXh0ZW5kZWQtYnktd3JpdGVyLWludGVyY2VwdG9yLWhlbGxvIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKworICAgIEBSZWFkZXJJbnRlcmNlcHRvckJvdW5kCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlYWRlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBlbnRpdHkgPSBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIGlmICghKGVudGl0eSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZ0VudGl0eSA9IChTdHJpbmcpIGVudGl0eTsKKyAgICAgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgc2VydmljZUxvY2F0b3IgPSBJbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXIuZ2V0SW5qZWN0aW9uTWFuYWdlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGZpbmFsIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2UgPSBzZXJ2aWNlTG9jYXRvci5nZXRJbnN0YW5jZShNeUluamVjdGVkU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nRW50aXR5ICsgIi1yZWFkZXItaW50ZXJjZXB0b3ItIiArIHNlcnZpY2UuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGVySW50ZXJjZXB0b3JJbnN0YW5jZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9yZWFkZXItaW50ZXJjZXB0b3IiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ3aWxsLWJlLWV4dGVuZGVkLWJ5IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2lsbC1iZS1leHRlbmRlZC1ieS1yZWFkZXItaW50ZXJjZXB0b3ItaGVsbG8iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW5qZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhODQ2NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbmplY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKKy8qKgorICogSW5qZWN0aW9uIEUyRSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSW5qZWN0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoImluamVjdGlvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmplY3Rpb25UZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgQFBhdGgoImRlbGV0ZS1wYXRoLXBhcmFtL3tpZH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlbGV0ZVBhdGhQYXJhbShTdHJpbmcgYm9keSwgQFBhdGhQYXJhbSgiaWQiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiAiZGVsZXRlZDogIiArIGlkICsgIi0iICsgYm9keTsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgQFBhdGgoImRlbGV0ZS1wYXRoLXBhcmFtLWFzeW5jL3tpZH0iKQorICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGVQYXRoUGFyYW0oU3RyaW5nIGJvZHksIEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkLCBAU3VzcGVuZGVkIEFzeW5jUmVzcG9uc2UgYXIpIHsKKyAgICAgICAgICAgIGFyLnJlc3VtZSgiZGVsZXRlZDogIiArIGlkICsgIi0iICsgYm9keSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhc3luYyIpCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jR2V0KEBDb250ZXh0IGZpbmFsIFVyaUluZm8gdXJpSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBIdHRwSGVhZGVycyBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICAgICAgLy8gbm93IHN1c3BlbmQgYW5kIHJlc3VtZSBsYXRlciBvbiB3aXRoCisgICAgICAgICAgICBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKS5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZShTdHJpbmcuZm9ybWF0KCJiYXNlIHVyaTogJXNcbmhlYWRlcnM6ICVzXG5tZXRob2Q6ICVzXG5wcmluY2lwYWw6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpSW5mby5nZXRCYXNlVXJpQnVpbGRlcigpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRNZXRob2QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlDb250ZXh0LmdldFVzZXJQcmluY2lwYWwoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdW1lKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEluamVjdGlvblRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkVSU0VZLTE3MTEgcmVwcm9kdWNlci4KKyAgICAgKgorICAgICAqIFRoZSB0ZXN0IGlzIGlnbm9yZWQgYXMgaXQgY3VycmVudGx5IGZhaWxzIG9uIHRoZSBmb2xsb3dpbmc6CisgICAgICogLSBIdHRwVVJMQ29ubmVjdGlvbiB0aHJvd3MgYSBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBzZW5kIHJlcXVlc3QgZGF0YSB3aXRoIEhUVFAgREVMRVRFCisgICAgICogLSBHcml6emx5IGNvbnRhaW5lciBpZ25vcmVzIGFueSBERUxFVEUgcmVxdWVzdCBkYXRhIGFuZCBkb2VzIG5vdCBwYXNzIHRoZW0gdG8gSmVyc2V5CisgICAgICoKKyAgICAgKiBXZSB3b3VsZCBuZWVkIHRvIGJ5LXBhc3MgdGhlc2UgaXNzdWVzIGluIHVuZGVybHlpbmcgbGF5ZXIgdG8gdW4taWdub3JlIHRoZSB0ZXN0LgorICAgICAqLworICAgIEBUZXN0CisgICAgQElnbm9yZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb25JbnRvRGVsZXRlTWV0aG9kKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgiaW5qZWN0aW9uIikucGF0aCgiZGVsZXRlLXBhdGgtcGFyYW0vdGVzdCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlNVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OLCB0cnVlKQorICAgICAgICAgICAgICAgIC5tZXRob2QoIkRFTEVURSIsIEVudGl0eS50ZXh0KCJib2R5IikpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXNwb25zZSBpcyBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIHN0YXR1cy4iLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCAiZGVsZXRlZDogdGVzdC1ib2R5IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgiaW5qZWN0aW9uIikucGF0aCgiZGVsZXRlLXBhdGgtcGFyYW0tYXN5bmMvdGVzdCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlNVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OLCB0cnVlKQorICAgICAgICAgICAgICAgIC5tZXRob2QoIkRFTEVURSIsIEVudGl0eS50ZXh0KCJib2R5IikpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXNwb25zZSBpcyBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIHN0YXR1cy4iLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCAiZGVsZXRlZDogdGVzdC1ib2R5IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMTc2MSByZXByb2R1Y2VyLgorICAgICAqCisgICAgICogVGhpcyBpcyB0byBtYWtlIHN1cmUgbm8gcHJveHkgZ2V0cyBpbmplY3RlZCBpbnRvIGFzeW5jIG1ldGhvZCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jTWV0aG9kUGFyYW1JbmplY3Rpb24oKSB7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImluamVjdGlvbiIpLnBhdGgoImFzeW5jIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2Ugc3RhdHVzLiIsIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXNwb25zZSBpcyBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbnB1dFN0cmVhbVJlc3BvbnNlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW5wdXRTdHJlYW1SZXNwb25zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWVmNmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW5wdXRTdHJlYW1SZXNwb25zZVRlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHlvdSBjYW4ganVzdCBwYXNzIGFuIGlucHV0IHN0cmVhbSB0byBKZXJzZXksCisgKiB3aGVyZSBlbnRpdHkgYm9keSBkYXRhIHdvdWxkIGJlIHJlYWQgZnJvbS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSW5wdXRTdHJlYW1SZXNwb25zZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSW5wdXRTdHJlYW1SZXNvdXJjZS5jbGFzcywgV3JhcHBlZElucHV0U3RyZWFtUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvZGlyZWN0SW5wdXRTdHJlYW0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXRTdHJlYW1SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiSm9zZWZrYSIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3RJbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImRpcmVjdElucHV0U3RyZWFtIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSm9zZWZrYSIsIHMpOworICAgIH0KKworICAgIEBQYXRoKCIvcmVzcG9uc2VXcmFwcGVkSW5wdXRTdHJlYW0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV3JhcHBlZElucHV0U3RyZWFtUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIk1hcmllIi5nZXRCeXRlcygpKSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyYXBwZWRJbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3BvbnNlV3JhcHBlZElucHV0U3RyZWFtIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNYXJpZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW50ZXJjZXB0b3JIdHRwSGVhZGVyc0luamVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0ludGVyY2VwdG9ySHR0cEhlYWRlcnNJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiZThmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0ludGVyY2VwdG9ySHR0cEhlYWRlcnNJbmplY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBKRVJTRVktMTU0NS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSW50ZXJjZXB0b3JIdHRwSGVhZGVyc0luamVjdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV3JpdGVySEVBREVSID0gImN1c3RvbS13cml0ZXItaGVhZGVyIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJlYWRlckhFQURFUiA9ICJjdXN0b20tcmVhZGVyLWhlYWRlciI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBSYXdDT05URU5UID0gIlNJTVBMRSI7CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdGVkV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgSHR0cEhlYWRlcnMgaGVhZGVyczsKKworICAgICAgICAvLyBSZXBsYWNlIGNvbnRlbnQgd2l0aCBXcml0ZXJIRUFERVIgaGVhZGVyIHZhbHVlIGlmIGNvcnJlc3BvbmRpbmcgaGVhZGVyIGlzIHNlZW4uCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3cml0ZXJIZWFkZXJWYWx1ZSA9IGhlYWRlcnMuZ2V0SGVhZGVyU3RyaW5nKFdyaXRlckhFQURFUik7CisKKyAgICAgICAgICAgIGlmICh3cml0ZXJIZWFkZXJWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSh3cml0ZXJIZWFkZXJWYWx1ZS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdGVkUmVhZGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgSHR0cEhlYWRlcnMgaGVhZGVyczsKKworICAgICAgICAvLyBSZXBsYWNlIGNvbnRlbnQgd2l0aCBSZWFkZXJIRUFERVIgaGVhZGVyIHZhbHVlIGlmIGNvcnJlc3BvbmRpbmcgaGVhZGVyIGlzIHNlZW4uCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZWFkZXJIZWFkZXJWYWx1ZSA9IGhlYWRlcnMuZ2V0SGVhZGVyU3RyaW5nKFJlYWRlckhFQURFUik7CisKKyAgICAgICAgICAgIGlmIChyZWFkZXJIZWFkZXJWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlckhlYWRlclZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSYXdDT05URU5UOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoU2ltcGxlUmVzb3VyY2UuY2xhc3MsIEluamVjdGVkV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsIEluamVjdGVkUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIC8vIE5vIGludGVyY2VwdG9yIHNob3VsZCB0d2VhayB0aGUgY29udGVudCBpZiB0aGVyZSBpcyBub3QgaGVhZGVyIHByZXNlbnQuCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVja1Jhd0dldCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGNvbnRhaW5zU3RyaW5nKFJhd0NPTlRFTlQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX2NoZWNrUmF3R2V0KCk7CisgICAgICAgIF9jaGVja1dyaXRlckludGVyY2VwdG9yKCJ3cml0ZXItb25lIik7CisgICAgICAgIF9jaGVja1dyaXRlckludGVyY2VwdG9yKCJ3cml0ZXItdHdvIik7CisgICAgfQorCisgICAgLy8gc2V0IFdyaXRlckhFQURFUiBoZWFkZXIgYW5kIGNoZWNrIHRoZSBzYW1lIHZhbHVlIGlzIHJldHVybmVkIGJhY2sKKyAgICBwcml2YXRlIHZvaWQgX2NoZWNrV3JpdGVySW50ZXJjZXB0b3IoZmluYWwgU3RyaW5nIGhlYWRlclZhbHVlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuaGVhZGVyKFdyaXRlckhFQURFUiwgaGVhZGVyVmFsdWUpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgY29udGFpbnNTdHJpbmcoaGVhZGVyVmFsdWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX2NoZWNrUmF3RWNobygpOworICAgICAgICBfY2hlY2tSZWFkZXJJbnRlcmNlcHRvcigicmVhZGVyLW9uZSIpOworICAgICAgICBfY2hlY2tSZWFkZXJJbnRlcmNlcHRvcigicmVhZGVyLXR3byIpOworICAgIH0KKworICAgIC8vIE5vIGludGVyY2VwdG9yIHNob3VsZCB0d2VhayB0aGUgY29udGVudCBpZiB0aGVyZSBpcyBub3QgaGVhZGVyIHByZXNlbnQuCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVja1Jhd0VjaG8oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByYXdSZXN1bHQgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChSYXdDT05URU5UKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyYXdSZXN1bHQsIGNvbnRhaW5zU3RyaW5nKFJhd0NPTlRFTlQpKTsKKyAgICB9CisKKyAgICAvLyBzZXQgUmVhZGVySEVBREVSIGhlYWRlciBhbmQgY2hlY2sgdGhlIHNhbWUgdmFsdWUgaXMgcmV0dXJuZWQgYmFjaworICAgIHByaXZhdGUgdm9pZCBfY2hlY2tSZWFkZXJJbnRlcmNlcHRvcihTdHJpbmcgaGVhZGVyVmFsdWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgpLnJlcXVlc3QoKS5oZWFkZXIoUmVhZGVySEVBREVSLCBoZWFkZXJWYWx1ZSkucG9zdChFbnRpdHkudGV4dChSYXdDT05URU5UKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGNvbnRhaW5zU3RyaW5nKGhlYWRlclZhbHVlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW50ZXJjZXB0b3JOYW1lQW5kRHluYW1pY0JpbmRpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbnRlcmNlcHRvck5hbWVBbmREeW5hbWljQmluZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk0MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW50ZXJjZXB0b3JOYW1lQW5kRHluYW1pY0JpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwyOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcmNlcHRvck5hbWVBbmREeW5hbWljQmluZGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gIkVOVElUWSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY29uZmlnKTsKKyAgICB9CisKKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUHJlZml4QWRkaW5nUmVhZGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgcHVibGljIFByZWZpeEFkZGluZ1JlYWRlckludGVyY2VwdG9yKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgY29udGV4dC5zZXRJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGdldFByZWZpeCgpLmdldEJ5dGVzKCkpLCBjb250ZXh0LmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmaXgoKTsKKyAgICB9CisKKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUHJlZml4QWRkaW5nV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShnZXRQcmVmaXgoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgU3RyaW5nIGdldFByZWZpeCgpOworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgc3RhdGljIEBpbnRlcmZhY2UgTmFtZUJvdW5kUmVhZGVyIHsKKyAgICB9CisKKyAgICBATmFtZUJvdW5kUmVhZGVyCisgICAgQFByaW9yaXR5KDQwKQorICAgIHN0YXRpYyBjbGFzcyBOYW1lQm91bmRSZWFkZXJJbnRlcmNlcHRvciBleHRlbmRzIFByZWZpeEFkZGluZ1JlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgICAgIHJldHVybiAibmFtZUJvdW5kUmVhZGVyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSg2MCkKKyAgICBzdGF0aWMgY2xhc3MgRHluYW1pY2FsbHlCb3VuZFJlYWRlckludGVyY2VwdG9yIGV4dGVuZHMgUHJlZml4QWRkaW5nUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICAgICAgcmV0dXJuICJkeW5hbWljYWxseUJvdW5kUmVhZGVyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBQcmlvcml0eSg0MCkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHN0YXRpYyBAaW50ZXJmYWNlIE5hbWVCb3VuZFdyaXRlciB7CisgICAgfQorCisgICAgQE5hbWVCb3VuZFdyaXRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3IgZXh0ZW5kcyBQcmVmaXhBZGRpbmdXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFN0cmluZyBnZXRQcmVmaXgoKSB7CisgICAgICAgICAgICByZXR1cm4gIm5hbWVCb3VuZFdyaXRlciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMjApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEeW5hbWljYWxseUJvdW5kV3JpdGVySW50ZXJjZXB0b3IgZXh0ZW5kcyBQcmVmaXhBZGRpbmdXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFN0cmluZyBnZXRQcmVmaXgoKSB7CisgICAgICAgICAgICByZXR1cm4gImR5bmFtaWNhbGx5Qm91bmRXcml0ZXIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm1ldGhvZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXRob2RCaW5kaW5nUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJkeW5hbWljYWxseUJvdW5kV3JpdGVyIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldER5bmFtaWNhbGx5Qm91bmRXcml0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gRU5USVRZOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIm5hbWVCb3VuZFdyaXRlciIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQE5hbWVCb3VuZFdyaXRlcgorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVCb3VuZFdyaXRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBFTlRJVFk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZHluYW1pY2FsbHlCb3VuZFJlYWRlciIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdER5bmFtaWNhbGx5Qm91bmRSZWFkZXIoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibmFtZUJvdW5kUmVhZGVyIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQE5hbWVCb3VuZFJlYWRlcgorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3ROYW1lQm91bmRSZWFkZXIoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiY2xhc3MiKQorICAgIEBOYW1lQm91bmRXcml0ZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsYXNzQmluZGluZ1Jlc291cmNlIHsKKworICAgICAgICBAUGF0aCgibmFtZUJvdW5kV3JpdGVyIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVCb3VuZFdyaXRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBFTlRJVFk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibmFtZUJvdW5kUmVhZGVyIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0TmFtZUJvdW5kUmVhZGVyKFN0cmluZyBpbnB1dCkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm1peGVkIikKKyAgICBATmFtZUJvdW5kV3JpdGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNaXhlZEJpbmRpbmdSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoIm5hbWVCb3VuZFdyaXRlckR5bmFtaWNSZWFkZXIiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3ROYW1lQm91bmRXckR5bmFtaWNhbGx5Qm91bmRSZWFkZXIoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibmFtZUJvdW5kV3JpdGVyRHluYW1pY1dyaXRlck5hbWVCb3VuZFJlYWRlciIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBOYW1lQm91bmRSZWFkZXIKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0TmFtZUJvdW5kUmVXckR5bmFtaWNhbGx5Qm91bmRXcml0ZXIoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgUGF0dGVybiBSZWFkZXJNRVRIT0QgPSBQYXR0ZXJuLmNvbXBpbGUoIi4qRHluYW1pY2FsbHkuKlJlYWRlciIpOworICAgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFdyaXRlck1FVEhPRCA9IFBhdHRlcm4uY29tcGlsZSgiLipEeW5hbWljYWxseS4qV3JpdGVyIik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE1ldGhvZEJpbmRpbmdSZXNvdXJjZS5jbGFzcywgQ2xhc3NCaW5kaW5nUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTWl4ZWRCaW5kaW5nUmVzb3VyY2UuY2xhc3MsIE5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9yLmNsYXNzLCBOYW1lQm91bmRXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykucmVnaXN0ZXJJbnN0YW5jZXMoCisgICAgICAgICAgICAgICAgbmV3IER5bmFtaWNGZWF0dXJlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbywgZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWRlck1FVEhPRC5tYXRjaGVyKHJlc291cmNlSW5mby5nZXRSZXNvdXJjZU1ldGhvZCgpLmdldE5hbWUoKSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihEeW5hbWljYWxseUJvdW5kUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgRHluYW1pY0ZlYXR1cmUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoV3JpdGVyTUVUSE9ELm1hdGNoZXIocmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkuZ2V0TmFtZSgpKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKER5bmFtaWNhbGx5Qm91bmRXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUJvdW5kUmVhZGVyT25NZXRob2QoKSB7CisgICAgICAgIF90ZXN0UmVhZGVyKCJtZXRob2QiLCAibmFtZUJvdW5kUmVhZGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUJvdW5kV3JpdGVyT25NZXRob2QoKSB7CisgICAgICAgIF90ZXN0V3JpdGVyKCJtZXRob2QiLCAibmFtZUJvdW5kV3JpdGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUJvdW5kUmVhZGVyT25DbGFzcygpIHsKKyAgICAgICAgX3Rlc3RSZWFkZXIoImNsYXNzIiwgIm5hbWVCb3VuZFJlYWRlciIsICJuYW1lQm91bmRXcml0ZXJFTlRJVFkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQm91bmRXcml0ZXJPbkNsYXNzKCkgeworICAgICAgICBfdGVzdFdyaXRlcigiY2xhc3MiLCAibmFtZUJvdW5kV3JpdGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY2FsbHlCb3VuZFJlYWRlck9uTWV0aG9kKCkgeworICAgICAgICBfdGVzdFJlYWRlcigibWV0aG9kIiwgImR5bmFtaWNhbGx5Qm91bmRSZWFkZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljYWxseUJvdW5kV3JpdGVyT25NZXRob2QoKSB7CisgICAgICAgIF90ZXN0V3JpdGVyKCJtZXRob2QiLCAiZHluYW1pY2FsbHlCb3VuZFdyaXRlciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNSZWFkZXJPbk1ldGhvZE5hbWVkV3JpdGVyT25DbGFzcygpIHsKKyAgICAgICAgX3Rlc3RSZWFkZXIoIm1peGVkIiwgIm5hbWVCb3VuZFdyaXRlckR5bmFtaWNSZWFkZXIiLCAibmFtZUJvdW5kV3JpdGVyZHluYW1pY2FsbHlCb3VuZFJlYWRlckVOVElUWSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVCb3VuZFdyaXRlckR5bmFtaWNXcml0ZXJOYW1lQm91bmRSZWFkZXIoKSB7CisgICAgICAgIF90ZXN0UmVhZGVyKCJtaXhlZCIsICJuYW1lQm91bmRXcml0ZXJEeW5hbWljV3JpdGVyTmFtZUJvdW5kUmVhZGVyIiwKKyAgICAgICAgICAgICAgICAiZHluYW1pY2FsbHlCb3VuZFdyaXRlcm5hbWVCb3VuZFdyaXRlcm5hbWVCb3VuZFJlYWRlckVOVElUWSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFJlYWRlcihTdHJpbmcgcm9vdCwgU3RyaW5nIGlkKSB7CisgICAgICAgIF90ZXN0UmVhZGVyKHJvb3QsIGlkLCBpZCArIEVOVElUWSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UmVhZGVyKFN0cmluZyByb290LCBTdHJpbmcgaWQsIFN0cmluZyBleHBlY3RlZCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KHJvb3QgKyAiLyIgKyBpZCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShFTlRJVFksIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RXcml0ZXIoU3RyaW5nIHJvb3QsIFN0cmluZyBpZCkgeworICAgICAgICBfdGVzdFdyaXRlcihyb290LCBpZCwgaWQgKyBFTlRJVFkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFdyaXRlcihTdHJpbmcgcm9vdCwgU3RyaW5nIGlkLCBTdHJpbmcgZXhwZWN0ZWQpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldChyb290ICsgIi8iICsgaWQpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01hbmFnZWRDbGllbnRFeGVjdXRvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01hbmFnZWRDbGllbnRFeGVjdXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDQzMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTWFuYWdlZENsaWVudEV4ZWN1dG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DbGllbnRCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVXJpOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCwgdGhhdCBtYW5hZ2VkIGNsaWVudCB1c2VzIHRoZSBjdXN0b20gZXhlY3V0b3Igc2VydmljZS4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNYW5hZ2VkQ2xpZW50RXhlY3V0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBKQVgtUlMgcmVzb3VyY2UuCisgICAgICovCisgICAgQFBhdGgodmFsdWUgPSAiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZSBhbiBhc3luY2hyb25vdXMgcmVxdWVzdCB1c2luZyB0aGUgaW5qZWN0ZWQgbWFuYWdlZCBjbGllbnQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgY2xpZW50IGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGN1c3RvbSBtZXNzYWdlIGJvZHkgcmVhZGVyLCB0aGF0IGNoZWNrcyBpdHMgd29ya2VyIHRocmVhZCBhbmQgcmVwbGFjZXMgdGhlIG9yaWdpbmFsCisgICAgICAgICAqIHJlc3BvbnNlIHdpdGggdGhlIHRyYW5zZmVyIG9iamVjdCBjb250YWluaW5nIHRoZSB0aHJlYWQgbmFtZS4gVGhlIG5hbWUgaXMgdGhhbiB1c2VkIHRvIGlkZW50aWZ5IGlmIHRoZSBjb3JyZWN0CisgICAgICAgICAqIChjdXN0b20pIGV4ZWN1dG9yIHNlcnZpY2UgaXMgdXNlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBuYW1lIG9mIHRoZSB0aHJlYWQsIHRoYXQgZXhlY3V0ZWQgdGhlIGFzeW5jaHJvbm91cyByZXF1ZXN0CisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJleGVjdXRvciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWFuYWdlZENsaWVudFdpdGhFeGVjdXRvcihAQ2xpZW50QSBAVXJpKCJodHRwOi8vbG9jYWxob3N0Ojk5OTgvIikgV2ViVGFyZ2V0IHRhcmdldCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBGdXR1cmU8VGhyZWFkTmFtZT4gbmFtZUZ1dHVyZSA9IHRhcmdldC5wYXRoKCJ0ZXN0L2R1bW15IikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KFRocmVhZE5hbWUuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIG5hbWVGdXR1cmUuZ2V0KCkuZ2V0VGhyZWFkTmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludm9rZSBhbiBhc3luY2hyb25vdXMgcmVxdWVzdCB1c2luZyB0aGUgaW5qZWN0ZWQgbWFuYWdlZCBjbGllbnQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgY2xpZW50IGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGN1c3RvbSBtZXNzYWdlIGJvZHkgcmVhZGVyLCB0aGF0IHVzZXMgaW5qZWN0ZWQgc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UgYW5kCisgICAgICAgICAqIHNjaGVkdWxlcyBhIHRhc2ssIHRoYXQgY2hlY2tzIGl0cyB3b3JrZXIgdGhyZWFkIG5hbWUsIHRoZW4gaXQgZG9lcyB0aGUgc2FtZSB3aXRoIHRoZSBpbmplY3RlZCBzY2hlZHVsZWQgZXhlY3V0b3IKKyAgICAgICAgICogc2VydmljZSBwcm92aWRlciAodG8gY2hlY2sgdGhhdCBib3RoIGluamVjdGlvbiBhcHByb2FjaGVzIHByb2R1Y2Ugc2FtZSByZXN1bHQpIGFuZCByZXR1cm5zIGJvdGggdGhyZWFkIG5hbWVzIGluIGEKKyAgICAgICAgICogdHJhbnNmZXIgb2JqZWN0cy4gVGhlIG5hbWVzIGFyZSB0aGFuIHVzZWQgdG8gaWRlbnRpZnkgaWYgdGhlIGNvcnJlY3QgKGN1c3RvbSkgc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UocykgaXMgKGFyZSkKKyAgICAgICAgICogdXNlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBuYW1lcyBvZiB0aGUgdGhyZWFkcywgdGhhdCBleGVjdXRlZCB0aGUgc2NoZWR1bGVkIHRhc2tzCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzY2hlZHVsZWRFeGVjdXRvciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWFuYWdlZENsaWVudFdpdGhTY2hlZHVsZWRFeGVjdXRvcihAQ2xpZW50QSBAVXJpKCJodHRwOi8vbG9jYWxob3N0Ojk5OTgvIikgV2ViVGFyZ2V0IHRhcmdldCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBGdXR1cmU8U2NoZWR1bGVyVGhyZWFkTmFtZT4gbmFtZXNGdXR1cmUgPSB0YXJnZXQucGF0aCgidGVzdC9kdW1teSIpLnJlcXVlc3QoKS5hc3luYygpLmdldChTY2hlZHVsZXJUaHJlYWROYW1lLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lc0Z1dHVyZS5nZXQoKS5nZXRUaHJlYWROYW1lRnJvbVNlcnZpY2UoKSArICIgIiArIG5hbWVzRnV0dXJlLmdldCgpLmdldFRocmVhZE5hbWVGcm9tUHJvdmlkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEdW1teSBtZXRob2QsIHRoYXQgaXMgaW52b2tlZCBieSB0aGUgbWFuYWdlZCBjbGllbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gZHVtbXkgcmVzcG9uc2UsIGRvZXMgbm90IHJlYWxseSBtYXR0ZXIKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImR1bW15IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkdW1teU1ldGhvZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAibm90aGluZyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYW5hZ2VkIGNsaWVudCBiaW5kaW5nLgorICAgICAqLworICAgIEBDbGllbnRCaW5kaW5nKGNvbmZpZ0NsYXNzID0gTXlDbGllbnRBQ29uZmlnLmNsYXNzKQorICAgIEBEb2N1bWVudGVkCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuUEFSQU1FVEVSfSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBDbGllbnRBIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYW5hZ2VkIGNsaWVudCBjb25maWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNsaWVudEFDb25maWcgZXh0ZW5kcyBDbGllbnRDb25maWcgeworCisgICAgICAgIHB1YmxpYyBNeUNsaWVudEFDb25maWcoKSB7CisgICAgICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiZm9vLWV4ZWN1dG9yLXNlcnZpY2UtJWQiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZXIgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkU2NoZWR1bGVkRXhlY3V0b3IobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImJhci1leGVjdXRvci1zZXJ2aWNlIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKG5ldyBUaHJlYWROYW1lUmVhZGVyKCkpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihTY2hlZHVsZXJUaHJlYWROYW1lUmVhZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAuZXhlY3V0b3JTZXJ2aWNlKGV4ZWN1dG9yKQorICAgICAgICAgICAgICAgICAgICAuc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKHNjaGVkdWxlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlciBvYmplY3QgZm9yIGV4ZWN1dG9yIHNlcnZpY2UgbmFtZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVGhyZWFkTmFtZSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRocmVhZE5hbWU7CisKKyAgICAgICAgVGhyZWFkTmFtZShTdHJpbmcgdGhyZWFkTmFtZSkgeworICAgICAgICAgICAgdGhpcy50aHJlYWROYW1lID0gdGhyZWFkTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRUaHJlYWROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHRocmVhZE5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlciBvYmplY3QgZm9yIHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlKHMpIG5hbWUocyksIGJvdGggcmVzb2x2ZWQgZnJvbSBkaXJlY3RseSBpbmplY3RlZCBzZXJ2aWNlIGFuZCB2aWEgcHJvdmlkZXIuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFNjaGVkdWxlclRocmVhZE5hbWUgeworICAgICAgICBwcml2YXRlIFN0cmluZyB0aHJlYWROYW1lRnJvbVNlcnZpY2U7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRocmVhZE5hbWVGcm9tUHJvdmlkZXI7CisKKyAgICAgICAgU2NoZWR1bGVyVGhyZWFkTmFtZShTdHJpbmcgdGhyZWFkTmFtZUZyb21TZXJ2aWNlLCBTdHJpbmcgdGhyZWFkTmFtZUZyb21Qcm92aWRlcikgeworICAgICAgICAgICAgdGhpcy50aHJlYWROYW1lRnJvbVNlcnZpY2UgPSB0aHJlYWROYW1lRnJvbVNlcnZpY2U7CisgICAgICAgICAgICB0aGlzLnRocmVhZE5hbWVGcm9tUHJvdmlkZXIgPSB0aHJlYWROYW1lRnJvbVByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdldFRocmVhZE5hbWVGcm9tU2VydmljZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aHJlYWROYW1lRnJvbVNlcnZpY2U7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZ2V0VGhyZWFkTmFtZUZyb21Qcm92aWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiB0aHJlYWROYW1lRnJvbVByb3ZpZGVyOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIHJlYWRlciwgdGhhdCBjaGVja3MgaXRzIG93biB0aHJlYWQncyBuYW1lIGFuZCByZXR1cm5zIGl0IGFzIGFuIGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRocmVhZE5hbWVSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxUaHJlYWROYW1lPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVGhyZWFkTmFtZSByZWFkRnJvbShDbGFzczxUaHJlYWROYW1lPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBUaHJlYWROYW1lKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSByZWFkZXIsIHRoYXQgc2NoZWR1bGVzIG9uZSB0YXNrIG9uIGVhY2ggaW5qZWN0ZWQgc2NoZWR1bGVyIChkaXJlY3RseSBhbmQgdmlhIHByb3ZpZGVyKSBhbmQgcmV0dXJucyB0aGUgbmFtZXMgb2YKKyAgICAgKiB0aGUgdGhyZWFkcyB0aGF0IGV4ZWN1dGVkIHRob3NlIHRhc2tzIGFzIGFuIGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNjaGVkdWxlclRocmVhZE5hbWVSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxTY2hlZHVsZXJUaHJlYWROYW1lPiB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlciBpbmplY3RlZFByb3ZpZGVyOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGluamVjdGVkU2VydmljZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTY2hlZHVsZXJUaHJlYWROYW1lIHJlYWRGcm9tKENsYXNzPFNjaGVkdWxlclRocmVhZE5hbWU+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPiBuYW1lRnJvbVNlcnZpY2UgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IG5hbWVGcm9tUHJvdmlkZXIgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGNkbCA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKworICAgICAgICAgICAgaW5qZWN0ZWRTZXJ2aWNlLnNjaGVkdWxlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBuYW1lRnJvbVNlcnZpY2Uuc2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjZGwuY291bnREb3duKCk7CisgICAgICAgICAgICB9LCAxLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCisgICAgICAgICAgICBpbmplY3RlZFByb3ZpZGVyLmdldEV4ZWN1dG9yU2VydmljZSgpLnNjaGVkdWxlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBuYW1lRnJvbVByb3ZpZGVyLnNldChUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY2RsLmNvdW50RG93bigpOworICAgICAgICAgICAgfSwgMSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjZGwuYXdhaXQoMjAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIG5hbWVGcm9tU2VydmljZS5zZXQoImZhaWxlZCIpOworICAgICAgICAgICAgICAgIG5hbWVGcm9tUHJvdmlkZXIuc2V0KCJmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBTY2hlZHVsZXJUaHJlYWROYW1lKG5hbWVGcm9tU2VydmljZS5nZXQoKSwgbmFtZUZyb21Qcm92aWRlci5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VkQ2xpZW50RXhlY3V0b3IoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvZXhlY3V0b3IiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImZvby1leGVjdXRvci1zZXJ2aWNlLTAiLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFuYWdlZENsaWVudFNjaGVkdWxlZEV4ZWN1dG9yKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L3NjaGVkdWxlZEV4ZWN1dG9yIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJiYXItZXhlY3V0b3Itc2VydmljZSBiYXItZXhlY3V0b3Itc2VydmljZSIsIHJlc3BvbnNlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlKTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9NZXNzYWdlQm9keVByb3ZpZGVyc0V4Y2VwdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9NZXNzYWdlQm9keVByb3ZpZGVyc0V4Y2VwdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNjE1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01lc3NhZ2VCb2R5UHJvdmlkZXJzRXhjZXB0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogSkVSU0VZLTI1MDAgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIFRlc3RzLCB0aGF0IGNvcnJlY3QgZXhjZXB0aW9ucyBhcmUgdGhyb3duIGluIGNhc2Ugbm8gTWVzc2FnZUJvZHlQcm92aWRlciB3YXMgbWF0Y2hlZCBvbiBzZXJ2ZXIuCisgKgorICogLSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIGZvciBNQlcgKEpTUjMzOSwgY2hhcHRlciA0LjIuMiwgc3RlcCA3KQorICogLSBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZm9yIE1CUiAoSlNSMzM5LCBjaGFwdGVyIDQuMi4xLCBzdGVwIDYpCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlQcm92aWRlcnNFeGNlcHRpb25zVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTWVzc2FnZUJvZHlQcm92aWRlcnNFeGNlcHRpb25zVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBXZWJBcHBFeGNlcHRpb25NYXBwZXIuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIndyaXRlIikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgUmVzb3VyY2UgZmFpbE9uV3JpdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJyZWFkIikKKyAgICAgICAgQENvbnN1bWVzKCJmb28vYmFyIikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGZhaWxPblJlYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gInRoaXMtc2hvdWxkLW5ldmVyLWJlLXJldHVybmVkIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2ViQXBwRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgTE9HR0VSLmZpbmUoIkV4Y2VwdGlvbk1hcHBlciB3YXMgaW52b2tlZC4iKTsKKyAgICAgICAgICAgIC8vIHJldHVybiB0aGUgZXhjZXB0aW9uIGNsYXNzIG5hbWUgYXMgYW4gZW50aXR5IGZvciBmdXJ0aGVyIGNvbXBhcmlzb24KKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoMjAwKS5oZWFkZXIoIndyaXRlci1leGNlcHRpb24iLCAiYWZ0ZXItZmlyc3QtYnl0ZSIpLmVudGl0eShleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGVyVGhyb3dzQ29ycmVjdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS93cml0ZSIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIFN0cmluZyByZXNTdHJpbmcgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIC8vIG5vIE1CVyBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kLCBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIGV4cGVjdGVkCisgICAgICAgIGFzc2VydEVxdWFscygiamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiIsIHJlc1N0cmluZyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVyVGhyb3dzQ29ycmVjdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9yZWFkIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiSGVsbG8sIHdvcmxkIiwgInRleHQvcGxhaW4iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIHJlc1N0cmluZyA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgLy8gbm8gTUJSIHNob3VsZCBoYXZlIGJlZW4gZm91bmQsIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHBlY3RlZAorICAgICAgICBhc3NlcnRFcXVhbHMoImphdmF4LndzLnJzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbiIsIHJlc1N0cmluZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTWV0YWluZlNlcnZpY2VzTG9va3VwRGlzYWJsZWRUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9NZXRhaW5mU2VydmljZXNMb29rdXBEaXNhYmxlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM1MTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTWV0YWluZlNlcnZpY2VzTG9va3VwRGlzYWJsZWRUZXN0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFByb3BlcnR5IHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI01FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEV9IElTIHNldC4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWV0YWluZlNlcnZpY2VzTG9va3VwRGlzYWJsZWRUZXN0IGV4dGVuZHMgQWJzdHJhY3REaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEdldCg1MDAsIDQxNSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSAoUmVzb3VyY2VDb25maWcpIHN1cGVyLmNvbmZpZ3VyZSgpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUsIHRydWUpOworCisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01ldGFpbmZTZXJ2aWNlc0xvb2t1cEVuYWJsZWRUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9NZXRhaW5mU2VydmljZXNMb29rdXBFbmFibGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NThmMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9NZXRhaW5mU2VydmljZXNMb29rdXBFbmFibGVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFByb3BlcnR5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyNNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFfSBpcyBOT1Qgc2V0LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhaW5mU2VydmljZXNMb29rdXBFbmFibGVkVGVzdCBleHRlbmRzIEFic3RyYWN0RGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cFRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RHZXQoMjAwLCAyMDApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTW9kZWxQcm9jZXNzb3JUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Nb2RlbFByb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGMxYzhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTW9kZWxQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk9QVElPTlM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5Db25jdXJyZW50UnVubmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IG1vZGVsIHByb2Nlc3Nvci4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIE1vZGVsUHJvY2Vzc29yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2RlbFByb2Nlc3NvckZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoU2ltcGxlTW9kZWxQcm9jZXNzb3IuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVNb2RlbFByb2Nlc3NvciBpbXBsZW1lbnRzIE1vZGVsUHJvY2Vzc29yIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBwcm9jZXNzUmVzb3VyY2VNb2RlbChSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgICAgIFJlc291cmNlTW9kZWwuQnVpbGRlciBtb2RlbEJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VNb2RlbC5CdWlsZGVyKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSBtb2RlbFJlc291cmNlID0gUmVzb3VyY2UuZnJvbShNb2RlbFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBtb2RlbEJ1aWxkZXIuYWRkUmVzb3VyY2UobW9kZWxSZXNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VNb2RlbC5nZXRSb290UmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBlbmhhbmNlUmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBtb2RlbEJ1aWxkZXIuYWRkUmVzb3VyY2UobmV3UmVzb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbEJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBSZXNvdXJjZSBlbmhhbmNlUmVzb3VyY2UoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc0J1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIG9wdGlvbnNGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgOiByZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VNZXRob2QuZ2V0SHR0cE1ldGhvZCgpLmVxdWFscygiT1BUSU9OUyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb3B0aW9uc0ZvdW5kKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzQnVpbGRlci5hZGRNZXRob2QoIk9QVElPTlMiKS5wcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGFpbmVyUmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIE9iamVjdD4gaW5mbGVjdG9yID0gbmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgT2JqZWN0PigpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIm15LXJlc291cmNlOiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGF0aCA9PSBudWxsID8gIjxuby1wYXRoPiIgOiBwYXRoICsgIiwiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHNvcnRSZXNvdXJjZU1ldGhvZHMocmVzb3VyY2UuZ2V0UmVzb3VyY2VNZXRob2RzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHJlc291cmNlTWV0aG9kLmdldEh0dHBNZXRob2QoKSkuYXBwZW5kKCI9IikuYXBwZW5kKCIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpLmdldE5hbWUoKSkuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICByZXNCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoIm15LXJlc291cmNlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAucHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkoaW5mbGVjdG9yKS5idWlsZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc0J1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBwcm9jZXNzU3ViUmVzb3VyY2UoUmVzb3VyY2VNb2RlbCBzdWJSZXNvdXJjZSwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSBlbmhhbmNlUmVzb3VyY2Uoc3ViUmVzb3VyY2UuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlTW9kZWwuQnVpbGRlcih0cnVlKS5hZGRSZXNvdXJjZShyZXNvdXJjZSkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJtb2RlbCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9kZWxSZXNvdXJjZSB7CisKKyAgICAgICAgICAgIEBDb250ZXh0CisgICAgICAgICAgICBFeHRlbmRlZFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCA9IHJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZU1vZGVsKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgTGlzdDxSZXNvdXJjZT4gc29ydGVkUmVzb3VyY2VzID0gcmVzb3VyY2VNb2RlbC5nZXRSb290UmVzb3VyY2VzKCk7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRSZXNvdXJjZXMsIG5ldyBDb21wYXJhdG9yPFJlc291cmNlPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShSZXNvdXJjZSBvMSwgUmVzb3VyY2UgbzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoMSA9IG8xLmdldFBhdGgoKSA9PSBudWxsID8gIiIgOiBvMS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aDIgPSBvMi5nZXRQYXRoKCkgPT0gbnVsbCA/ICIiIDogbzIuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgxLmNvbXBhcmVUbyhwYXRoMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogc29ydGVkUmVzb3VyY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gcmVzb3VyY2UuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocGF0aCA9PSBudWxsID8gIjxuby1wYXRoPiIgOiBwYXRoKS5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8UmVzb3VyY2VNZXRob2Q+IHNvcnRSZXNvdXJjZU1ldGhvZHMoTGlzdDxSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzKSB7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNZXRob2Q+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4ocmVzb3VyY2VNZXRob2RzKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChuZXdMaXN0LCAobzEsIG8yKSAtPiBvMS5nZXRIdHRwTWV0aG9kKCkuY29tcGFyZVRvKG8yLmdldEh0dHBNZXRob2QoKSkpOworICAgICAgICByZXR1cm4gbmV3TGlzdDsKKyAgICB9CisKKyAgICBAUGF0aCgiYSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUEgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGcm9tQSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiYS1nZXQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0RnJvbUEoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuICJhLXBvc3QiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY2hpbGQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkKCkgeworICAgICAgICAgICAgcmV0dXJuICJhLWNoaWxkLWdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9yRnJvbUEoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJvbVN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuICJzdWItZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJiIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQiB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZyb21CKCkgeworICAgICAgICAgICAgcmV0dXJuICJiLWdldCI7CisgICAgICAgIH0KKworICAgICAgICBAT1BUSU9OUworICAgICAgICBwdWJsaWMgU3RyaW5nIG9wdGlvbnNGcm9tQigpIHsKKyAgICAgICAgICAgIHJldHVybiAiYi1vcHRpb25zIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsb2NhdG9yIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGxvY2F0b3JGcm9tQigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlQS5jbGFzcywgUmVzb3VyY2VCLmNsYXNzLCBNb2RlbFByb2Nlc3NvckZlYXR1cmUuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQUdldCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYS1nZXQiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQVBvc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLXBvc3QiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQU9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYSIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBQ2hpbGRHZXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYS9jaGlsZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEtY2hpbGQtZ2V0IiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFMb2NhdG9yR2V0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2EvbG9jYXRvciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN1Yi1nZXQiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQUxvY2F0b3JPcHRpb25zKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2EvbG9jYXRvciIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUJHZXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImItZ2V0IiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUJPcHRpb25zKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2IiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLm9wdGlvbnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImItb3B0aW9ucyIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VCTG9jYXRvckdldCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9iL2xvY2F0b3IiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWItZ2V0IiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUJMb2NhdG9yT3B0aW9ucygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9iL2xvY2F0b3IiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLm9wdGlvbnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBTXlSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hL215LXJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygibXktcmVzb3VyY2U6YSxHRVQ9Z2V0RnJvbUF8UE9TVD1wb3N0RnJvbUF8IiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFMb2NhdG9yTXlSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hL2xvY2F0b3IvbXktcmVzb3VyY2UiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygibXktcmVzb3VyY2U6PG5vLXBhdGg+R0VUPWdldEZyb21TdWJSZXNvdXJjZXwiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQk15UmVzb3VyY2UoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYi9teS1yZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm15LXJlc291cmNlOmIsR0VUPWdldEZyb21CfE9QVElPTlM9b3B0aW9uc0Zyb21CfCIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9tb2RlbCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImF8Ynxtb2RlbHwiLCBlbnRpdHkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTmFtZUJpbmRpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9OYW1lQmluZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE3NDBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTmFtZUJpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5Db25jdXJyZW50UnVubmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3Qtc3VpdGUgZW5zdXJpbmcgdGhlIGNvcnJlY3QgZnVuY3Rpb25hbGl0eSBvZiBuYW1lIGJpbmRpbmcuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgTmFtZUJpbmRpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBGb29SZXNvdXJjZS5jbGFzcywgQmFyUmVzb3VyY2UuY2xhc3MsIEZvb0JhclJlc291cmNlLmNsYXNzLCBGb29GaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgQmFyRmlsdGVyLmNsYXNzLCBGb29CYXJGaWx0ZXIuY2xhc3MsIFByZU1hdGNoaW5nRm9vRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBub0JpbmRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIm5vQmluZGluZyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBGb29CaW5kaW5nCisgICAgICAgIEBQYXRoKCJmb28iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGZvbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiZm9vIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQEJhckJpbmRpbmcKKyAgICAgICAgQFBhdGgoImJhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYmFyKCkgeworICAgICAgICAgICAgcmV0dXJuICJiYXIiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBARm9vQmluZGluZworICAgICAgICBAQmFyQmluZGluZworICAgICAgICBAUGF0aCgiZm9vYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBmb29iYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImZvb2JhciI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJwcmVNYXRjaGluZ05hbWVCaW5kaW5nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwcmVNYXRjaGluZ05hbWVCaW5kaW5nKEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgQERlZmF1bHRWYWx1ZSgiYmFyIikgZmluYWwgU3RyaW5nIGhlYWRlcikgeworICAgICAgICAgICAgcmV0dXJuIGhlYWRlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBGb29CaW5kaW5nIHsKKworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBCYXJCaW5kaW5nIHsKKworICAgIH0KKworICAgIEBGb29CaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29GaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzCisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgImNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByZU1hdGNoaW5nCisgICAgQEZvb0JpbmRpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZU1hdGNoaW5nRm9vRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoImhlYWRlciIsICJmb28iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCYXJCaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXJGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzCisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgImNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQEZvb0JpbmRpbmcKKyAgICBAQmFyQmluZGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vQmFyRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cworICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksICJjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gRklMVEVSUyA9IGluaXRpYWxpemUoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFNldDxDbGFzczw/Pj4gaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBzZXQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIHNldC5hZGQoRm9vRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgc2V0LmFkZChCYXJGaWx0ZXIuY2xhc3MpOworICAgICAgICBzZXQuYWRkKEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgICAgIHJldHVybiBzZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2FsbGVkKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBDbGFzczw/Pi4uLiBmaWx0ZXJzVGhhdFNob3VsZEJlQ2FsbGVkKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gcG9zaXRpdmVGaWx0ZXJzID0gQXJyYXlzLnN0cmVhbShmaWx0ZXJzVGhhdFNob3VsZEJlQ2FsbGVkKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8Pz4gZmlsdGVyIDogRklMVEVSUykgeworICAgICAgICAgICAgaWYgKHBvc2l0aXZlRmlsdGVycy5jb250YWlucyhmaWx0ZXIpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaWx0ZXIgJyIgKyBmaWx0ZXIuZ2V0U2ltcGxlTmFtZSgpICsgIicgc2hvdWxkIGJlIGNhbGxlZC4iLCAiY2FsbGVkIiwgcmVzcG9uc2UuZ2V0SGVhZGVycygpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Rmlyc3QoZmlsdGVyLmdldFNpbXBsZU5hbWUoKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKCJGaWx0ZXIgJyIgKyBmaWx0ZXIuZ2V0U2ltcGxlTmFtZSgpICsgIicgc2hvdWxkIG5vdCBiZSBjYWxsZWQuIiwgcmVzcG9uc2UuZ2V0SGVhZGVycygpLmdldChmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUmVzcG9uc2UgX2dldFJlc3BvbnNlKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTm9CaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoInJlc291cmNlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlRm9vQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJyZXNvdXJjZS9mb28iKSwgRm9vRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjczOS4gTmFtZSBib3VuZCBhbm5vdGF0aW9uIG9uIGEgcHJlLW1hdGNoaW5nIGZpbHRlciBzaG91bGQgYmUgaWdub3JlZCBhbmQgdGhlIGZpbHRlciBzaG91bGQgYmUKKyAgICAgKiBpbnZva2VkIGZvciBlYWNoIHJlc291cmNlIG1ldGhvZCAoZ2xvYmFsbHkpLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJlTWF0Y2hpbmdOYW1lQmluZGluZygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBfZ2V0UmVzcG9uc2UoInJlc291cmNlL3ByZU1hdGNoaW5nTmFtZUJpbmRpbmciKTsKKworICAgICAgICAvLyBSZXF1ZXN0IGZpbHRlciAtIGFwcGxpZWQsIGV2ZW4gd2hlbiB0aGUgZmlsdGVyIGlzIG5hbWUgYm91bmQgYW5kIHRoZSByZXNvdXJjZSBtZXRob2QgaXMgbm90LgorICAgICAgICBhc3NlcnRUaGF0KCJOYW1lIGJpbmRpbmcgb24gYSBAUHJlTWF0Y2hpbmcgZmlsdGVyIG5vdCBpZ25vcmVkLiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoImZvbyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUJhckJpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgicmVzb3VyY2UvYmFyIiksIEJhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VGb29CYXJCaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoInJlc291cmNlL2Zvb2JhciIpLCBGb29GaWx0ZXIuY2xhc3MsIEJhckZpbHRlci5jbGFzcywgRm9vQmFyRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZm9vLXJlc291cmNlIikKKyAgICBARm9vQmluZGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb29SZXNvdXJjZU5vQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJmb28tcmVzb3VyY2UiKSwgRm9vRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb29SZXNvdXJjZUZvb0JpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgiZm9vLXJlc291cmNlL2ZvbyIpLCBGb29GaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb1Jlc291cmNlQmFyQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJmb28tcmVzb3VyY2UvYmFyIiksIEZvb0ZpbHRlci5jbGFzcywgQmFyRmlsdGVyLmNsYXNzLCBGb29CYXJGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb1Jlc291cmNlRm9vQmFyQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJmb28tcmVzb3VyY2UvZm9vYmFyIiksIEZvb0ZpbHRlci5jbGFzcywgQmFyRmlsdGVyLmNsYXNzLCBGb29CYXJGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJiYXItcmVzb3VyY2UiKQorICAgIEBCYXJCaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXJSZXNvdXJjZSBleHRlbmRzIFJlc291cmNlIHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhclJlc291cmNlTm9CaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImJhci1yZXNvdXJjZSIpLCBCYXJGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhclJlc291cmNlRm9vQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJiYXItcmVzb3VyY2UvZm9vIiksIEJhckZpbHRlci5jbGFzcywgRm9vRmlsdGVyLmNsYXNzLCBGb29CYXJGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhclJlc291cmNlQmFyQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJiYXItcmVzb3VyY2UvYmFyIiksIEJhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFyUmVzb3VyY2VGb29CYXJCaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImJhci1yZXNvdXJjZS9mb29iYXIiKSwgQmFyRmlsdGVyLmNsYXNzLCBGb29GaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoImZvb2Jhci1yZXNvdXJjZSIpCisgICAgQEJhckJpbmRpbmcKKyAgICBARm9vQmluZGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vQmFyUmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb29CYXJSZXNvdXJjZU5vQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJmb29iYXItcmVzb3VyY2UiKSwgQmFyRmlsdGVyLmNsYXNzLCBGb29GaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9vQmFyUmVzb3VyY2VGb29CaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImZvb2Jhci1yZXNvdXJjZS9mb28iKSwgQmFyRmlsdGVyLmNsYXNzLCBGb29GaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9vQmFyUmVzb3VyY2VCYXJCaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImZvb2Jhci1yZXNvdXJjZS9iYXIiKSwgQmFyRmlsdGVyLmNsYXNzLCBGb29GaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9vQmFyUmVzb3VyY2VGb29CYXJCaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImZvb2Jhci1yZXNvdXJjZS9mb29iYXIiKSwgQmFyRmlsdGVyLmNsYXNzLCBGb29GaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXJhbUNvbnZlcnRlclByaW9yaXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGFyYW1Db252ZXJ0ZXJQcmlvcml0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTA1NTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGFyYW1Db252ZXJ0ZXJQcmlvcml0eVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW5PckVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy50eXBlQ29tcGF0aWJsZVdpdGg7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBhcmFtQ29udmVydGVyUHJpb3JpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PENsYXNzPD8gZXh0ZW5kcyBQYXJhbUNvbnZlcnRlclByb3ZpZGVyPj4gQ09OVkVSVEVSX1BST1ZJREVSX0NBTExfT1JERVIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUGFyYW1Db252ZXJ0ZXJQcmlvcml0eVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15UGFyYW1Db252ZXJ0ZXJQcm92aWRlcjEuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlQYXJhbUNvbnZlcnRlclByb3ZpZGVyMi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeVBhcmFtQ29udmVydGVyUHJvdmlkZXIzLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucXVlcnlQYXJhbSgidGVzdCIsICJ2YWx1ZSIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KENPTlZFUlRFUl9QUk9WSURFUl9DQUxMX09SREVSLnNpemUoKSwgZ3JlYXRlclRoYW5PckVxdWFsVG8oMykpOworICAgICAgICBhc3NlcnRUaGF0KENPTlZFUlRFUl9QUk9WSURFUl9DQUxMX09SREVSLmdldCgwKSwgdHlwZUNvbXBhdGlibGVXaXRoKE15UGFyYW1Db252ZXJ0ZXJQcm92aWRlcjIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChDT05WRVJURVJfUFJPVklERVJfQ0FMTF9PUkRFUi5nZXQoMSksIHR5cGVDb21wYXRpYmxlV2l0aChNeVBhcmFtQ29udmVydGVyUHJvdmlkZXIxLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoQ09OVkVSVEVSX1BST1ZJREVSX0NBTExfT1JERVIuZ2V0KDIpLCB0eXBlQ29tcGF0aWJsZVdpdGgoTXlQYXJhbUNvbnZlcnRlclByb3ZpZGVyMy5jbGFzcykpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyUHJpb3JpdHlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAUXVlcnlQYXJhbSgidGVzdCIpIFN0cmluZyBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIHBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDIwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UGFyYW1Db252ZXJ0ZXJQcm92aWRlcjEgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKENsYXNzPFQ+IHJhd1R5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgQ09OVkVSVEVSX1BST1ZJREVSX0NBTExfT1JERVIuYWRkKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgxMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVBhcmFtQ29udmVydGVyUHJvdmlkZXIyIGltcGxlbWVudHMgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihDbGFzczxUPiByYXdUeXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIENPTlZFUlRFUl9QUk9WSURFUl9DQUxMX09SREVSLmFkZCh0aGlzLmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMzAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlQYXJhbUNvbnZlcnRlclByb3ZpZGVyMyBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoQ2xhc3M8VD4gcmF3VHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBDT05WRVJURVJfUFJPVklERVJfQ0FMTF9PUkRFUi5hZGQodGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGFyYW1Db252ZXJ0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXJhbUNvbnZlcnRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWY2YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGFyYW1Db252ZXJ0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdHMge0BsaW5rIFBhcmFtQ29udmVydGVyIHBhcmFtIGNvbnZlcnRlcnN9IGFzIGUyZSB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgTXlQYXJhbVByb3ZpZGVyLmNsYXNzLCBNeVN0cmluZ1BhcmFtUHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE15QmVhblBhcmFtKCkgeworICAgICAgICBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJmb3JtIiwgImZvcm1QYXJhbSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnBhdGgoInJlc291cmNlL215QmVhbiIpLnBhdGgoInBhdGhQYXJhbSIpCisgICAgICAgICAgICAgICAgLm1hdHJpeFBhcmFtKCJtYXRyaXgiLCAibWF0cml4UGFyYW0iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJxdWVyeVBhcmFtIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiaGVhZGVyIiwgImhlYWRlclBhcmFtIikKKyAgICAgICAgICAgICAgICAuY29va2llKCJjb29raWUiLCAiY29va2llUGFyYW0iKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZm9ybSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0ciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqcGF0aFBhcmFtKl8qbWF0cml4UGFyYW0qXypxdWVyeVBhcmFtKl8qaGVhZGVyUGFyYW0qXypjb29raWVQYXJhbSpfKmZvcm1QYXJhbSoiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpc3RPZk15QmVhblBhcmFtKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL215QmVhbi9saXN0IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJBIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJCIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJDIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIipBKipCKipDKiIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0T2ZNeUJlYW5QYXJhbSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9teUJlYW4vc2V0IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJBIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJCIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJDIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHN0ciwgY29udGFpbnNTdHJpbmcoIipBKiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdHIsIGNvbnRhaW5zU3RyaW5nKCIqQioiKSk7CisgICAgICAgIGFzc2VydFRoYXQoc3RyLCBjb250YWluc1N0cmluZygiKkMqIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldE9mTXlCZWFuUGFyYW0oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbXlCZWFuL3NvcnRlZHNldCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInEiLCAiQSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInEiLCAiQiIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInEiLCAiQyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0ciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqQSoqQioqQyoiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1BhcmFtKCkgeworICAgICAgICBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJmb3JtIiwgImZvcm1QYXJhbSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnBhdGgoInJlc291cmNlL3N0cmluZyIpLnBhdGgoInBhdGhQYXJhbSIpCisgICAgICAgICAgICAgICAgLm1hdHJpeFBhcmFtKCJtYXRyaXgiLCAibWF0cml4UGFyYW0iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJxdWVyeVBhcmFtIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiaGVhZGVyIiwgImhlYWRlclBhcmFtIikKKyAgICAgICAgICAgICAgICAuY29va2llKCJjb29raWUiLCAiY29va2llUGFyYW0iKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZm9ybSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0ciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCItcGF0aFBhcmFtLV8tbWF0cml4UGFyYW0tXy1xdWVyeVBhcmFtLV8taGVhZGVyUGFyYW0tXy1jb29raWVQYXJhbS1fLWZvcm1QYXJhbS0iLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiVE9ETzogUGFyYW1Db252ZXJzaW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gdGhlIFJlc3BvbnNlQnVpbGRlciAoSkVSU0VZLTEzODUpLiIpCisgICAgLy8gVE9ETzogSkVSU0VZLTEzODU6IGFmdGVyIGNsYXJpZnlpbmcgd2l0aCBzcGVjIHRoZSBSZXNwb25zZUJ1aWxkZXIgcGFyYW1jb252ZXJzaW9uIHNob3VsZCBiZSBmaW5pc2hlZCAob3IgcmVtb3ZlZCkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUGFyYW1JblJlc3BvbnNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3Jlc3BvbnNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi06cmVzLWhlYWQ6LSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygicmVzcG9uc2UtaGVhZGVyIikpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlCZWFuRm9ybVBhcmFtRGVmYXVsdCgpIHsKKyAgICAgICAgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9teUJlYW5Gb3JtRGVmYXVsdCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoZm9ybSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisgICAgICAgIFN0cmluZyBzdHIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKmZvcm0tZGVmYXVsdCoiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE15QmVhblF1ZXJ5UGFyYW1EZWZhdWx0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL215QmVhblF1ZXJ5RGVmYXVsdCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0ciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqcXVlcnktZGVmYXVsdCoiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE15QmVhbk1hdHJpeFBhcmFtRGVmYXVsdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9teUJlYW5NYXRyaXhEZWZhdWx0IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiptYXRyaXgtZGVmYXVsdCoiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE15QmVhbkNvb2tpZVBhcmFtRGVmYXVsdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9teUJlYW5Db29raWVEZWZhdWx0IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIipjb29raWUtZGVmYXVsdCoiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE15QmVhbkhlYWRlclBhcmFtRGVmYXVsdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9teUJlYW5IZWFkZXJEZWZhdWx0IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIipoZWFkZXItZGVmYXVsdCoiLCBzdHIpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm15QmVhbi97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RNeUJlYW4oQFBhdGhQYXJhbSgicGF0aCIpIE15QmVhbiBwYXRoUGFyYW0sIEBNYXRyaXhQYXJhbSgibWF0cml4IikgTXlCZWFuIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpIE15QmVhbiBxdWVyeSwgQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBNeUJlYW4gaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJjb29raWUiKSBNeUJlYW4gY29va2llLCBARm9ybVBhcmFtKCJmb3JtIikgTXlCZWFuIGZvcm0pIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoUGFyYW0uZ2V0VmFsdWUoKSArICJfIiArIG1hdHJpeC5nZXRWYWx1ZSgpICsgIl8iICsgcXVlcnkuZ2V0VmFsdWUoKSArICJfIiArIGhlYWRlci5nZXRWYWx1ZSgpICsgIl8iCisgICAgICAgICAgICAgICAgICAgICsgY29va2llLmdldFZhbHVlKCkgKyAiXyIgKyBmb3JtLmdldFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJteUJlYW4vbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE15QmVhbihAUXVlcnlQYXJhbSgicSIpIExpc3Q8TXlCZWFuPiBxdWVyeSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKE15QmVhbiBiZWFuIDogcXVlcnkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYmVhbi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJteUJlYW4vc2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0TXlCZWFuKEBRdWVyeVBhcmFtKCJxIikgU2V0PE15QmVhbj4gcXVlcnkpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChNeUJlYW4gYmVhbiA6IHF1ZXJ5KSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJlYW4uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibXlCZWFuL3NvcnRlZHNldCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE15QmVhbihAUXVlcnlQYXJhbSgicSIpIFNvcnRlZFNldDxNeUJlYW4+IHF1ZXJ5KSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoTXlCZWFuIGJlYW4gOiBxdWVyeSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChiZWFuLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJteUJlYW5Gb3JtRGVmYXVsdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE15QmVhbkZvcm1EZWZhdWx0KEBEZWZhdWx0VmFsdWUoImZvcm0tZGVmYXVsdCIpIEBGb3JtUGFyYW0oImZvcm0iKSBNeUJlYW4gcGF0aFBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aFBhcmFtLmdldFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJteUJlYW5RdWVyeURlZmF1bHQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE15QmVhblF1ZXJ5RGVmYXVsdChARGVmYXVsdFZhbHVlKCJxdWVyeS1kZWZhdWx0IikgQFF1ZXJ5UGFyYW0oInEiKSBNeUJlYW4gcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW0uZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm15QmVhbk1hdHJpeERlZmF1bHQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE15QmVhbk1hdHJpeERlZmF1bHQoQERlZmF1bHRWYWx1ZSgibWF0cml4LWRlZmF1bHQiKSBATWF0cml4UGFyYW0oIm0iKSBNeUJlYW4gbWF0cml4UGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRyaXhQYXJhbS5nZXRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibXlCZWFuQ29va2llRGVmYXVsdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXlCZWFuQ29va2llRGVmYXVsdChARGVmYXVsdFZhbHVlKCJjb29raWUtZGVmYXVsdCIpIEBDb29raWVQYXJhbSgiYyIpIE15QmVhbiBjb29raWVQYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIGNvb2tpZVBhcmFtLmdldFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJteUJlYW5IZWFkZXJEZWZhdWx0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNeUJlYW5IZWFkZXJEZWZhdWx0KEBEZWZhdWx0VmFsdWUoImhlYWRlci1kZWZhdWx0IikgQEhlYWRlclBhcmFtKCJoIikgTXlCZWFuIGhlYWRlclBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyUGFyYW0uZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzdHJpbmcve3BhdGh9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0U3RyaW5nKEBQYXRoUGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aFBhcmFtLCBATWF0cml4UGFyYW0oIm1hdHJpeCIpIFN0cmluZyBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKSBTdHJpbmcgcXVlcnksIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgU3RyaW5nIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiY29va2llIikgU3RyaW5nIGNvb2tpZSwgQEZvcm1QYXJhbSgiZm9ybSIpIFN0cmluZyBmb3JtKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aFBhcmFtICsgIl8iICsgbWF0cml4ICsgIl8iICsgcXVlcnkgKyAiXyIgKyBoZWFkZXIgKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgKyBjb29raWUgKyAiXyIgKyBmb3JtOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeSkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5oZWFkZXIoInJlc3BvbnNlLWhlYWRlciIsICJyZXMtaGVhZCIpLmVudGl0eSgiYW55dGhpbmciKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVBhcmFtUHJvdmlkZXIgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKENsYXNzPFQ+IHJhd1R5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKHJhd1R5cGUgIT0gTXlCZWFuLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoUGFyYW1Db252ZXJ0ZXI8VD4pIG5ldyBQYXJhbUNvbnZlcnRlcjxNeUJlYW4+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE15QmVhbiBmcm9tU3RyaW5nKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE15QmVhbiBteUJlYW4gPSBuZXcgTXlCZWFuKCk7CisgICAgICAgICAgICAgICAgICAgIG15QmVhbi5zZXRWYWx1ZSgiKiIgKyB2YWx1ZSArICIqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBteUJlYW47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhNeUJlYW4gYmVhbikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiKjoiICsgYmVhbi5nZXRWYWx1ZSgpICsgIjoqIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U3RyaW5nUGFyYW1Qcm92aWRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoQ2xhc3M8VD4gcmF3VHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAocmF3VHlwZSAhPSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIChQYXJhbUNvbnZlcnRlcjxUPikgbmV3IFBhcmFtQ29udmVydGVyPFN0cmluZz4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGZyb21TdHJpbmcoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItIiArIHZhbHVlICsgIi0iOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiLToiICsgc3RyICsgIjotIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QmVhbiBpbXBsZW1lbnRzIENvbXBhcmFibGU8TXlCZWFuPiB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk15QmVhbnsiCisgICAgICAgICAgICAgICAgICAgICsgInZhbHVlPSciICsgdmFsdWUgKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE15QmVhbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE15QmVhbiBteUJlYW4gPSAoTXlCZWFuKSBvOworCisgICAgICAgICAgICByZXR1cm4gISh2YWx1ZSAhPSBudWxsID8gIXZhbHVlLmVxdWFscyhteUJlYW4udmFsdWUpIDogbXlCZWFuLnZhbHVlICE9IG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmhhc2hDb2RlKCkgOiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE15QmVhbiBvKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUuY29tcGFyZVRvKG8udmFsdWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGF0aEVuY29kaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGF0aEVuY29kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YWJjYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXRoRW5jb2RpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdGluZyBlbmNvZGluZyBvZiB7QFBhdGggcGF0aCBhbm5vdGF0aW9uc30uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgUGF0aEVuY29kaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUGVyY2VudEVuY29kZWRUZXN0LmNsYXNzLCBBc3Rlcmlza1Jlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIm9rIiwgdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoIltdIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIm9rIiwgdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoIiU1YiU1ZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvayIsIHRhcmdldCgpLnBhdGgoInRlc3QiKS5wYXRoKCIlNWIlNUQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXgxKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImEtb2siLCB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgidGVzdC9hL1tdIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4MigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLW9rIiwgdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoInRlc3QvYS8lNWIlNUQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXgzKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgidGVzdC9hL3BhdGgvJTViJTVkIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEtb2siLCByZXMucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoInRlc3QvYS9wYXRoLyU1YWIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleDQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiYS1vayIsIHRhcmdldCgpLnBhdGgoInRlc3QiKS5wYXRoKCJ0ZXN0L2EvcGF0aC9bXSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xhc2goKSB7CisgICAgICAgIGFzc2VydEVxdWFscygib2siLCB0YXJnZXQoKS5wYXRoKCJ0ZXN0L3NsYXNoLyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dFNsYXNoKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIm9rIiwgdGFyZ2V0KCkucGF0aCgidGVzdC9zbGFzaCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN0ZXJpc2tJblBhdGgoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiKiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9rIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiKiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3Rlcmlza1Jlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAib2siOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyY2VudEVuY29kZWRUZXN0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJbXSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2ltcGxlKCkgeworICAgICAgICAgICAgcmV0dXJuICJvayI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzbGFzaC8iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHNsYXNoKEBDb250ZXh0IFVyaUluZm8gdXJpKSB7CisgICAgICAgICAgICByZXR1cm4gIm9rIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInRlc3Qve2EgOiAuKiB9L1tdIikKKyAgICAgICAgcHVibGljIFN0cmluZyBjb21wbGV4KEBQYXRoUGFyYW0oImEiKSBTdHJpbmcgYSkgeworICAgICAgICAgICAgcmV0dXJuIGEgKyAiLW9rIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInRlc3Qve2EgOiAuKiB9L3BhdGgvJTViJTVEIikKKyAgICAgICAgcHVibGljIFN0cmluZyBjb21wbGV4MihAUGF0aFBhcmFtKCJhIikgU3RyaW5nIGEpIHsKKyAgICAgICAgICAgIHJldHVybiBhICsgIi1vayI7CisgICAgICAgIH0KKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGVyUmVxdWVzdExpZmVjeWNsZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1BlclJlcXVlc3RMaWZlY3ljbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMzQwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1BlclJlcXVlc3RMaWZlY3ljbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmMgSGFkbGV5CisgKi8KK3B1YmxpYyBjbGFzcyBQZXJSZXF1ZXN0TGlmZWN5Y2xlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgLyoqCisgICAgICogRW51bSByZXByZXNlbnRpbmcgdGhlIGFjdHVhbCBzdGF0ZSBvZiB0aGUgcmVzb3VyY2UgaW4gdGhlIGxpZmVjeWNsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBlbnVtIFJlc291cmNlU3RhdGUgeworICAgICAgICBORVcsCisgICAgICAgIENPTlNUUlVDVEVELAorICAgICAgICBERVNUUk9ZRUQKKyAgICB9CisKKyAgICBAUGF0aCgiL3Bvc3QtY29uc3RydWN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvc3RDb25zdHJ1Y3RSZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50OworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgICAgICBwdWJsaWMgUG9zdENvbnN0cnVjdFJlc291cmNlKCkgeworICAgICAgICAgICAgdGhpcy5jb3VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBAUG9zdENvbnN0cnVjdAorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhjb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZVN0YXRlIHByZURlc3Ryb3lTdGF0ZSA9IFJlc291cmNlU3RhdGUuTkVXOworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIHByZURlc3Ryb3lDZGwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBAUGF0aCgicHJlLWRlc3Ryb3kiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlRGVzdHJveVJlc291cmNlIHsKKyAgICAgICAgcHVibGljIFByZURlc3Ryb3lSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBwcmVEZXN0cm95U3RhdGUgPSBSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVEOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZURlc3Ryb3lTdGF0ZS5uYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQsIHByZURlc3Ryb3lTdGF0ZSk7CisgICAgICAgICAgICBwcmVEZXN0cm95U3RhdGUgPSBSZXNvdXJjZVN0YXRlLkRFU1RST1lFRDsKKyAgICAgICAgICAgIHByZURlc3Ryb3lDZGwuY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVmZXJyZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVmZXJyZWRUb1Jlc291cmNlIHsKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2luZ09mUmVzb3VyY2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2luZ09mUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlU3RhdGUgcHJlUG9zdFN0YXRlID0gUmVzb3VyY2VTdGF0ZS5ORVc7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggcHJlUG9zdENkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIEBQYXRoKCJwcmUtcG9zdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVEZXN0cm95UG9zdENvbnN0cnVjdFJlc291cmNlIHsKKworICAgICAgICBAUG9zdENvbnN0cnVjdAorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHByZVBvc3RTdGF0ZSA9IFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlUG9zdFN0YXRlLm5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRCwgcHJlUG9zdFN0YXRlKTsKKyAgICAgICAgICAgIHByZVBvc3RTdGF0ZSA9IFJlc291cmNlU3RhdGUuREVTVFJPWUVEOworICAgICAgICAgICAgcHJlUG9zdENkbC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlU3RhdGUgcHJlUG9zdFByaXZhdGVTdGF0ZSA9IFJlc291cmNlU3RhdGUuTkVXOworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIHByZVBvc3RQcml2YXRlQ2RsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgQFBhdGgoInByZS1wb3N0LXByaXZhdGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlRGVzdHJveVBvc3RDb25zdHJ1Y3RSZXNvdXJjZVByaXZhdGUgeworCisgICAgICAgIEBQb3N0Q29uc3RydWN0CisgICAgICAgIHByaXZhdGUgdm9pZCBwb3N0Q29uc3RydWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHByZVBvc3RQcml2YXRlU3RhdGUgPSBSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVEOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZVBvc3RQcml2YXRlU3RhdGUubmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFByZURlc3Ryb3kKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRCwgcHJlUG9zdFByaXZhdGVTdGF0ZSk7CisgICAgICAgICAgICBwcmVQb3N0UHJpdmF0ZVN0YXRlID0gUmVzb3VyY2VTdGF0ZS5ERVNUUk9ZRUQ7CisgICAgICAgICAgICBwcmVQb3N0UHJpdmF0ZUNkbC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlU3RhdGUgcHJlUG9zdFByb3RlY3RlZFN0YXRlID0gUmVzb3VyY2VTdGF0ZS5ORVc7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggcHJlUG9zdFByb3RlY3RlZENkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIEBQYXRoKCJwcmUtcG9zdC1wcm90ZWN0ZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlRGVzdHJveVBvc3RDb25zdHJ1Y3RSZXNvdXJjZVByb3RlY3RlZCB7CisKKyAgICAgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgcG9zdENvbnN0cnVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBwcmVQb3N0UHJvdGVjdGVkU3RhdGUgPSBSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVEOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZVBvc3RQcm90ZWN0ZWRTdGF0ZS5uYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQsIHByZVBvc3RQcm90ZWN0ZWRTdGF0ZSk7CisgICAgICAgICAgICBwcmVQb3N0UHJvdGVjdGVkU3RhdGUgPSBSZXNvdXJjZVN0YXRlLkRFU1RST1lFRDsKKyAgICAgICAgICAgIHByZVBvc3RQcm90ZWN0ZWRDZGwuY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZVN0YXRlIGluaGVyaXRlZFN0YXRlID0gUmVzb3VyY2VTdGF0ZS5ORVc7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggaW5oZXJpdGVkQ2RsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQb3N0Q29uc3RydWN0UmVzb3VyY2VJbmhlcml0ZWQgeworICAgICAgICBAUG9zdENvbnN0cnVjdAorICAgICAgICBwcml2YXRlIHZvaWQgcG9zdENvbnN0cnVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbmhlcml0ZWRTdGF0ZSA9IFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5oZXJpdGVkU3RhdGUubmFtZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAUGF0aCgiaW5oZXJpdGVkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZURlc3Ryb3lSZXNvdXJjZUluaGVyaXRlZCBleHRlbmRzIFBvc3RDb25zdHJ1Y3RSZXNvdXJjZUluaGVyaXRlZCB7CisKKyAgICAgICAgQFByZURlc3Ryb3kKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRCwgaW5oZXJpdGVkU3RhdGUpOworICAgICAgICAgICAgaW5oZXJpdGVkU3RhdGUgPSBSZXNvdXJjZVN0YXRlLkRFU1RST1lFRDsKKyAgICAgICAgICAgIGluaGVyaXRlZENkbC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVmZXJlbmNpbmdPZlJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAQ29udGV4dCBmaW5hbCBSZXNvdXJjZUNvbnRleHQgcmMpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlZmVycmVkVG9SZXNvdXJjZSByMSA9IHJjLmdldFJlc291cmNlKFJlZmVycmVkVG9SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBSZWZlcnJlZFRvUmVzb3VyY2UgcjIgPSByYy5nZXRSZXNvdXJjZShSZWZlcnJlZFRvUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHIxLCByMik7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFByZURlc3Ryb3lQb3N0Q29uc3RydWN0UmVzb3VyY2UuY2xhc3MsIFByZURlc3Ryb3lQb3N0Q29uc3RydWN0UmVzb3VyY2VQcml2YXRlLmNsYXNzLAorICAgICAgICAgICAgICAgIFByZURlc3Ryb3lQb3N0Q29uc3RydWN0UmVzb3VyY2VQcm90ZWN0ZWQuY2xhc3MsIFByZURlc3Ryb3lSZXNvdXJjZUluaGVyaXRlZC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZWZlcnJlZFRvUmVzb3VyY2UuY2xhc3MsIFByZURlc3Ryb3lSZXNvdXJjZS5jbGFzcywgUG9zdENvbnN0cnVjdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0Q29uc3RydWN0UmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJwb3N0LWNvbnN0cnVjdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZURlc3Ryb3lSZXNvdXJjZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgicHJlLWRlc3Ryb3kiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVELm5hbWUoKSwgcyk7CisgICAgICAgIHByZURlc3Ryb3lDZGwuYXdhaXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlU3RhdGUuREVTVFJPWUVELCBwcmVEZXN0cm95U3RhdGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZmVycmVkVG9SZXNvdXJjZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCB0YXJnZXQoKS5wYXRoKCJyZWZlcnJlZC9zdWIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlRGVzdHJveVBvc3RDcmVhdGVSZXNvdXJjZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgicHJlLXBvc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVELm5hbWUoKSwgcyk7CisgICAgICAgIHByZVBvc3RDZGwuYXdhaXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlU3RhdGUuREVTVFJPWUVELCBwcmVQb3N0U3RhdGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZURlc3Ryb3lQb3N0Q3JlYXRlUmVzb3VyY2VQcml2YXRlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJwcmUtcG9zdC1wcml2YXRlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRC5uYW1lKCksIHMpOworICAgICAgICBwcmVQb3N0UHJpdmF0ZUNkbC5hd2FpdCgxMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5ERVNUUk9ZRUQsIHByZVBvc3RQcml2YXRlU3RhdGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZURlc3Ryb3lQb3N0Q3JlYXRlUmVzb3VyY2VQcm90ZWN0ZWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoInByZS1wb3N0LXByb3RlY3RlZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQubmFtZSgpLCBzKTsKKyAgICAgICAgcHJlUG9zdFByb3RlY3RlZENkbC5hd2FpdCgxMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5ERVNUUk9ZRUQsIHByZVBvc3RQcm90ZWN0ZWRTdGF0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlRGVzdHJveVBvc3RDcmVhdGVSZXNvdXJjZUluaGVyaXRlZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiaW5oZXJpdGVkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRC5uYW1lKCksIHMpOworICAgICAgICBpbmhlcml0ZWRDZGwuYXdhaXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlU3RhdGUuREVTVFJPWUVELCBpbmhlcml0ZWRTdGF0ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUG9zdENvbnN0cnVjdFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1Bvc3RDb25zdHJ1Y3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4MTJiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1Bvc3RDb25zdHJ1Y3RUZXN0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5IazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RpbmcgdGhhdCB7QGxpbmsgQ29udGV4dCBpbmplY3Rpb259IGlzIGRvbmUgYmVmb3JlIGludm9raW5nIG1ldGhvZCBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgUG9zdENvbnN0cnVjdH0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBQb3N0Q29uc3RydWN0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgaW50IHZhbHVlOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyB1cmk7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisKKyAgICAgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsKKyAgICAgICAgICAgIHZhbHVlID0gY29uZmlndXJhdGlvbiAhPSBudWxsID8gMSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ2YWx1ZT0iICsgdmFsdWUgKyAifCIgKyBjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KCJ2YWx1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgICAgIHByaXZhdGUgaW50IHZhbHVlOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgICAgIEBQb3N0Q29uc3RydWN0CisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHVyaUluZm8gIT0gbnVsbCA/IDEgOiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgbWFwLnB1dCgidmFsdWUiLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICAvLyBJZiBzdHJhdGVneSBpcyBub3QgSU1NRURJQVRFIHRoZW4gdGVzdCB3aWxsIGZhaWwgZXZlbiBiZWZvcmUgQEJlZm9yZSBzZXR1cCBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgICAgLy8gSXQgaGFzIG5vIG90aGVyIHJlYXNvbiB0aGVuIGp1c3QgcnVuIHRoZSB0ZXN0cyBpbiBJTU1FRElBVEUgc3RyYXRlZ3kuCisgICAgICAgIGlmIChIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5uZXdJbnN0YW5jZShNeUFwcGxpY2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5uZXdJbnN0YW5jZShuZXcgUmVzb3VyY2VDb25maWcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvblJlc291cmNlUG9zdENvbnN0cnVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlPTF8MSIsIHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUHJpbWl0aXZlVHlwZXNUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QcmltaXRpdmVUeXBlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGFiZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUHJpbWl0aXZlVHlwZXNUZXN0LmphdmEKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCisvKioKKyAqIFRlc3RzIHByaW1pdGl2ZSB0eXBlcyBhcyBlbnRpdHkuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFByaW1pdGl2ZVR5cGVzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVnZXIoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoIkludGVnZXIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KDUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNiksIHJlc3BvbnNlLnJlYWRFbnRpdHkoSW50ZWdlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUludCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiaW50IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSg1LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDYpLCByZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVJbnROdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJpbnQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCIiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvbmcoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoIkxvbmciKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KDVMLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDYpLCByZXNwb25zZS5yZWFkRW50aXR5KExvbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVMb25nKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJsb25nIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSg1TCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2TCwgKGxvbmcpIHJlc3BvbnNlLnJlYWRFbnRpdHkobG9uZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUxvbmdOdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJsb25nIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG9ydCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiU2hvcnQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KChzaG9ydCkgNSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU2hvcnQoKHNob3J0KSA2KSwgcmVzcG9uc2UucmVhZEVudGl0eShTaG9ydC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVNob3J0KCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJzaG9ydCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoKHNob3J0KSA1LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkgNiwgKHNob3J0KSByZXNwb25zZS5yZWFkRW50aXR5KHNob3J0LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlU2hvcnROdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJzaG9ydCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGUoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoIkJ5dGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KChieXRlKSA1LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCeXRlKChieXRlKSA2KSwgcmVzcG9uc2UucmVhZEVudGl0eShCeXRlLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlQnl0ZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiYnl0ZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoKGJ5dGUpIDUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDYsIChieXRlKSByZXNwb25zZS5yZWFkRW50aXR5KGJ5dGUuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVCeXRlTnVsbCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiYnl0ZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0KCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJGbG9hdCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoKGZsb2F0KSA1LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBGbG9hdCg2KSwgcmVzcG9uc2UucmVhZEVudGl0eShGbG9hdC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUZsb2F0KCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJmbG9hdCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoNWYsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNmYsIHJlc3BvbnNlLnJlYWRFbnRpdHkoZmxvYXQuY2xhc3MpLCAwLjBmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVGbG9hdE51bGwoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImZsb2F0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJEb3VibGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KChkb3VibGUpIDUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERvdWJsZSg2KSwgcmVzcG9uc2UucmVhZEVudGl0eShEb3VibGUuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVEb3VibGUoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImRvdWJsZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoNWQsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNmQsIHJlc3BvbnNlLnJlYWRFbnRpdHkoZG91YmxlLmNsYXNzKSwgMC4wZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlRG91YmxlTnVsbCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiZG91YmxlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJDaGFyYWN0ZXIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCdhJywgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQ2hhcmFjdGVyKCdiJyksIHJlc3BvbnNlLnJlYWRFbnRpdHkoQ2hhcmFjdGVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlQ2hhcmFjdGVyKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJjaGFyIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgnYScsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoJ2InLCAoY2hhcikgcmVzcG9uc2UucmVhZEVudGl0eShjaGFyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlQ2hhcmFjdGVyTnVsbCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiY2hhciIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiU3RyaW5nIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiU3RyaW5nIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU3RyaW5nUE9TVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiQm9vbGVhbiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoQm9vbGVhbi5UUlVFLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoQm9vbGVhbi5jbGFzcykpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlQm9vbGVhbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiYm9vbGVhbiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkodHJ1ZSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLnJlYWRFbnRpdHkoYm9vbGVhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0RlY2ltYWwoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImJpZ0RlY2ltYWwiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBCaWdEZWNpbWFsKCIxNSIpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxNiIpLCByZXNwb25zZS5yZWFkRW50aXR5KEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdJbnRlZ2VyKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJiaWdJbnRlZ2VyIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgQmlnSW50ZWdlcigiMTUiKSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgQmlnSW50ZWdlcigiMTYiKSwgcmVzcG9uc2UucmVhZEVudGl0eShCaWdJbnRlZ2VyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXRvbWljSW50ZWdlcigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiYXRvbWljSW50ZWdlciIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEF0b21pY0ludGVnZXIoMTUpLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTYsIHJlc3BvbnNlLnJlYWRFbnRpdHkoQXRvbWljSW50ZWdlci5jbGFzcykuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF0b21pY0xvbmcoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImF0b21pY0xvbmciKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBBdG9taWNMb25nKDE1KSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE2LCByZXNwb25zZS5yZWFkRW50aXR5KEF0b21pY0xvbmcuY2xhc3MpLmdldCgpKTsKKyAgICB9CisKKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVzdGlrIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0KEBRdWVyeVBhcmFtKCJpZCIpIGludCBpZCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihpZCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiSW50ZWdlciIpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHBvc3RJbnRlZ2VyKEludGVnZXIgaSkgeworICAgICAgICAgICAgcmV0dXJuIGkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImludCIpCisgICAgICAgIHB1YmxpYyBpbnQgcG9zdEludChpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIGkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIkxvbmciKQorICAgICAgICBwdWJsaWMgTG9uZyBwb3N0TG9uZyhMb25nIGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJsb25nIikKKyAgICAgICAgcHVibGljIGxvbmcgcG9zdExvbmcobG9uZyBsKSB7CisgICAgICAgICAgICByZXR1cm4gbCArIDE7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiU2hvcnQiKQorICAgICAgICBwdWJsaWMgbG9uZyBwb3N0U2hvcnQoU2hvcnQgcykgeworICAgICAgICAgICAgcmV0dXJuIHMgKyAxOworICAgICAgICB9CisKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic2hvcnQiKQorICAgICAgICBwdWJsaWMgbG9uZyBwb3N0UHJpbWl0aXZlU2hvcnQoc2hvcnQgcykgeworICAgICAgICAgICAgcmV0dXJuIHMgKyAxOworICAgICAgICB9CisKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiQnl0ZSIpCisgICAgICAgIHB1YmxpYyBCeXRlIHBvc3RCeXRlKEJ5dGUgYikgeworICAgICAgICAgICAgcmV0dXJuIChieXRlKSAoYiArIDEpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImJ5dGUiKQorICAgICAgICBwdWJsaWMgYnl0ZSBwb3N0UHJpbWl0aXZlQnl0ZShieXRlIGIpIHsKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZSkgKGIgKyAxKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIkZsb2F0IikKKyAgICAgICAgcHVibGljIEZsb2F0IHBvc3RGbG9hdChGbG9hdCBmKSB7CisgICAgICAgICAgICByZXR1cm4gZiArIDFmOworICAgICAgICB9CisKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiZmxvYXQiKQorICAgICAgICBwdWJsaWMgZmxvYXQgcG9zdFByaW1pdGl2ZUZsb2F0KGZsb2F0IGYpIHsKKyAgICAgICAgICAgIHJldHVybiBmICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJEb3VibGUiKQorICAgICAgICBwdWJsaWMgRG91YmxlIHBvc3REb3VibGUoRG91YmxlIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkICsgMWQ7CisgICAgICAgIH0KKworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJkb3VibGUiKQorICAgICAgICBwdWJsaWMgZG91YmxlIHBvc3RQcmltaXRpdmVEb3VibGUoZG91YmxlIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkICsgMTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIkNoYXJhY3RlciIpCisgICAgICAgIHB1YmxpYyBDaGFyYWN0ZXIgcG9zdENoYXJhY3RlcihDaGFyYWN0ZXIgYykgeworICAgICAgICAgICAgYnl0ZSBiID0gKGJ5dGUpIChjLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIGIgPSAoYnl0ZSkgKGIgKyAxKTsKKyAgICAgICAgICAgIHJldHVybiAoY2hhcikgYjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjaGFyIikKKyAgICAgICAgcHVibGljIGNoYXIgcG9zdFByaW1pdGl2ZUNoYXIoY2hhciBjKSB7CisgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSkgYzsKKyAgICAgICAgICAgIGIgPSAoYnl0ZSkgKGIgKyAxKTsKKyAgICAgICAgICAgIHJldHVybiAoY2hhcikgYjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJTdHJpbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RTdHJpbmcoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgcmV0dXJuIHN0ciArICJQT1NUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJCb29sZWFuIikKKyAgICAgICAgcHVibGljIEJvb2xlYW4gcG9zdEJvb2xlYW4oQm9vbGVhbiBiKSB7CisgICAgICAgICAgICBib29sZWFuIGJvb2wgPSBiOworICAgICAgICAgICAgcmV0dXJuICFib29sOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImJvb2xlYW4iKQorICAgICAgICBwdWJsaWMgQm9vbGVhbiBwb3N0UHJpbWl0aXZlQm9vbGVhbihib29sZWFuIGIpIHsKKyAgICAgICAgICAgIHJldHVybiAhYjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJiaWdEZWNpbWFsIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBCaWdEZWNpbWFsIG51bWJlcihCaWdEZWNpbWFsIG51bWJlcikgeworICAgICAgICAgICAgcmV0dXJuIG51bWJlci5hZGQobmV3IEJpZ0RlY2ltYWwoIjEiKSk7CisgICAgICAgIH0KKworCisgICAgICAgIEBQYXRoKCJiaWdJbnRlZ2VyIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXIoQmlnSW50ZWdlciBiaWdJbnRlZ2VyKSB7CisgICAgICAgICAgICByZXR1cm4gYmlnSW50ZWdlci5hZGQobmV3IEJpZ0ludGVnZXIoIjEiKSk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYXRvbWljSW50ZWdlciIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgQXRvbWljSW50ZWdlciBhdG9taWNJbnRlZ2VyKEF0b21pY0ludGVnZXIgYXRvbWljKSB7CisgICAgICAgICAgICBhdG9taWMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICByZXR1cm4gYXRvbWljOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImF0b21pY0xvbmciKQorICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIEF0b21pY0xvbmcgYXRvbWljTG9uZyhBdG9taWNMb25nIGF0b21pYykgeworICAgICAgICAgICAgYXRvbWljLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgcmV0dXJuIGF0b21pYzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1JlbG9hZFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1JlbG9hZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ0ZjZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVsb2FkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogUmVsb2FkIGNhcGFiaWxpdHkgdGVzdC4KKyAqCisgKiBGb3IgamRrIGh0dHAgc2VydmVyIHRlc3QgY29udGFpbmVyLCBydW4gd2l0aDoKKyAqCisgKiBtdm4gLUR0ZXN0PVJlbG9hZFRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZGtodHRwLkpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeSBjbGVhbiB0ZXN0CisgKgorICogRm9yIHNpbXBsZSB0ZXN0IGNvbnRhaW5lciwgcnVuIHdpdGg6CisgKgorICogbXZuIC1EdGVzdD1SZWxvYWRUZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc2ltcGxlLlNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5IGNsZWFuIHRlc3QKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVsb2FkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIm9uZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPbmUgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJvbmUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInR3byIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUd28geworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0d28iOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVsb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIHsKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lcjsKKworCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZChSZXNvdXJjZUNvbmZpZyByYykgeworICAgICAgICAgICAgY29udGFpbmVyLnJlbG9hZChyYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGFydHVwKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgUmVzb3VyY2VDb25maWcgcmM7CisgICAgUmVsb2FkZXIgcmVsb2FkZXI7CisKKyAgICBwcml2YXRlIFJlc291cmNlQ29uZmlnIF9jcmVhdGVSQyhSZWxvYWRlciByKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc3VsdCA9IG5ldyBSZXNvdXJjZUNvbmZpZyhPbmUuY2xhc3MpOworICAgICAgICByZXN1bHQucmVnaXN0ZXJJbnN0YW5jZXMocik7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZWxvYWRlciA9IG5ldyBSZWxvYWRlcigpOworICAgICAgICByZXR1cm4gcmMgPSBfY3JlYXRlUkMocmVsb2FkZXIpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsb2FkKCkgeworCisgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgdGFyZ2V0KCkucGF0aCgib25lIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHRhcmdldCgpLnBhdGgoInR3byIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgcmMgPSBfY3JlYXRlUkMocmVsb2FkZXIpLnJlZ2lzdGVyQ2xhc3NlcyhUd28uY2xhc3MpOworICAgICAgICByZWxvYWRlci5yZWxvYWQocmMpOworCisgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgdGFyZ2V0KCkucGF0aCgib25lIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHdvIiwgdGFyZ2V0KCkucGF0aCgidHdvIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVxdWVzdFNjb3BlZEFuZEFzeW5jVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVxdWVzdFNjb3BlZEFuZEFzeW5jVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZTQzNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXF1ZXN0U2NvcGVkQW5kQXN5bmNUZXN0LmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5EaXNwb3NhYmxlU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBKRVJTRVktMjY3NyByZXByb2R1Y2VyIC0gdGVzdCwgdGhhdCB7QGNvZGUgRmFjdG9yeS5kaXNwb3NlKCl9IGlzIGNvcnJlY3RseSBjYWxsZWQgZm9yIGJvdGggc3luYyBhbmQgYXN5bmMgY2FzZXMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEFuZEFzeW5jVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVxdWVzdFNjb3BlZEFuZEFzeW5jVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLy8gbGF0Y2ggdG8gcHJldmVudCwgdGhhdCB0aGUgYmFsYW5jZSBpcyBjaGVja2VkIGJlZm9yZSBkaXNwb3NlKCkgaXMgY2FsbGVkCisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggY2RsOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmplY3RhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9ICJIZWxsbyI7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmplY3RhYmxlRmFjdG9yeSBpbXBsZW1lbnRzIERpc3Bvc2FibGVTdXBwbGllcjxJbmplY3RhYmxlPiB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0ludGVnZXIgcHJvdmlkZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljSW50ZWdlciBiYWxhbmNlID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbmplY3RhYmxlIGdldCgpIHsKKyAgICAgICAgICAgIExPR0dFUi5maW5lKCJGYWN0b3J5IHByb3ZpZGUoKSBjYWxsZWQuIik7CisgICAgICAgICAgICBwcm92aWRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIGJhbGFuY2UuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEluamVjdGFibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKEluamVjdGFibGUgaSkgeworICAgICAgICAgICAgTE9HR0VSLmZpbmUoIkZhY3RvcnkgZGlzcG9zZSgpIGNhbGxlZC4gIik7CisgICAgICAgICAgICBiYWxhbmNlLmRlY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgY2RsLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgTE9HR0VSLmZpbmUoIkZhY3RvcnkgcmVzZXQoKSBjYWxsZWQuIik7CisgICAgICAgICAgICBwcm92aWRlZC5zZXQoMCk7CisgICAgICAgICAgICBiYWxhbmNlLnNldCgwKTsKKyAgICAgICAgICAgIGNkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFByb3ZpZGVkQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvdmlkZWQuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEJhbGFuY2VWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBiYWxhbmNlLmludFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBJbmplY3RhYmxlIGluamVjdGFibGU7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3luYyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBzeW5jKCkgeworICAgICAgICAgICAgTE9HR0VSLmZpbmUoIkluamVjdGVkIG1lc3NhZ2U6ICIgKyBpbmplY3RhYmxlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFzeW5jIikKKyAgICAgICAgcHVibGljIHZvaWQgYXN5bmMoQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFyKSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZSgiSW5qZWN0ZWQgbWVzc2FnZTogIiArIGluamVjdGFibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIGFyLnJlc3VtZShSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCByZXNldENvdW50ZXJzKCkgeworICAgICAgICBJbmplY3RhYmxlRmFjdG9yeS5yZXNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRmFjdG9yeShJbmplY3RhYmxlRmFjdG9yeS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKEluamVjdGFibGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlUmVsZWFzZUFzeW5jKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBGdXR1cmU8UmVzcG9uc2U+IGZ1dHVyZSA9IHRhcmdldCgiL3Rlc3QvYXN5bmMiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBmdXR1cmUuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSW5qZWN0YWJsZUZhY3RvcnkuZ2V0UHJvdmlkZWRDb3VudCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNkbC5hd2FpdCg1MDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIkNvdW50RG93bkxhdGNoIGludGVycnVwdGVkOiAiLCBlKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgSW5qZWN0YWJsZUZhY3RvcnkuZ2V0QmFsYW5jZVZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlUmVsZWFzZVN5bmMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHRhcmdldCgiL3Rlc3Qvc3luYyIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBJbmplY3RhYmxlRmFjdG9yeS5nZXRQcm92aWRlZENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgSW5qZWN0YWJsZUZhY3RvcnkuZ2V0QmFsYW5jZVZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUHJvdmlkZUFuZERpc3Bvc2VTeW5jMigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgdGFyZ2V0KCIvdGVzdC9zeW5jIikucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEluamVjdGFibGVGYWN0b3J5LmdldFByb3ZpZGVkQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBJbmplY3RhYmxlRmFjdG9yeS5nZXRCYWxhbmNlVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRQcm92aWRlQW5kRGlzcG9zZUFzeW5jMigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgdGFyZ2V0KCIvdGVzdC9hc3luYyIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBJbmplY3RhYmxlRmFjdG9yeS5nZXRQcm92aWRlZENvdW50KCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2RsLmF3YWl0KDUwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiQ291bnREb3duTGF0Y2ggaW50ZXJydXB0ZWQ6ICIsIGUpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBJbmplY3RhYmxlRmFjdG9yeS5nZXRCYWxhbmNlVmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzb3VyY2VDb25maWdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmY0ZjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzb3VyY2VDb25maWdUZXN0LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogRW5kIHRvIGVuZCB0ZXN0IGNsYXNzIGZvciB0ZXN0aW5nIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30gZmVhdHVyZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNvbmZpZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiU3RyaW5nRXF1YWxpdHkiLCAiUmVkdW5kYW50SWZTdGF0ZW1lbnQifSkKKyAgICBAWG1sUm9vdEVsZW1lbnQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BlcnR5IHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgUHJvcGVydHkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgUHJvcGVydHkgb3RoZXIgPSAoUHJvcGVydHkpIG9iajsKKyAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgIT0gb3RoZXIubmFtZSAmJiAodGhpcy5uYW1lID09IG51bGwgfHwgIXRoaXMubmFtZS5lcXVhbHMob3RoZXIubmFtZSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gb3RoZXIudmFsdWUgJiYgKHRoaXMudmFsdWUgPT0gbnVsbCB8fCAhdGhpcy52YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDQ3ICsgKG5hbWUgPT0gbnVsbCA/IDAgOiBuYW1lLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiA0NyArICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybWF0dGVyKCkuZm9ybWF0KCJQcm9wZXJ0eShuYW1lPSVzLHZhbHVlPSVzKSIsIG5hbWUsIHZhbHVlKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBQcm9wZXJ0eSBwb3N0KGZpbmFsIFByb3BlcnR5IHByb3BlcnR5KSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGxpY2F0aW9uIHNpbWlsYXIgdG8gdGhlIG9uZSB0aGF0IG5lZWRzIHRvIHJlZ2lzdGVyIGEgY3VzdG9tIHtAY29kZSBGZWF0dXJlfSB0byBydW4gcHJvcGVybHkKKyAgICAgKiBhbmQgaXMgc3VwcG9zZWQgdG8gYmUgcHJlc2VudCBpbiBXQVIgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXJzZXkxMDk0IGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgICAgIHB1YmxpYyBKZXJzZXkxMDk0KCkgeworICAgICAgICAgICAgcmVnaXN0ZXJDbGFzc2VzKFJlc291cmNlLmNsYXNzLCBKZXR0aXNvbkZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBTaW11bGF0ZSB0aGUgY3JlYXRpb24gb2YgdGhlIFJlc291cmNlQ29uZmlnIGFzIGlmIGl0IHdhcyBjcmVhdGVkIGR1cmluZyBzZXJ2bGV0IGluaXRpYWxpemF0aW9uCisgICAgICAgIHJldHVybiBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKEplcnNleTEwOTQuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIHtAY29kZSBBcHBsaWNhdGlvbkhhbmRsZXJ9IGlzIGFibGUgdG8gcmVnaXN0ZXIgYW5kIHVzZSBjdXN0b20gYmluZGVycyBwcm92aWRlZCBieSBhbiBleHRlbnNpb24gb2YKKyAgICAgKiB7QGNvZGUgUmVzb3VyY2VDb25maWd9IGlmIG9ubHkgYSBjbGFzcyByZWZlcmVuY2Ugb2YgdGhpcyBleHRlbnNpb24gaXMgcGFzc2VkIGluIHRoZSB7QGNvZGUgUmVzb3VyY2VDb25maWd9IHRvIHRoZQorICAgICAqIHtAY29kZSBBcHBsaWNhdGlvbkhhbmRsZXJ9LgorICAgICAqIDxwLz4KKyAgICAgKiBUZXN0IGlzIHRyeWluZyB0byBzaW11bGF0ZSB0aGUgYmVoYXZpb3VyIG9mIEplcnNleSBhcyBpZiB0aGUgYXBwbGljYXRpb24gd2FzIGRlcGxveWVkIGludG8gYSBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICAqIHdpdGggYSBzZXJ2bGV0IGRlZmluZWQgaW4ge0Bjb2RlIHdlYi54bWx9IGZpbGUgdXNpbmcge0Bjb2RlIGluaXQtcGFyYW19IHtAY29kZSBqYXZheC53cy5ycy5BcHBsaWNhdGlvbn0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmVyc2V5MTA5NCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0eSB0ZXN0SW5zdGFuY2UgPSBuZXcgUHJvcGVydHkoIm15UHJvcCIsICJteVZhbCIpOworCisgICAgICAgIGZpbmFsIFByb3BlcnR5IHJldHVybmVkVmFsdWUgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5wYXRoKCIvIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSh0ZXN0SW5zdGFuY2UsICJhcHBsaWNhdGlvbi9qc29uIiksIFByb3BlcnR5LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModGVzdEluc3RhbmNlLCByZXR1cm5lZFZhbHVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlRPRE86IEFkZCB0ZXN0IGZvciByZWxvYWRpbmcgcmVzb3VyY2UgY29uZmlnIGluIHRoZSBjb250YWluZXIgKG9uY2UgaXQgaXMgc3VwcG9ydGVkKSIpCisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTEwOTRSZWxvYWRSZXNvdXJjZUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBUT0RPIHRlc3QgcmVsb2FkaW5nIHJlc291cmNlIGNvbmZpZyBpbiB0aGUgY29udGFpbmVyIChvbmNlIGl0IGlzIHN1cHBvcnRlZCkKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1Jlc291cmNlRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzb3VyY2VGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NiNGE0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1Jlc291cmNlRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm87CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBKQVgtUlMgbmFtZS1ib3VuZCBmaWx0ZXIgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaXJvc2xhdi5GdWtzYQorICogQHNlZSBHbG9iYWxseU5hbWVCb3VuZFJlc291cmNlRmlsdGVyVGVzdAorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIE15RHluYW1pY0ZlYXR1cmUuY2xhc3MsCisgICAgICAgICAgICAgICAgQmFzaWNUZXN0c1Jlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE5hbWVCb3VuZFJlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgTmFtZUJvdW5kUmVzcG9uc2VGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUG9zdE1hdGNoaW5nRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0ZXN0cworICAgICAgICAgICAgICAgIEV4Y2VwdGlvblRlc3RzUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uUHJlTWF0Y2hSZXF1ZXN0RmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvblBvc3RNYXRjaFJlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uVGVzdEJvdW5kUmVzcG9uc2VGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uVGVzdEdsb2JhbFJlc3BvbnNlRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RFeGNlcHRpb25NYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgQWJvcnRSZXNwb25zZVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEFib3J0UmVzcG9uc2VGaXRsZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgQWJvcnRSZXF1ZXN0RmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvblJlcXVlc3RGaWx0ZXIuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljQmluZGVyKCkgeworICAgICAgICB0ZXN0KCJkeW5hbWljQmluZGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUJvdW5kUmVxdWVzdCgpIHsKKyAgICAgICAgdGVzdCgibmFtZUJvdW5kUmVxdWVzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVCb3VuZFJlc3BvbnNlKCkgeworICAgICAgICB0ZXN0KCJuYW1lQm91bmRSZXNwb25zZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RNYXRjaGluZygpIHsKKyAgICAgICAgdGVzdCgicG9zdE1hdGNoaW5nIik7CisgICAgfQorCisgICAgLy8gU2VlIEpFUlNFWS0xNTU0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsUG9zdE1hdGNoaW5nTm90SW52b2tlZE9uNDA0KCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJiYXNpYyIpLnBhdGgoIm5vdC1mb3VuZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGlmIChyLmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBub3QoY29udGFpbnNTdHJpbmcoInBvc3RNYXRjaGluZyIpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJiYXNpYyIpLnBhdGgobmFtZSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZS4iLCAyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBkb2VzIG5vdCBoYXZlIGVudGl0eS4iLCByLmhhc0VudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eSB2YWx1ZS4iLCBuYW1lLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9iYXNpYyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXNpY1Rlc3RzUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJkeW5hbWljQmluZGVyIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldER5bmFtaWNCaW5kZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibmFtZUJvdW5kUmVxdWVzdCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQE5hbWVCb3VuZFJlcXVlc3QKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lQm91bmRSZXF1ZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIm5hbWVCb3VuZFJlc3BvbnNlIikKKyAgICAgICAgQEdFVAorICAgICAgICBATmFtZUJvdW5kUmVzcG9uc2UKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lQm91bmRSZXNwb25zZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJwb3N0TWF0Y2hpbmciKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdE1hdGNoaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwcml2YXRlIHN0YXRpYyBAaW50ZXJmYWNlIE5hbWVCb3VuZFJlcXVlc3Qge30KKworICAgIEBOYW1lQmluZGluZworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHJpdmF0ZSBzdGF0aWMgQGludGVyZmFjZSBOYW1lQm91bmRBYm9ydFJlc3BvbnNlIHt9CisKKyAgICBATmFtZUJvdW5kUmVxdWVzdAorICAgIEBQcmlvcml0eSgxKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZUJvdW5kUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uub2soIm5hbWVCb3VuZFJlcXVlc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOYW1lQm91bmRSZXNwb25zZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZUJvdW5kUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoIm5hbWVCb3VuZFJlc3BvbnNlIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eUFubm90YXRpb25zKCksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb3N0TWF0Y2hpbmdGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiYmFzaWMiKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5vaygicG9zdE1hdGNoaW5nIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMSkKKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEYkZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uub2soImR5bmFtaWNCaW5kZXIiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlEeW5hbWljRmVhdHVyZSBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIERiRmlsdGVyIGZpbHRlciA9IG5ldyBEYkZpbHRlcigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbywgZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKCJnZXREeW5hbWljQmluZGVyIi5lcXVhbHMocmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoZmlsdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvblRlc3RzUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJtYXRjaGVkIikKKyAgICAgICAgQEdFVAorICAgICAgICBARXhjZXB0aW9uVGVzdEJvdW5kCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdE1hdGNoaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJtZXRob2QiOworICAgICAgICB9CisgICAgfQorCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25QcmVNYXRjaFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCJleGNlcHRpb24vbm90LWZvdW5kIi5lcXVhbHMocmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdEV4Y2VwdGlvbigiZ2xvYmFsUmVxdWVzdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwcml2YXRlIHN0YXRpYyBAaW50ZXJmYWNlIEV4Y2VwdGlvblRlc3RCb3VuZCB7fQorCisgICAgQEV4Y2VwdGlvblRlc3RCb3VuZAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uUG9zdE1hdGNoUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdEV4Y2VwdGlvbigibmFtZUJvdW5kUmVxdWVzdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQEV4Y2VwdGlvblRlc3RCb3VuZAorICAgIEBQcmlvcml0eSgxMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvblRlc3RCb3VuZFJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5KAorICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpKSA/IHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSArICItbmFtZUJvdW5kUmVzcG9uc2UiIDogIm5hbWVCb3VuZFJlc3BvbnNlIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eUFubm90YXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDEpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25UZXN0R2xvYmFsUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghcmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldFBhdGgoKS5zdGFydHNXaXRoKCJleGNlcHRpb24iKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgKHJlc3BvbnNlQ29udGV4dC5oYXNFbnRpdHkoKSkgPyByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWdsb2JhbFJlc3BvbnNlIiA6ICJnbG9iYWxSZXNwb25zZSIsCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHlBbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxUZXN0RXhjZXB0aW9uPiB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVEZJWCA9ICItbWFwcGVkVGVzdEV4Y2VwdGlvbiI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFRlc3RFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSArIFBPU1RGSVgpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQm91bmRSZXNwb25zZUZpbHRlck5vdEludm9rZWRPblByZU1hdGNoRmlsdGVyRXhjZXB0aW9uKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJleGNlcHRpb24iKS5wYXRoKCJub3QtZm91bmQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuaGFzRW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdsb2JhbFJlcXVlc3QtbWFwcGVkVGVzdEV4Y2VwdGlvbi1nbG9iYWxSZXNwb25zZSIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQm91bmRSZXNwb25zZUZpbHRlckludm9rZWRPblBvc3RNYXRjaEZpbHRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiZXhjZXB0aW9uIikucGF0aCgibWF0Y2hlZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5oYXNFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZUJvdW5kUmVxdWVzdC1tYXBwZWRUZXN0RXhjZXB0aW9uLW5hbWVCb3VuZFJlc3BvbnNlLWdsb2JhbFJlc3BvbnNlIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBOYW1lQm91bmRBYm9ydFJlc3BvbnNlCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWJvcnRSZXNwb25zZUZpdGxlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQk9SVF9GSUxURVJfVEVTVF9QQVNTRUQgPSAiYWJvcnQtZmlsdGVyLXRlc3QtcGFzc2VkIjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYm9vbGVhbiBwYXNzZWQgPSB0cnVlOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrcyB0aGF0IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBzZXR0aW5nIGVudGl0eSBzdHJlYW0KKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRFbnRpdHlTdHJlYW0obmV3IElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpYWUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBjaGVja3MgdGhhdCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duIHdoZW4gc2V0dGluZyBzZWN1cml0eSBjb250ZXh0CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0U2VjdXJpdHlDb250ZXh0KG5ldyBTZWN1cml0eUNvbnRleHQoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaWFlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2tzIHRoYXQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGFib3J0aW5nIHJlcXVlc3QKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaWFlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZChBQk9SVF9GSUxURVJfVEVTVF9QQVNTRUQsIHBhc3NlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJvdW5kQWJvcnRSZXF1ZXN0CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWJvcnRSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0FCT1JUX0VOVElUWSA9ICJmaWx0ZXItYWJvcnQtZW50aXR5IjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKEZJTFRFUl9BQk9SVF9FTlRJVFkpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE5hbWVCb3VuZEV4Y2VwdGlvbkluUmVxdWVzdAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4Y2VwdGlvblJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSU5fUkVRVUVTVF9GSUxURVIgPSAiZXhjZXB0aW9uLWluLXJlcXVlc3QtZmlsdGVyIjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RFeGNlcHRpb24oRVhDRVBUSU9OX0lOX1JFUVVFU1RfRklMVEVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHJpdmF0ZSBzdGF0aWMgQGludGVyZmFjZSBOYW1lQm91bmRSZXNwb25zZSB7fQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwcml2YXRlIHN0YXRpYyBAaW50ZXJmYWNlIE5hbWVCb3VuZEFib3J0UmVxdWVzdCB7fQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwcml2YXRlIHN0YXRpYyBAaW50ZXJmYWNlIE5hbWVCb3VuZEV4Y2VwdGlvbkluUmVxdWVzdCB7fQorCisgICAgQFBhdGgoImFib3J0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFib3J0UmVzcG9uc2VSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICAgICAgQEdFVAorICAgICAgICBATmFtZUJvdW5kQWJvcnRSZXNwb25zZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJhYm9ydC1pbi1maWx0ZXIiKQorICAgICAgICBAR0VUCisgICAgICAgIEBOYW1lQm91bmRBYm9ydFJlc3BvbnNlCisgICAgICAgIEBOYW1lQm91bmRBYm9ydFJlcXVlc3QKKyAgICAgICAgcHVibGljIFN0cmluZyBuZXZlckNhbGxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiVGhpcyBtZXRob2Qgd2lsbCBuZXZlciBiZSBjYWxsZWQuIFJlcXVlc3Qgd2lsbCBiZSBhYm9ydGVkIGluIGEgcmVxdWVzdCBmaWx0ZXIuIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgICAgICBAR0VUCisgICAgICAgIEBOYW1lQm91bmRBYm9ydFJlc3BvbnNlCisgICAgICAgIEBOYW1lQm91bmRFeGNlcHRpb25JblJlcXVlc3QKKyAgICAgICAgcHVibGljIFN0cmluZyBleGNlcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLiBFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaW4gYSByZXF1ZXN0IGZpbHRlci4iOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRSZXNwb25zZUluUmVzcG9uc2VGaWx0ZXIoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImFib3J0IikucGF0aCgicmVzcG9uc2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyLmdldEhlYWRlclN0cmluZyhBYm9ydFJlc3BvbnNlRml0bGVyLkFCT1JUX0ZJTFRFUl9URVNUX1BBU1NFRCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCByLmdldEhlYWRlclN0cmluZyhBYm9ydFJlc3BvbnNlRml0bGVyLkFCT1JUX0ZJTFRFUl9URVNUX1BBU1NFRCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0QWJvcnRlZFJlc3BvbnNlSW5SZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiYWJvcnQiKS5wYXRoKCJhYm9ydC1pbi1maWx0ZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQWJvcnRSZXF1ZXN0RmlsdGVyLkZJTFRFUl9BQk9SVF9FTlRJVFksIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyLmdldEhlYWRlclN0cmluZyhBYm9ydFJlc3BvbnNlRml0bGVyLkFCT1JUX0ZJTFRFUl9URVNUX1BBU1NFRCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCByLmdldEhlYWRlclN0cmluZyhBYm9ydFJlc3BvbnNlRml0bGVyLkFCT1JUX0ZJTFRFUl9URVNUX1BBU1NFRCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0ZWRSZXNwb25zZUZyb21FeGNlcHRpb25SZXNwb25zZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiYWJvcnQiKS5wYXRoKCJleGNlcHRpb24iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRXhjZXB0aW9uUmVxdWVzdEZpbHRlci5FWENFUFRJT05fSU5fUkVRVUVTVF9GSUxURVIgKyBUZXN0RXhjZXB0aW9uTWFwcGVyLlBPU1RGSVgsCisgICAgICAgICAgICAgICAgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnROb3ROdWxsKHIuZ2V0SGVhZGVyU3RyaW5nKEFib3J0UmVzcG9uc2VGaXRsZXIuQUJPUlRfRklMVEVSX1RFU1RfUEFTU0VEKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHIuZ2V0SGVhZGVyU3RyaW5nKEFib3J0UmVzcG9uc2VGaXRsZXIuQUJPUlRfRklMVEVSX1RFU1RfUEFTU0VEKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzb3VyY2VSb3V0aW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzb3VyY2VSb3V0aW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzRjNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNvdXJjZVJvdXRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVJvdXRpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiYSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUEgeworICAgICAgICBAUGF0aCgiYi9kIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgbWV0aG9kIGNhbm5vdCBiZSBjaG9zZW4gYXMgdGhlIHJlcXVlc3QgcGF0aCAiYS9iLy4uLiIgYWx3YXlzIGZpcnN0bHkgY2hvb3NlIHRoZSBSZXNvdXJjZUFCIGFuZCByb3V0aW5nCisgICAgICAgICAgICAvLyB3aWxsIG5ldmVyIGNoZWNrIHRoaXMgcmVzb3VyY2UuIFRoaXMgaXMgYmFzZWQgb24gdGhlIGFsZ29yaXRobSBmcm9tIHRoZSBqYXgtcnMgc3BlYyAyCisgICAgICAgICAgICByZXR1cm4gImEvYi9kIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJxIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFEoKSB7CisgICAgICAgICAgICByZXR1cm4gImEvcSI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQYXRoKCJhL2IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VBQiB7CisgICAgICAgIEBQYXRoKCJjIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiYS9iL2MiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZUEuY2xhc3MsIFJlc291cmNlQUIuY2xhc3MpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdWJXcm9uZ1BhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImEvYi9kIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29ycmVjdFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImEvYi9jIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhL2IvYyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb3JyZWN0UGF0aDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImEvcSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYS9xIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzcG9uc2VTdGF0dXNUeXBlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzcG9uc2VTdGF0dXNUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTlhZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNwb25zZVN0YXR1c1R5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cC5KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CisKKy8qKgorICogVGVzdHMgY3VzdG9tIHJlc3BvbnNlIHN0YXR1cyByZWFzb24gcGhyYXNlIHdpdGggamVyc2V5IGNvbnRhaW5lcnMgYW5kIGNvbm5lY3RvcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoe1Jlc3BvbnNlU3RhdHVzVHlwZVRlc3QuSW5NZW1vcnlUZXN0LmNsYXNzLAorICAgICAgICBSZXNwb25zZVN0YXR1c1R5cGVUZXN0LkdyaXp6bHlDb250YWluZXJHcml6emx5Q29ubmVjdG9yVGVzdC5jbGFzcywKKyAgICAgICAgUmVzcG9uc2VTdGF0dXNUeXBlVGVzdC5Hcml6emx5Q29udGFpbmVyQXBhY2hlQ29ubmVjdG9yVGVzdC5jbGFzcywKKyAgICAgICAgUmVzcG9uc2VTdGF0dXNUeXBlVGVzdC5TaW1wbGVDb250YWluZXJIdHRwVXJsQ29ubmVjdG9yVGVzdC5jbGFzc30pCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VTdGF0dXNUeXBlVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05fUEhSQVNFID0gIm15LXBocmFzZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluTWVtb3J5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5NZW1vcnlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbSgpIHsKKyAgICAgICAgICAgIF90ZXN0Q3VzdG9tKHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgX3Rlc3RCYWRSZXF1ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21CYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgLy8gd2l0aCBJbk1lbW9yeSBjb250YWluZXIgYW5kIGNvbm5lY3RvciBzdGF0dXMgaW5mbyBzaG91bGQgYmUgdHJhbnNmZXJyZWQgYXMgaXQgaXMgcHJvZHVjZWQuCisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2N1c3RvbS1iYWQtcmVxdWVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChyZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0UmVhc29uUGhyYXNlKCkpOworCisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JpenpseUNvbnRhaW5lckdyaXp6bHlDb25uZWN0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIH0KKworCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7CisgICAgICAgICAgICBfdGVzdEN1c3RvbSh0YXJnZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIF90ZXN0QmFkUmVxdWVzdCh0YXJnZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQmFkUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIF90ZXN0Q3VzdG9tQmFkUmVxdWVzdCh0YXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyaXp6bHlDb250YWluZXJBcGFjaGVDb25uZWN0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIH0KKworCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7CisgICAgICAgICAgICBfdGVzdEN1c3RvbSh0YXJnZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIF90ZXN0QmFkUmVxdWVzdCh0YXJnZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQmFkUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIF90ZXN0Q3VzdG9tQmFkUmVxdWVzdCh0YXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZUNvbnRhaW5lckh0dHBVcmxDb25uZWN0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbSgpIHsKKyAgICAgICAgICAgIF90ZXN0Q3VzdG9tKHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgX3Rlc3RCYWRSZXF1ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21CYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgX3Rlc3RDdXN0b21CYWRSZXF1ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmRrSHR0cENvbnRhaW5lckh0dHBVcmxDb25uZWN0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIEBJZ25vcmUoIkpkayBodHRwIGNvbnRhaW5lciBkb2VzIG5vdCBzdXBwb3J0IGN1c3RvbSByZXNwb25zZSByZWFzb24gcGhyYXNlcy4iKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tKCkgeworICAgICAgICAgICAgX3Rlc3RDdXN0b20odGFyZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEJhZFJlcXVlc3QoKSB7CisgICAgICAgICAgICBfdGVzdEJhZFJlcXVlc3QodGFyZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJhZFJlcXVlc3QoKSB7CisgICAgICAgICAgICBfdGVzdEN1c3RvbUJhZFJlcXVlc3QodGFyZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY3VzdG9tIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRlc3RTdGF0dXNUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhuZXcgQ3VzdG9tNDI4VHlwZSgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYmFkLXJlcXVlc3QiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYmFkUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY3VzdG9tLWJhZC1yZXF1ZXN0IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGN1c3RvbUJhZFJlcXVlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKG5ldyBDdXN0b21CYWRSZXF1ZXN0V2l0aG91dFJlYXNvblR5cGUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b200MjhUeXBlIGltcGxlbWVudHMgUmVzcG9uc2UuU3RhdHVzVHlwZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gNDI4OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uUGhyYXNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJFQVNPTl9QSFJBU0U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkgZ2V0RmFtaWx5KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuQ0xJRU5UX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21CYWRSZXF1ZXN0V2l0aG91dFJlYXNvblR5cGUgaW1wbGVtZW50cyBSZXNwb25zZS5TdGF0dXNUeXBlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiA0MDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb25QaHJhc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UuU3RhdHVzLkZhbWlseSBnZXRGYW1pbHkoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuU3RhdHVzLkZhbWlseS5DTElFTlRfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RDdXN0b20oV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJyZXNvdXJjZS9jdXN0b20iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDI4LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUkVBU09OX1BIUkFTRSwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFJlYXNvblBocmFzZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RCYWRSZXF1ZXN0KFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgicmVzb3VyY2UvYmFkLXJlcXVlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULmdldFJlYXNvblBocmFzZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0UmVhc29uUGhyYXNlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdEN1c3RvbUJhZFJlcXVlc3QoV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJyZXNvdXJjZS9jdXN0b20tYmFkLXJlcXVlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULmdldFJlYXNvblBocmFzZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0UmVhc29uUGhyYXNlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1J1bnRpbWVDb25maWdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SdW50aW1lQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTBkMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SdW50aW1lQ29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkludGVybmFsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSdW50aW1lQ29uZmlnVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5RmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoQ2xpZW50UmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICAgICAgY29udGV4dC5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudFJlYWRlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWc7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgQ2xpZW50UmVhZGVySW50ZXJjZXB0b3IoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZ3VyYXRpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQ2xpZW50RmVhdHVyZS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKENsaWVudFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY29uZmlnLmdldFByb3BlcnRpZXMoKS5zaXplKCksIGlzKDIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY29uZmlnLmdldFByb3BlcnR5KCJmb28iKS50b1N0cmluZygpLCBpcygiYmFyIikpOworCisgICAgICAgICAgICAvLyBKc29uRmVhdHVyZQorICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuZ2V0UHJvcGVydHkoSW50ZXJuYWxQcm9wZXJ0aWVzLkpTT05fRkVBVFVSRV9DTElFTlQpLCBub3ROdWxsVmFsdWUoKSk7CisKKyAgICAgICAgICAgIC8vIE1ldGFJbmZBdXRvRGlzY292ZXJhYmxlCisgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzRW5hYmxlZChDbGllbnRGZWF0dXJlLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiQ3VzdG9tSGVhZGVyIiwgIkNsaWVudFJlYWRlckludGVyY2VwdG9yIik7CisKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVDbGllbnRDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworCisgICAgICAgIHRhcmdldC5yZWdpc3RlcihDbGllbnRGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCB0YXJnZXQuZ2V0Q29uZmlndXJhdGlvbigpLmdldENsYXNzZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHRhcmdldC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKENsaWVudEZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXQuZ2V0Q29uZmlndXJhdGlvbigpLmdldEluc3RhbmNlcygpLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydFRydWUodGFyZ2V0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodGFyZ2V0LmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQoQ2xpZW50RmVhdHVyZS5jbGFzcykpOworCisgICAgICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCB0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKENsaWVudEZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRJbnN0YW5jZXMoKS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRGYWxzZSh0LmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQoQ2xpZW50RmVhdHVyZS5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGllbnRSZWFkZXJJbnRlcmNlcHRvciIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ3VzdG9tSGVhZGVyIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NlY3VyaXR5Q29udGV4dEZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NlY3VyaXR5Q29udGV4dEZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM3ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2VjdXJpdHlDb250ZXh0RmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogRW5kIHRvIGVuZCB0ZXN0IGNsYXNzIGZvciB0ZXN0aW5nIHNlY3VyaXR5IGNvbnRleHQgaW4gdGhlIEZpbHRlciBhbmQKKyAqIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFNlY3VyaXR5Q29udGV4dEZpbHRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOQ0lQQUxfTkFNRSA9ICJ0ZXN0X3ByaW5jaXBhbF9zZXRCeUZpbHRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBfRklMVEVSID0gInNraXBGaWx0ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOQ0lQQUxfSVNfTlVMTCA9ICJwcmluY2lwYWxJc051bGwiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTZWN1cml0eUNvbnRleHRGaWx0ZXIuY2xhc3MsIFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHNlY3VyaXR5IGNvbnRleHQgY29udGFpbmVyIHJlcXVlc3QgZmlsdGVyLgorICAgICAqLworICAgIEBQcmVNYXRjaGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VjdXJpdHlDb250ZXh0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgLy8gVE9ETzogd29uJ3Qgd29yayB1bnRpbCB3ZSBoYXZlIHByb3hpYWJsZSBzY29wZQorLy8gICAgICAgIEBDb250ZXh0CisvLyAgICAgICAgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNvbnRleHQuZ2V0U2VjdXJpdHlDb250ZXh0KCkpOworCisgICAgICAgICAgICAvLyB0ZXN0IGluamVjdGlvbnMKKyAgICAgICAgICAgIC8vIFRPRE86IHdvbid0IHdvcmsgdW50aWwgU2VjdXJpdHlDb250ZXh0IGlzIHByb3hpYWJsZQorLy8gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0U2VjdXJpdHlDb250ZXh0KCksIHNlY3VyaXR5Q29udGV4dCk7CisKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSBjb250ZXh0LmdldEhlYWRlcnMoKS5nZXRGaXJzdChTS0lQX0ZJTFRFUik7CisgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhoZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LnNldFNlY3VyaXR5Q29udGV4dChuZXcgU2VjdXJpdHlDb250ZXh0KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJpbmNpcGFsKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFJJTkNJUEFMX05BTUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBTZWN1cml0eUNvbnRleHQgaW4gZmlsdGVyLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gVGhyb3duIHdoZW4gcmVxdWVzdCBwcm9jZXNzaW5nIGZhaWxzIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlY3VyaXR5Q29udGV4dEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBSSU5DSVBBTF9OQU1FLCBlbnRpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIFNlY3VyaXR5Q29udGV4dCBpbiBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBUaHJvd24gd2hlbiByZXF1ZXN0IHByb2Nlc3NpbmcgZmFpbHMgaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVyU2VjdXJpdHlDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnJlcXVlc3QoKS5oZWFkZXIoU0tJUF9GSUxURVIsICJ0cnVlIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIWVudGl0eS5lcXVhbHMoUFJJTkNJUEFMX05BTUUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlIGNsYXNzLgorICAgICAqLworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGVzdCByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjcmMgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dC4KKyAgICAgICAgICogQHJldHVybiBTdHJpbmcgcmVzcG9uc2Ugd2l0aCBwcmluY2lwYWwgbmFtZS4KKyAgICAgICAgICovCisKKyAgICAgICAgLy8gVE9ETzogaW5qZWN0IFNlY3VyaXR5Q29udGV4dCBkaXJlY3RseSBvbmNlIEpFUlNFWS0xMjgyIGlzIGZpeGVkCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcmluY2lwYWwoQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY3JjKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChjcmMuZ2V0U2VjdXJpdHlDb250ZXh0KCkpOworICAgICAgICAgICAgUHJpbmNpcGFsIHVzZXJQcmluY2lwYWwgPSBjcmMuZ2V0U2VjdXJpdHlDb250ZXh0KCkuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICAgICAgcmV0dXJuIHVzZXJQcmluY2lwYWwgPT0gbnVsbCA/IFBSSU5DSVBBTF9JU19OVUxMIDogdXNlclByaW5jaXBhbC5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TZXJ2ZXJEZXN0cm95VGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2VydmVyRGVzdHJveVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmE3NmRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2VydmVyRGVzdHJveVRlc3QuamF2YQpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkRpc3Bvc2FibGVTdXBwbGllcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBBc3NlcnQgdGhhdCBwcmUgZGVzdHJveSBtZXRob2Qgb24gYXBwbGljYXRpb24sIHJlc291cmNlcyBhbmQgcHJvdmlkZXJzIGlzIGludm9rZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgU2VydmVyRGVzdHJveVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGRlc3Ryb3llZCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIHByaXZhdGUgUmVsb2FkZXIgcmVsb2FkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGVzdHJveWVkLmNsZWFyKCk7CisgICAgICAgIGRlc3Ryb3llZC5wdXQoImFwcGxpY2F0aW9uIiwgZmFsc2UpOworICAgICAgICBkZXN0cm95ZWQucHV0KCJzaW5nbGV0b24tcmVzb3VyY2UiLCBmYWxzZSk7CisgICAgICAgIGRlc3Ryb3llZC5wdXQoImZpbHRlciIsIGZhbHNlKTsKKyAgICAgICAgZGVzdHJveWVkLnB1dCgid3JpdGVyIiwgZmFsc2UpOworICAgICAgICBkZXN0cm95ZWQucHV0KCJzaW5nbGV0b24tZmFjdG9yeSIsIGZhbHNlKTsKKyAgICAgICAgZGVzdHJveWVkLnB1dCgiZmVhdHVyZSIsIGZhbHNlKTsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAicmVzb3VyY2UiOworICAgICAgICB9CisKKyAgICAgICAgQFByZURlc3Ryb3kKKyAgICAgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgICAgIGRlc3Ryb3llZC5wdXQoInNpbmdsZXRvbi1yZXNvdXJjZSIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKCJmb28iLCAiYmFyIik7CisgICAgICAgIH0KKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgZGVzdHJveWVkLnB1dCgiZmlsdGVyIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V3JpdGVyIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KCJ3cml0ZXItIiArIGNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgZGVzdHJveWVkLnB1dCgid3JpdGVyIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICAgICAgQFByZURlc3Ryb3kKKyAgICAgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgICAgIGRlc3Ryb3llZC5wdXQoImFwcGxpY2F0aW9uIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgTXlGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIE15V3JpdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBNeUNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBNeUZlYXR1cmUuY2xhc3MpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgYmluZEZhY3RvcnkoU2luZ2xldG9uRmFjdG9yeS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oU2luZ2xldG9uSW5zdGFuY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvbkluc3RhbmNlIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICAgICAgZGVzdHJveWVkLnB1dCgic2luZ2xldG9uLWZhY3RvcnkiLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uRmFjdG9yeSBpbXBsZW1lbnRzIERpc3Bvc2FibGVTdXBwbGllcjxTaW5nbGV0b25JbnN0YW5jZT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2luZ2xldG9uSW5zdGFuY2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25JbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoZmluYWwgU2luZ2xldG9uSW5zdGFuY2UgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIGluc3RhbmNlLmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisKKyAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lcjsKKworICAgICAgICBwdWJsaWMgdm9pZCByZWxvYWQoZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnKSB7CisgICAgICAgICAgICBjb250YWluZXIucmVsb2FkKGNvbmZpZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGFydHVwKGZpbmFsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFNpbmdsZXRvbkluc3RhbmNlIGluc3RhbmNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNodXRkb3duKGZpbmFsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW5zdGFuY2UsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQFByZURlc3Ryb3kKKyAgICAgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgICAgIGRlc3Ryb3llZC5wdXQoImZlYXR1cmUiLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgcmVsb2FkZXIgPSBuZXcgUmVsb2FkZXIoKTsKKworICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQubmV3SW5zdGFuY2UoUmVzb3VyY2VDb25maWcuZm9yQXBwbGljYXRpb25DbGFzcyhNeUFwcGxpY2F0aW9uLmNsYXNzKS5yZWdpc3RlcihyZWxvYWRlcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygid3JpdGVyLXJlc291cmNlIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0cmluZ0hlYWRlcnMoKS5nZXRGaXJzdCgiZm9vIiksIGlzKCJiYXIiKSk7CisKKyAgICAgICAgY2hlY2tEZXN0cm95ZWQoZmFsc2UpOworICAgICAgICByZWxvYWRlci5yZWxvYWQobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGNoZWNrRGVzdHJveWVkKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0Rlc3Ryb3llZChmaW5hbCBib29sZWFuIHNob3VsZEJlRGVzdHJveWVkKSB7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgQm9vbGVhbj4gZW50cnkgOiBkZXN0cm95ZWQuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChlbnRyeS5nZXRLZXkoKSArICAiIHNob3VsZCIgKyAoc2hvdWxkQmVEZXN0cm95ZWQgPyAiIiA6ICIgbm90IikgKyAiIGJlIGRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCksIGlzKHNob3VsZEJlRGVzdHJveWVkKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TaW5nbGV0b25Qcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NpbmdsZXRvblByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWU0YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TaW5nbGV0b25Qcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGV4dFJlc29sdmVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIENsYXNzIHRlc3RpbmcgdGhhdCBwcm92aWRlcnMgYXJlIG1hbmFnZWQgY29ycmVjdGx5IGluIHRoZSBzaW5nbGV0b24gc2NvcGUuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgU2luZ2xldG9uUHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTaW5nbGV0b25SZXNvdXJjZS5jbGFzcywgQW55RmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbk1hcHBpbmdQcm92aWRlci5jbGFzcywgU2luZ2xldG9uU3RyaW5nTWVzc2FnZVByb3ZpZGVyLmNsYXNzLCBNeUNvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXJUZXN0KCkgeworICAgICAgICAvLyBOT1RFOiBFeHBsaWNpdCBhY2NlcHRlZE1lZGlhIHR5cGUgZGVmaW5pdGlvbiBpcyBub3QgbmVlZGVkIGZvciBIdHRwVXJsQ29ubmVjdG9yLCBhcyBpdCBzZW5kcyBzZXZlcmFsICJkZWZhdWx0IiB0eXBlcworICAgICAgICAvLyB3aGVuIG5vdCBzZXQgZGlyZWN0bHkuIEZvciAoc29tZSkgb3RoZXIgY29ubmVjdG9ycyAobmFtZWx5IEpka0Nvbm5lY3RvciksIHRoaXMgaXMgcmVxdWlyZWQsIGFzIHRoZSBpbmZlcnJlZCBhY2NlcHRlZAorICAgICAgICAvLyBtZWRpYSB0eXBlIGlzICovKiwgd2hpY2ggd291bGQgbWF0Y2ggdGhlIHByb3ZpZGVyLCB0aGF0IHByb2R1Y2VzIHRleHQvdGVzdCwgd2hpY2ggaXMgd2hhdCB3ZSBkb24ndCB3YW50IGluIHRoaXMgY2FzZS4KKyAgICAgICAgU3RyaW5nIHN0cjsKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZmlsdGVyIikucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWx0ZXI6MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZmlsdGVyIikucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWx0ZXI6MiIsIHN0cik7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGV4Y2VwdGlvbk1hcHBlclRlc3QoKSB7CisgICAgICAgIC8vIE5PVEU6IEV4cGxpY2l0IGFjY2VwdGVkTWVkaWEgdHlwZSBkZWZpbml0aW9uIGlzIG5vdCBuZWVkZWQgZm9yIEh0dHBVcmxDb25uZWN0b3IsIGFzIGl0IHNlbmRzIHNldmVyYWwgImRlZmF1bHQiIHR5cGVzCisgICAgICAgIC8vIHdoZW4gbm90IHNldCBkaXJlY3RseS4gRm9yIChzb21lKSBvdGhlciBjb25uZWN0b3JzIChuYW1lbHkgSmRrQ29ubmVjdG9yKSwgdGhpcyBpcyByZXF1aXJlZCwgYXMgdGhlIGluZmVycmVkIGFjY2VwdGVkCisgICAgICAgIC8vIG1lZGlhIHR5cGUgaXMgKi8qLCB3aGljaCB3b3VsZCBtYXRjaCB0aGUgcHJvdmlkZXIsIHRoYXQgcHJvZHVjZXMgdGV4dC90ZXN0LCB3aGljaCBpcyB3aGF0IHdlIGRvbid0IHdhbnQgaW4gdGhpcyBjYXNlLgorICAgICAgICBTdHJpbmcgc3RyOworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9leGNlcHRpb24iKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcHBlcjoxIiwgc3RyKTsKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZXhjZXB0aW9uIikucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXBwZXI6MiIsIHN0cik7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VCb2R5V3JpdGVyVGVzdCgpIHsKKyAgICAgICAgU3RyaW5nIHN0cjE7CisgICAgICAgIHN0cjEgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9tZXNzYWdlYm9keSIpLnJlcXVlc3QoInRleHQvdGVzdCIpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdHIxLmVuZHNXaXRoKCI6MSIpKTsKKyAgICAgICAgU3RyaW5nIHN0cjI7CisgICAgICAgIHN0cjIgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9tZXNzYWdlYm9keSIpLnJlcXVlc3QoInRleHQvdGVzdCIpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdHIyLmVuZHNXaXRoKCI6MiIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoc3RyMS5zdWJzdHJpbmcoMCwgc3RyMS5sZW5ndGgoKSAtIDIpLCBzdHIyLnN1YnN0cmluZygwLCBzdHIyLmxlbmd0aCgpIC0gMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWVzc2FnZUJvZHlSZWFkZXJUZXN0KCkgeworICAgICAgICBTdHJpbmcgc3RyMSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL21lc3NhZ2Vib2R5cmVhZGVyIikucmVxdWVzdCgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgLnB1dChFbnRpdHkuZW50aXR5KCJmcm9tLWNsaWVudCIsICJ0ZXh0L3Rlc3QiKSkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHN0cjEuZW5kc1dpdGgoIjoxIikpOworICAgICAgICBTdHJpbmcgc3RyMiA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL21lc3NhZ2Vib2R5cmVhZGVyIikucmVxdWVzdCgidGV4dC9wbGFpbiIpLnB1dChFbnRpdHkuZW50aXR5KCJmcm9tLWNsaWVudCIsCisgICAgICAgICAgICAgICAgInRleHQvdGVzdCIpKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoc3RyMi5lbmRzV2l0aCgiOjIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0cjEuc3Vic3RyaW5nKDAsIHN0cjEubGVuZ3RoKCkgLSAyKSwgc3RyMi5zdWJzdHJpbmcoMCwgc3RyMi5sZW5ndGgoKSAtIDIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbnRleHRSZXNvbHZlclRlc3QoKSB7CisgICAgICAgIFN0cmluZyBzdHIxID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvY29udGV4dCIpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29udGV4dDoxIiwgc3RyMSk7CisKKyAgICAgICAgU3RyaW5nIHN0cjIgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9jb250ZXh0IikucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZXh0OjIiLCBzdHIyKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJmaWx0ZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50ZXJGcm9tRmlsdGVyKEBIZWFkZXJQYXJhbSgiY291bnRlciIpIGludCBjb3VudGVyKSB7CisgICAgICAgICAgICByZXR1cm4gImZpbHRlcjoiICsgY291bnRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4Y2VwdGlvbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGhyb3dFeGNlcHRpb24oKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2luZ2xldG9uVGVzdEV4Y2VwdGlvbigidGVzdCBleGNlcHRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1lc3NhZ2Vib2R5IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2VCb2R5VGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAibWVzc2FnZWJvZHk6IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgQFBhdGgoIm1lc3NhZ2Vib2R5cmVhZGVyIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2VCb2R5UmVhZGVyVGVzdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gInB1dDoiICsgZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY29udGV4dCIpCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0Q29udGV4dFJlc29sdmVyKEBDb250ZXh0IENvbnRleHRSZXNvbHZlcnMgcmVzb2x2ZXJzKSB7CisgICAgICAgICAgICBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiBjb250ZXh0UmVzb2x2ZXIgPSByZXNvbHZlcnMucmVzb2x2ZShTdHJpbmcuY2xhc3MsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHQgPSBjb250ZXh0UmVzb2x2ZXIuZ2V0Q29udGV4dChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW55RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJjb3VudGVyIiwgU3RyaW5nLnZhbHVlT2YoY291bnRlcisrKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTWFwcGluZ1Byb3ZpZGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFNpbmdsZXRvblRlc3RFeGNlcHRpb24+IHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFNpbmdsZXRvblRlc3RFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpLmVudGl0eSgibWFwcGVyOiIgKyBjb3VudGVyKyspLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvblRlc3RFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIFNpbmdsZXRvblRlc3RFeGNlcHRpb24oKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNpbmdsZXRvblRlc3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDb250ZXh0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiB7CisgICAgICAgIHByaXZhdGUgaW50IGkgPSAxOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJjb250ZXh0OiIgKyBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcyh7InRleHQvdGVzdCJ9KQorICAgIEBDb25zdW1lcyh7InRleHQvdGVzdCJ9KQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ2xldG9uU3RyaW5nTWVzc2FnZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8U3RyaW5nPiB7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworICAgICAgICBwcml2YXRlIGludCByZWFkZXJDb3VudGVyID0gMTsKKworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZyb20oCisgICAgICAgICAgICAgICAgQ2xhc3M8U3RyaW5nPiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiByZWFkRnJvbUFzU3RyaW5nKGVudGl0eVN0cmVhbSwgbWVkaWFUeXBlKSArIHRoaXMgKyAiOiIgKyByZWFkZXJDb3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShTdHJpbmcgcywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBTdHJpbmcgdCwKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB3cml0ZVRvQXNTdHJpbmcodCArIHRoaXMgKyAiOiIgKyBjb3VudGVyKyssIGVudGl0eVN0cmVhbSwgbWVkaWFUeXBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NpbmdsZXRvblByb3ZpZGVyc1Jlc291cmNlc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NpbmdsZXRvblByb3ZpZGVyc1Jlc291cmNlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWE2ZjhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2luZ2xldG9uUHJvdmlkZXJzUmVzb3VyY2VzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUGVyTG9va3VwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IHJlc291cmNlcyB3aGljaCBhbHNvIGFjdHMgYXMgcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZXRvblByb3ZpZGVyc1Jlc291cmNlc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlU2luZ2xldG9uLmNsYXNzLCBSZXNvdXJjZU5vdFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCk7CisgICAgICAgIHJlc291cmNlQnVpbGRlci5uYW1lKCJwcm9ncmFtbWF0aWMiKS5wYXRoKCJwcm9ncmFtbWF0aWMiKS5hZGRNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShSZXNvdXJjZVByb2dyYW1tYXRpY05vdFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0ZpbHRlcigpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbiIpLnJlcXVlc3QoKS5oZWFkZXIoInNpbmdsZXRvbiIsICJzaW5nbGV0b24iKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdHIsIHN0ci5zdGFydHNXaXRoKCJ0cnVlLyIpKTsKKyAgICAgICAgU3RyaW5nIHN0cjIgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24iKS5yZXF1ZXN0KCkuaGVhZGVyKCJzaW5nbGV0b24iLCAic2luZ2xldG9uIikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoc3RyMiwgc3RyMi5zdGFydHNXaXRoKCJ0cnVlLyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0ciwgc3RyMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0ZpbHRlckFubm90YXRlZFBlckxvb2t1cCgpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHRhcmdldCgpLnBhdGgoInBlcmxvb2t1cCIpLnJlcXVlc3QoKS5oZWFkZXIoIm5vdC1zaW5nbGV0b24iLCAibm90LXNpbmdsZXRvbiIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHN0ci5zdGFydHNXaXRoKCJmYWxzZS8iKSk7CisgICAgICAgIFN0cmluZyBzdHIyID0gdGFyZ2V0KCkucGF0aCgicGVybG9va3VwIikucmVxdWVzdCgpLmhlYWRlcigibm90LXNpbmdsZXRvbiIsICJub3Qtc2luZ2xldG9uIikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoc3RyMi5zdGFydHNXaXRoKCJmYWxzZS8iKSk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoc3RyLCBzdHIyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVByb2dyYW1tYXRpYygpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHRhcmdldCgpLnBhdGgoInByb2dyYW1tYXRpYyIpLnJlcXVlc3QoKS5oZWFkZXIoInByb2dyYW1tYXRpYyIsICJwcm9ncmFtbWF0aWMiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdHIuc3RhcnRzV2l0aCgiZmFsc2UvIikpOworICAgICAgICBTdHJpbmcgc3RyMiA9IHRhcmdldCgpLnBhdGgoInByb2dyYW1tYXRpYyIpLnJlcXVlc3QoKS5oZWFkZXIoInByb2dyYW1tYXRpYyIsICJwcm9ncmFtbWF0aWMiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdHIyLnN0YXJ0c1dpdGgoImZhbHNlLyIpKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShzdHIsIHN0cjIpOworICAgIH0KKworICAgIC8vIHRoaXMgc2hvdWxkIGJlIHNpbmdsZXRvbiwgaXQgbWVhbnMgdGhlIHNhbWUgaW5zdGFuY2UgZm9yIHRoZSB1c2FnZSBhcyBhIGZpbHRlciBhbmQgYXMgYW4gcmVzb3VyY2UKKyAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU2luZ2xldG9uIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoInNpbmdsZXRvbiIpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiZmlsdGVyLWNsYXNzIiwgdGhpcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQEhlYWRlclBhcmFtKCJmaWx0ZXItY2xhc3MiKSBTdHJpbmcgZmlsdGVyQ2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihTdHJpbmcudmFsdWVPZih0aGlzLnRvU3RyaW5nKCkuZXF1YWxzKGZpbHRlckNsYXNzKSkgKyAiLyIgKyB0aGlzLnRvU3RyaW5nKCkgKyAiOiIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXJDbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0aGlzIHNob3VsZCBOT1QgYmUgc2luZ2xldG9uLCBiZWNhdXNlIGl0IGlzIGFubm90YXRlZCBhcyBwZXIgbG9va3VwCisgICAgQFBhdGgoInBlcmxvb2t1cCIpCisgICAgQFBlckxvb2t1cAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VOb3RTaW5nbGV0b24gaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5jb250YWluc0tleSgibm90LXNpbmdsZXRvbiIpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiZmlsdGVyLWNsYXNzIiwgdGhpcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQEhlYWRlclBhcmFtKCJmaWx0ZXItY2xhc3MiKSBTdHJpbmcgZmlsdGVyQ2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihTdHJpbmcudmFsdWVPZih0aGlzLnRvU3RyaW5nKCkuZXF1YWxzKGZpbHRlckNsYXNzKSkgKyAiLyIgKyB0aGlzLnRvU3RyaW5nKCkgKyAiOiIKKyAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXJDbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzaG91bGQgbm90IGJlIGEgc2luZ2xldG9uIGFzIHRoaXMgaXMgb25seSBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgYW5kIGlzIG5vdCByZWdpc3RlcmVkIGFzIHByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVByb2dyYW1tYXRpY05vdFNpbmdsZXRvbiBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZmxlY3RvcjxSZXF1ZXN0LCBSZXNwb25zZT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KCJwcm9ncmFtbWF0aWMiKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoImZpbHRlci1jbGFzcyIsIHRoaXMudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9KZXJzZXlDb250YWluZXJSZXF1ZXN0Q29udGV4dAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsdGVyQ2xhc3MgPSAoKENvbnRhaW5lclJlcXVlc3RDb250ZXh0KSByZXF1ZXN0KS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoImZpbHRlci1jbGFzcyIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKFN0cmluZy52YWx1ZU9mKFN0cmluZy52YWx1ZU9mKHRoaXMudG9TdHJpbmcoKS5lcXVhbHMoZmlsdGVyQ2xhc3MpKSArICIvIiArIHRoaXMudG9TdHJpbmcoKSArICI6IgorICAgICAgICAgICAgICAgICAgICArIGZpbHRlckNsYXNzKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2luZ2xldG9uUmVzb3VyY2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TaW5nbGV0b25SZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDczZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2luZ2xldG9uUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5QZXJMb29rdXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQ2xhc3MgdGVzdGluZyBSZXNvdXJjZXMgbWFuYWdlZCBhcyBzaW5nbGV0b25zLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFNpbmdsZXRvblJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQ2hpbGRJbmhlcml0c1BhcmVudEFubm90YXRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgQ2hpbGRJbXBsZW1lbnRzSW50ZXJmYWNlQW5ub3RhdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVxdWVzdFNjb3BlUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgUGVyTG9va3VwU2NvcGVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBTaW5nbGV0b25TY29wZVJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlcjEgPSBSZXNvdXJjZS5idWlsZGVyKCk7CisgICAgICAgIHJlc291cmNlQnVpbGRlcjEubmFtZSgicmVzb3VyY2UtcHJvZ3JhbW1hdGljL2luc3RhbmNlLyIpLnBhdGgoInByb2dyYW1tYXRpYy9pbnN0YW5jZS8iKS5hZGRNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJwcmctaW5zdGFuY2U6IiArIGNvdW50ZXIrKykuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIxLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyMiA9IFJlc291cmNlLmJ1aWxkZXIoKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyMi5uYW1lKCJyZXNvdXJjZS1wcm9ncmFtbWF0aWMvc2luZ2xldG9uLyIpLnBhdGgoInByb2dyYW1tYXRpYy9zaW5nbGV0b24vIikuYWRkTWV0aG9kKCJHRVQiKQorICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkoU2luZ2xldG9uUHJvZ3JhbW1hdGljLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VCdWlsZGVyMi5idWlsZCgpKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlcjMgPSBSZXNvdXJjZS5idWlsZGVyKCk7CisgICAgICAgIHJlc291cmNlQnVpbGRlcjMubmFtZSgicmVzb3VyY2UtcHJvZ3JhbW1hdGljL3JldXNlZC1zaW5nbGV0b24vIikucGF0aCgicHJvZ3JhbW1hdGljL3JldXNlZC1zaW5nbGV0b24vIikuYWRkTWV0aG9kKCJHRVQiKQorICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkoU3ViUmVzb3VyY2VTaW5nbGV0b24uY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIzLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyNCA9IFJlc291cmNlLmJ1aWxkZXIoKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyNC5uYW1lKCJyZXNvdXJjZS1wcm9ncmFtbWF0aWMvbm90LXNpbmdsZXRvbi8iKS5wYXRoKCJwcm9ncmFtbWF0aWMvbm90LXNpbmdsZXRvbi8iKS5hZGRNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShOb3RTaW5nbGV0b25Qcm9ncmFtbWF0aWMuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXI0LmJ1aWxkKCkpOworCisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNpbmdsZXRvblJlc291cmNlVGVzdCgpIHsKKyAgICAgICAgU3RyaW5nIHN0cjsKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXM6MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXM6MiIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uL3N1YiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygic3ViOjEiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVzOjMiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbi9zdWIiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN1YjoyIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24vc3ViLW5vdC1zaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5vdC1zaW5nbGV0b246MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uL3N1Yi1ub3Qtc2luZ2xldG9uIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJub3Qtc2luZ2xldG9uOjEiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbi9pbnN0YW5jZSIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygic3ViOjEiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbi9pbnN0YW5jZSIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygic3ViOjEiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbi9zdWIiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN1YjozIiwgc3RyKTsKKworICAgICAgICAvLyBvbmUgaW5zdGFuY2UKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgicHJvZ3JhbW1hdGljIikucGF0aCgiaW5zdGFuY2UiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByZy1pbnN0YW5jZToxIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJwcm9ncmFtbWF0aWMiKS5wYXRoKCJpbnN0YW5jZSIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJnLWluc3RhbmNlOjIiLCBzdHIpOworCisgICAgICAgIC8vIHNpbmdsZXRvbgorICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJwcm9ncmFtbWF0aWMiKS5wYXRoKCJzaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByZy1zaW5nbGV0b246MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgicHJvZ3JhbW1hdGljIikucGF0aCgic2luZ2xldG9uIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmctc2luZ2xldG9uOjIiLCBzdHIpOworCisgICAgICAgIC8vIHJlcXVlc3QgdG8gdGhlIFN1YlJlc291cmNlU2luZ2xldG9uIChzYW1lIGNsYXNzIGFzIHN1YiByZXNvdXJjZSBvbiBwYXRoICJzaW5nbGV0b24vc3ViIikKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgicHJvZ3JhbW1hdGljIikucGF0aCgicmV1c2VkLXNpbmdsZXRvbiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicmV1c2VkLXNpbmdsZXRvbjo0Iiwgc3RyKTsKKworICAgICAgICAvLyBub3Qgc2luZ2xldG9uCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInByb2dyYW1tYXRpYyIpLnBhdGgoIm5vdC1zaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByZy1ub3Qtc2luZ2xldG9uOjEiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInByb2dyYW1tYXRpYyIpLnBhdGgoIm5vdC1zaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByZy1ub3Qtc2luZ2xldG9uOjEiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2luZ2xldG9uQW5ub3RhdGlvbkluaGVyaXRlZFRlc3QoKSB7CisgICAgICAgIC8vIFNpbmdsZXRvbiBhbm5vdGF0aW9uIGlzIG5vdCBpbmhlcml0ZWQKKyAgICAgICAgU3RyaW5nIHN0cjsKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgiaW5oZXJpdCIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW5oZXJpdDoxIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJpbmhlcml0IikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmhlcml0OjEiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2luZ2xldG9uQW5ub3RhdGlvbkludGVyZmFjZVRlc3QoKSB7CisgICAgICAgIC8vIFNpbmdsZXRvbiBhbm5vdGF0aW9uIGlzIG5vdCBpbmhlcml0ZWQKKyAgICAgICAgU3RyaW5nIHN0cjsKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgiaW50ZXJmYWNlIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRlcmZhY2U6MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgiaW50ZXJmYWNlIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRlcmZhY2U6MSIsIHN0cik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHJlc291cmNlcyBhcmUgYnkgZGVmYXVsdCBtYW5hZ2VkIGluIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZSByZXF1ZXN0IHNjb3BlfS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUluUmVxdWVzdFNjb3BlKCkgeworICAgICAgICBTdHJpbmcgc3RyID0gdGFyZ2V0KCkucGF0aCgidGVzdFNjb3BlL3JlcXVlc3QiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNhbWUtaW5zdGFuY2VzIiwgc3RyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUluUGVyTG9va3VwU2NvcGUoKSB7CisgICAgICAgIFN0cmluZyBzdHIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0U2NvcGUvcGVybG9va3VwIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaWZmZXJlbnQtaW5zdGFuY2VzIiwgc3RyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUluU2luZ2xldG9uU2NvcGUoKSB7CisgICAgICAgIFN0cmluZyBzdHIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0U2NvcGUvc2luZ2xldG9uIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzYW1lLWluc3RhbmNlcyIsIHN0cik7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QtcmVxdWVzdFNjb3BlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcXVlc3RTY29wZVJlc291cmNlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0LXBlcmxvb2t1cFNjb3BlIikKKyAgICBAUGVyTG9va3VwCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJMb29rdXBTY29wZVJlc291cmNlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0LXNpbmdsZXRvblNjb3BlIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25TY29wZVJlc291cmNlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0U2NvcGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBjb21wYXJlSW5zdGFuY2VzKENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgcmVzMSA9IEluamVjdGlvbnMuZ2V0T3JDcmVhdGUoaW5qZWN0aW9uTWFuYWdlciwgY2xhenopOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHJlczIgPSBJbmplY3Rpb25zLmdldE9yQ3JlYXRlKGluamVjdGlvbk1hbmFnZXIsIGNsYXp6KTsKKyAgICAgICAgICAgIHJldHVybiAocmVzMSA9PSByZXMyKSA/ICJzYW1lLWluc3RhbmNlcyIgOiAiZGlmZmVyZW50LWluc3RhbmNlcyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXF1ZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBjb21wYXJlUmVxdWVzdFNjb3BlZEluc3RhbmNlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlSW5zdGFuY2VzKFJlcXVlc3RTY29wZVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInBlcmxvb2t1cCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY29tcGFyZVBlckxvb2t1cFNjb3BlZEluc3RhbmNlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlSW5zdGFuY2VzKFBlckxvb2t1cFNjb3BlUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICAgICAgcHVibGljIFN0cmluZyBjb21wYXJlU2luZ2xldG9uSW5zdGFuY2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVJbnN0YW5jZXMoU2luZ2xldG9uU2NvcGVSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJlbnQgeworCisgICAgfQorCisgICAgQFBhdGgoImluaGVyaXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGRJbmhlcml0c1BhcmVudEFubm90YXRpb24gZXh0ZW5kcyBQYXJlbnQgeworCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImluaGVyaXQ6IiArIGNvdW50ZXIrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBbm5vdGF0ZWRCeVNpbmdsZXRvbiB7CisgICAgfQorCisgICAgQFBhdGgoImludGVyZmFjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZEltcGxlbWVudHNJbnRlcmZhY2VBbm5vdGF0aW9uIGltcGxlbWVudHMgQW5ub3RhdGVkQnlTaW5nbGV0b24geworCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImludGVyZmFjZToiICsgY291bnRlcisrOworICAgICAgICB9CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uUHJvZ3JhbW1hdGljIGltcGxlbWVudHMgSW5mbGVjdG9yPFJlcXVlc3QsIFJlc3BvbnNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShSZXF1ZXN0IGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygicHJnLXNpbmdsZXRvbjoiICsgY291bnRlcisrKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vdFNpbmdsZXRvblByb2dyYW1tYXRpYyBpbXBsZW1lbnRzIEluZmxlY3RvcjxSZXF1ZXN0LCBSZXNwb25zZT4geworCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoUmVxdWVzdCBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soInByZy1ub3Qtc2luZ2xldG9uOiIgKyBjb3VudGVyKyspLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvblJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMTsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb3VudGVyKCkgeworICAgICAgICAgICAgcmV0dXJuICJyZXM6IiArIChjb3VudGVyKyspOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRTdWJSZXNvdXJjZVNpbmdsZXRvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJSZXNvdXJjZVNpbmdsZXRvbi5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWItbm90LXNpbmdsZXRvbiIpCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJSZXNvdXJjZS5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJpbnN0YW5jZSIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U3ViUmVzb3VyY2VJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2VTaW5nbGV0b24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImZpbHRlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q291bnRlckZyb21GaWx0ZXIoQEhlYWRlclBhcmFtKCJjb3VudGVyIikgaW50IGNvdW50ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAiZmlsdGVyOiIgKyBjb3VudGVyOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZVNpbmdsZXRvbiBpbXBsZW1lbnRzIEluZmxlY3RvcjxSZXF1ZXN0LCBSZXNwb25zZT4geworCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJbnRlcm5hbENvdW50ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gInN1YjoiICsgKGNvdW50ZXIrKyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJyZXVzZWQtc2luZ2xldG9uOiIgKyBjb3VudGVyKyspLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMTsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJuYWxDb3VudGVyKCkgeworICAgICAgICAgICAgcmV0dXJuICJub3Qtc2luZ2xldG9uOiIgKyAoY291bnRlcisrKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1N0cmVhbU1ldGhvZENhbGxUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TdHJlYW1NZXRob2RDYWxsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDM0ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TdHJlYW1NZXRob2RDYWxsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIHRoYXQgYXBwcm9wcmlhdGUgbWV0aG9kcyBhcmUgY2FsbGVkIGluIHRoZSBpbnRlcmNlcHRlZCBvdXRwdXQgc3RyZWFtLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJlYW1NZXRob2RDYWxsVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0V3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsIFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbW9sZE9zID0gY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKG5ldyBUZXN0T3V0cHV0U3RyZWFtKG5ldyBHWklQT3V0cHV0U3RyZWFtKG91dHB1dFN0cmVhbW9sZE9zKSkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgICAgICBwcml2YXRlIGZpbmFsIEdaSVBPdXRwdXRTdHJlYW0gZ3pvczsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNsb3NlQ2FsbGVkID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmbHVzaENhbGxlZEJlZm9yZUNsb3NlID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZUNhbGxlZCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBUZXN0T3V0cHV0U3RyZWFtKEdaSVBPdXRwdXRTdHJlYW0gZ3pvcykgeworICAgICAgICAgICAgdGhpcy5nem9zID0gZ3pvczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdyaXRlQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGd6b3Mud3JpdGUoYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgVGVzdE91dHB1dFN0cmVhbS5jbG9zZUNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICBnem9zLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCFjbG9zZUNhbGxlZCkgeworICAgICAgICAgICAgICAgIGZsdXNoQ2FsbGVkQmVmb3JlQ2xvc2UgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3pvcy5mbHVzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsZWRNZXRob2RzKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiY2xvc2UoKSBoYXMgbm90IGJlZW4gY2FsbGVkLiIsIFRlc3RPdXRwdXRTdHJlYW0uY2xvc2VDYWxsZWQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiZmx1c2goKSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSBjbG9zZSgpLiIsIFRlc3RPdXRwdXRTdHJlYW0uZmx1c2hDYWxsZWRCZWZvcmVDbG9zZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJ3cml0ZSgpIGhhcyBub3QgYmVlbiBjYWxsZWQuIiwgVGVzdE91dHB1dFN0cmVhbS53cml0ZUNhbGxlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU3ViUmVzb3VyY2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TdWJSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U0ODMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU3ViUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFN1Yi1yZXNvdXJjZSBhY2Nlc3MvcHJvY2Vzc2luZyBFMkUgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFN1YlJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInJvb3Qvc3ViIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQFBhdGgoIi8iKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2VMb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YjIiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2VMb2NhdG9yMigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUID0gImdldCI7CisKKyAgICAgICAgQFBhdGgoInNvbWUvcGF0aCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gR0VUOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImVtcHR5LWxvY2F0b3IiKQorICAgICAgICBwdWJsaWMgRW1wdHlTdWJSZXNvdXJjZUNsYXNzIGdldEVtcHR5TG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlTdWJSZXNvdXJjZUNsYXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJHb3QgaXQhIjsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gTUVTU0FHRTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBMb2NhdG9yQW5kTWV0aG9kUmVzb3VyY2UuY2xhc3MsIEVtcHR5Um9vdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNvbmN1cnJlbnQgc3ViLXJlc291cmNlIGFjY2Vzcy4gKFNlZSBKRVJTRVktMTQyMSkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50U3ViUmVzb3VyY2VBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHN1YlJlc291cmNlID0gdGFyZ2V0KCJyb290L3N1Yi9zdWIyIik7CisKKyAgICAgICAgZmluYWwgaW50IE1BWCA9IDI1OworCisgICAgICAgIGZpbmFsIExpc3Q8RnV0dXJlPFN0cmluZz4+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PEZ1dHVyZTxTdHJpbmc+PihNQVgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRzLmFkZChzdWJSZXNvdXJjZS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEZ1dHVyZTxTdHJpbmc+IHJlc3VsdEZ1dHVyZSA6IHJlc3VsdHMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdWJSZXNvdXJjZS5NRVNTQUdFLCByZXN1bHRGdXR1cmUuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdWJSZXNvdXJjZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJvb3Qvc3ViL3N1YjIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3ViUmVzb3VyY2UuTUVTU0FHRSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgicm9vdC9zdWIvc3ViMiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdWJSZXNvdXJjZS5NRVNTQUdFLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3ViUmVzb3VyY2VXaXRob3V0UGF0aFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJvb3Qvc3ViIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN1YlJlc291cmNlLk1FU1NBR0UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyb290L3N1Yi9zb21lL3BhdGgiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzb3VyY2UuR0VULCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJvb3Qvc3ViL3N1YjIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwb3N0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvLyB0aGlzIHJlc291cmNlIGNsYXNzIHdpbGwgcmVwb3J0IHdhcm5pbmcgZHVyaW5nIHZhbGlkYXRpb24sIGJ1dCBzaG91bGQgYmUgbG9hZGVkCisgICAgQFBhdGgoImxvY2F0b3ItYW5kLW1ldGhvZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2NhdG9yQW5kTWV0aG9kUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgUG9zdFN1YlJlc291cmNlIGdldFN1YlJlc291cmNlU3ViKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3N0U3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiLyIpCisgICAgICAgIHB1YmxpYyBQb3N0U3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb3N0U3ViUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJmYWlsOiBsb2NhdG9yIGdldCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkICEhISI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIHBvc3QpIHsKKyAgICAgICAgICAgIHJldHVybiAiZmFpbDogcG9zdCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkICEhISI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJpbm5lciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5uZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImlubmVyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldElzQ2FsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJsb2NhdG9yLWFuZC1tZXRob2QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldElzQ2FsbGVkSW5TdWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImxvY2F0b3ItYW5kLW1ldGhvZC9zdWIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldElzQ2FsbGVkSW5Jbm5lcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibG9jYXRvci1hbmQtbWV0aG9kL2lubmVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaW5uZXIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldElzQ2FsbGVkSW5TdWJJbm5lcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibG9jYXRvci1hbmQtbWV0aG9kL3N1Yi9pbm5lciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImlubmVyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0U2hvdWxkTmV2ZXJCZUNhbGxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibG9jYXRvci1hbmQtbWV0aG9kIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgicG9zdCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuTUVUSE9EX05PVF9BTExPV0VELmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RTaG91bGROZXZlckJlQ2FsbGVkSW5TdWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImxvY2F0b3ItYW5kLW1ldGhvZC9zdWIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5NRVRIT0RfTk9UX0FMTE9XRUQuZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFBhdGgoImVtcHR5LXJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlSb290UmVzb3VyY2UgeworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbEVtcHR5UmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImVtcHR5LXJvb3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORC5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5U3ViUmVzb3VyY2VDbGFzcyB7CisgICAgICAgIC8vIGVtcHR5CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbEVtcHR5U3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImVtcHR5LWxvY2F0b3IiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORC5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TdWJqZWN0U2VjdXJpdHlDb250ZXh0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU3ViamVjdFNlY3VyaXR5Q29udGV4dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJkNTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU3ViamVjdFNlY3VyaXR5Q29udGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTm90QWNjZXB0YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TdWJqZWN0U2VjdXJpdHlDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBzdWJqZWN0IGJhc2VkIHNlY3VyaXR5IGNvbnRleHQuIE1ha2Ugc3VyZSByZXNvdXJjZQorICogYW5kIHN1Yi1yZXNvdXJjZSBtZXRob2RzL2xvY2F0b3JzIGFyZSBpbnZva2VkCisgKiB2aWEge0BsaW5rIFN1YmplY3RTZWN1cml0eUNvbnRleHQjZG9Bc1N1YmplY3QoamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uKX0gbWV0aG9kLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFN1YmplY3RTZWN1cml0eUNvbnRleHRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvLyBhY3R1YWwgZmlsdGVyIHJlZmVyZW5jZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbnZvY2F0aW9ucworICAgIFN1YmplY3RTZWN1cml0eUNvbnRleHRTZXR0aW5nRmlsdGVyIHN1YmplY3RGaWx0ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhzdWJqZWN0RmlsdGVyID0gbmV3IFN1YmplY3RTZWN1cml0eUNvbnRleHRTZXR0aW5nRmlsdGVyKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvcmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyByZXNvdXJjZUdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVzb3VyY2UgR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWJyZXNvdXJjZSIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWJyZXNvdXJjZS13YWUiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2VFeCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKFJlc3BvbnNlLm5vdEFjY2VwdGFibGUobnVsbCkuZW50aXR5KCJOb3QgQWNjZXB0YWJsZSBTUkwiKS5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWItZ2V0IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVzb3VyY2Ugc3ViLUdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViLWdldC13YWUiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViRXgoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbihSZXNwb25zZS5ub3RBY2NlcHRhYmxlKG51bGwpLmVudGl0eSgiTm90IEFjY2VwdGFibGUgUmVzb3VyY2Ugc3ViLUdFVCIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBzdWJSZXNvdXJjZUdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiU3ViUmVzb3VyY2UgR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ3YWUiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc3ViUmVzb3VyY2VHZXRFeCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKFJlc3BvbnNlLm5vdEFjY2VwdGFibGUobnVsbCkuZW50aXR5KCJOb3QgQWNjZXB0YWJsZSBTdWJSZXNvdXJjZSBHRVQiKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSBTdWJqZWN0U2VjdXJpdHlDb250ZXh0IHRoYXQga2VlcHMgbnVtYmVyIG9mIGRvQXNTdWJqZWN0IGludm9jYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTdWJqZWN0U2VjdXJpdHlDb250ZXh0IGltcGxlbWVudHMgU3ViamVjdFNlY3VyaXR5Q29udGV4dCB7CisKKyAgICAgICAgLy8gbm8gaGl0cyBzbyBmYXIKKyAgICAgICAgaW50IGhpdHMgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGRvQXNTdWJqZWN0KFByaXZpbGVnZWRBY3Rpb24gYWN0aW9uKSB7CisgICAgICAgICAgICBoaXRzKys7CisgICAgICAgICAgICByZXR1cm4gYWN0aW9uLnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIGZpbHRlciB0byBzZXQgdGhlIGN1c3RvbSBzdWJqZWN0IHNlY3VyaXR5IGNvbnRleHQgb24gZXZlcnkgcmVxdWVzdCBiZWZvcmUgdGhlIHJlcXVlc3QgZ2V0IG1hdGNoZWQsCisgICAgICogc28gdGhhdCBzdWItcmVzb3VyY2UgbG9jYXRvciBpbnZvY2F0aW9ucyBoYXZlIGEgY2hhbmNlIHRvIHNlZSB0aGUgc3ViamVjdCBzZWN1cml0eSBjb250ZXh0IHNldC4KKyAgICAgKi8KKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YmplY3RTZWN1cml0eUNvbnRleHRTZXR0aW5nRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNeVN1YmplY3RTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0ID0gbmV3IE15U3ViamVjdFNlY3VyaXR5Q29udGV4dCgpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRTZWN1cml0eUNvbnRleHQoc2VjdXJpdHlDb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm92aWRlIGFjdHVhbCBkb0FzU3ViamVjdCBoaXQgY291bnQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGRvQXNTdWJqZWN0IGludm9jYXRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRIaXRzKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlY3VyaXR5Q29udGV4dC5oaXRzOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdFNlY3VyaXR5Q29udGV4dCgpIHsKKworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgiL3Jlc291cmNlIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiUmVzb3VyY2UgR0VUIikpOworICAgICAgICBhc3NlcnRUaGF0KHN1YmplY3RGaWx0ZXIuZ2V0SGl0cygpLCBlcXVhbFRvKDEpKTsgLy8gb25lIHJlc291cmNlIG1ldGhvZCBpbnZva2VkCisKKyAgICAgICAgYXNzZXJ0VGhhdChyLnBhdGgoInN1YnJlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJTdWJSZXNvdXJjZSBHRVQiKSk7CisgICAgICAgIGFzc2VydFRoYXQoc3ViamVjdEZpbHRlci5nZXRIaXRzKCksIGVxdWFsVG8oMykpOyAvLyArIG9uZSBzdWItcmVzb3VyY2UgbG9jYXRvciBhbmQgb25lIHJlc291cmNlIG1ldGhvZCBpbnZva2VkCisKKyAgICAgICAgYXNzZXJ0VGhhdCgiUmVzb3VyY2Ugc3ViLUdFVCIsIGVxdWFsVG8oci5wYXRoKCJzdWItZ2V0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKSk7CisgICAgICAgIGFzc2VydFRoYXQoc3ViamVjdEZpbHRlci5nZXRIaXRzKCksIGVxdWFsVG8oNCkpOyAvLyArIG9uZSBzdWItcmVzb3VyY2UgbWV0aG9kIGludm9rZWQKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IHIucGF0aCgic3ViLWdldC13YWUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oUmVzcG9uc2UuU3RhdHVzLk5PVF9BQ0NFUFRBQkxFLmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiTm90IEFjY2VwdGFibGUgUmVzb3VyY2Ugc3ViLUdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJqZWN0RmlsdGVyLmdldEhpdHMoKSwgZXF1YWxUbyg1KSk7IC8vICsgb25lIHN1Yi1yZXNvdXJjZSBtZXRob2QgaW52b2tlZAorCisgICAgICAgIHJlc3BvbnNlID0gci5wYXRoKCJzdWJyZXNvdXJjZS13YWUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oUmVzcG9uc2UuU3RhdHVzLk5PVF9BQ0NFUFRBQkxFLmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiTm90IEFjY2VwdGFibGUgU1JMIikpOworICAgICAgICBhc3NlcnRUaGF0KHN1YmplY3RGaWx0ZXIuZ2V0SGl0cygpLCBlcXVhbFRvKDYpKTsKKworICAgICAgICByZXNwb25zZSA9IHIucGF0aCgic3VicmVzb3VyY2Uvd2FlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKFJlc3BvbnNlLlN0YXR1cy5OT1RfQUNDRVBUQUJMRS5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIk5vdCBBY2NlcHRhYmxlIFN1YlJlc291cmNlIEdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJqZWN0RmlsdGVyLmdldEhpdHMoKSwgZXF1YWxUbyg4KSk7IC8vICsgb25lIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIGFuZCBvbmUgcmVzb3VyY2UgbWV0aG9kIGludm9rZWQKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9VcmlCdWlsZGVyVGVtcGxhdGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9VcmlCdWlsZGVyVGVtcGxhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMwYzgyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1VyaUJ1aWxkZXJUZW1wbGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0aW5nIFVSSSB0ZW1wbGF0ZSBhcyBhbiBlMmUgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgVXJpQnVpbGRlclRlbXBsYXRlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bWVyaWNSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L251bWVyaWMvNTUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIFN0cmluZyB1cmkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC9udW1lcmljLzU1IiwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2FueS9nZXROdW1lcmljUmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIFN0cmluZyB1cmkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC9udW1lcmljLzExIiwgdXJpKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoIm51bWVyaWMveyByZXNvdXJjZU5vIDogXFxkK30iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TnVtZXJpY1Jlc291cmNlKEBQYXRoUGFyYW0oInJlc291cmNlTm8iKSBpbnQgcmVzb3VyY2VObykgeworICAgICAgICAgICAgVVJJIGFueVJlc291cmNlVXJpID0gVXJpQnVpbGRlci5mcm9tUmVzb3VyY2UoUmVzb3VyY2UuY2xhc3MpLnBhdGgoUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICJnZXROdW1lcmljUmVzb3VyY2UiKS5idWlsZChyZXNvdXJjZU5vKTsKKyAgICAgICAgICAgIHJldHVybiBhbnlSZXNvdXJjZVVyaS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImFueS97cmVzb3VyY2VOYW1lfSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbnlSZXNvdXJjZShAUGF0aFBhcmFtKCJyZXNvdXJjZU5hbWUiKSBTdHJpbmcgcmVzb3VyY2VOYW1lKSB7CisgICAgICAgICAgICBVUkkgbnVtUmVzb3VyY2VVcmkgPSBVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShSZXNvdXJjZS5jbGFzcykucGF0aChSZXNvdXJjZS5jbGFzcywgImdldE51bWVyaWNSZXNvdXJjZSIpLmJ1aWxkKDExKTsKKyAgICAgICAgICAgIHJldHVybiBudW1SZXNvdXJjZVVyaS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUZW1wbGF0ZSgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbWFwLnB1dCgiYSIsICJ4eXoiKTsKKyAgICAgICAgbWFwLnB1dChudWxsLCAicGF0aCIpOworICAgICAgICBVcmlCdWlsZGVyIGJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCIiKS5wYXRoKCJ7YX0ve2J9Iik7CisgICAgICAgIGJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlcyhtYXApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1dlYkFwcGxpY2F0aW9uRXhjZXB0aW9uTG9nZ2luZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1dlYkFwcGxpY2F0aW9uRXhjZXB0aW9uTG9nZ2luZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjA3MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvV2ViQXBwbGljYXRpb25FeGNlcHRpb25Mb2dnaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3RzIHRoYXQge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSBpcyBsb2dnZWQgb24gdGhlIGNvcnJlY3QgbGV2ZWwuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgV2ViQXBwbGljYXRpb25FeGNlcHRpb25Mb2dnaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXR1c1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdChATm90TnVsbCBAUXVlcnlQYXJhbSgiaWQiKSBmaW5hbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiAib2siOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiV0FFLW5vLWVudGl0eSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdFdpdGhvdXRFbnRpdHkoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oIldBRSB3aXRob3V0IGVudGl0eSIsIFJlc3BvbnNlLnN0YXR1cyg0MDApLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiV0FFLWVudGl0eSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdFdpdGhFbnRpdHkoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oIldBRSB3aXRoIGVudGl0eSIsIFJlc3BvbnNlLnN0YXR1cyg0MDApLmVudGl0eSgiV0FFIHdpdGggZW50aXR5IikuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRpb25FeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VmFsaWRhdGlvbkV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBWYWxpZGF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDIwMCkuZW50aXR5KCJFcnJvciBtYXBwZWQ6ICIgKyBleC50b1N0cmluZygpKS50eXBlKCJ0ZXh0L3BsYWluIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5GSU5FUi5pbnRWYWx1ZSgpKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFN0YXR1c1Jlc291cmNlLmNsYXNzLCBWYWxpZGF0aW9uRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExvZ1JlY29yZCBnZXRMb2dSZWNvcmQoZmluYWwgU3RyaW5nIG1lc3NhZ2VQcmVmaXgpIHsKKyAgICAgICAgZm9yIChmaW5hbCBMb2dSZWNvcmQgbG9nUmVjb3JkIDogZ2V0TG9nZ2VkUmVjb3JkcygpKSB7CisgICAgICAgICAgICBpZiAobG9nUmVjb3JkLmdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGxvZ1JlY29yZC5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChtZXNzYWdlUHJlZml4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2dSZWNvcmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuc3RhcnRzV2l0aCgiRXJyb3IgbWFwcGVkOiIpKTsKKworICAgICAgICAvLyBjaGVjayBsb2dzCisgICAgICAgIGZpbmFsIExvZ1JlY29yZCBsb2dSZWNvcmQgPSB0aGlzLmdldExvZ1JlY29yZCgiU3RhcnRpbmcgbWFwcGluZyBvZiB0aGUgZXhjZXB0aW9uIik7CisgICAgICAgIGFzc2VydE5vdE51bGwobG9nUmVjb3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExldmVsLkZJTkVSLCBsb2dSZWNvcmQuZ2V0TGV2ZWwoKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGVyZSBpcyBubyBleGNlcHRpb24gbG9nZ2VkIG9uIHRoZSBsZXZlbCBoaWdoZXIgdGhhbiBGSU5FCisgICAgICAgIGZvciAoZmluYWwgTG9nUmVjb3JkIHJlY29yZCA6IGdldExvZ2dlZFJlY29yZHMoKSkgeworICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRUaHJvd24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWNvcmQuZ2V0TGV2ZWwoKS5pbnRWYWx1ZSgpIDw9IExldmVsLkZJTkUuaW50VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdBRVdpdGhFbnRpdHkoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9XQUUtZW50aXR5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiV0FFIHdpdGggZW50aXR5IiwgZW50aXR5KTsKKworICAgICAgICAvLyBjaGVjayBsb2dzCisgICAgICAgIExvZ1JlY29yZCBsb2dSZWNvcmQgPSB0aGlzLmdldExvZ1JlY29yZCgiU3RhcnRpbmcgbWFwcGluZyBvZiB0aGUgZXhjZXB0aW9uIik7CisgICAgICAgIGFzc2VydE5vdE51bGwobG9nUmVjb3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExldmVsLkZJTkVSLCBsb2dSZWNvcmQuZ2V0TGV2ZWwoKSk7CisKKyAgICAgICAgbG9nUmVjb3JkID0gdGhpcy5nZXRMb2dSZWNvcmQoIldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIChXQUUpIHdpdGggbm9uLW51bGwgZW50aXR5IHRocm93bi4iKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChsb2dSZWNvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGV2ZWwuRklORSwgbG9nUmVjb3JkLmdldExldmVsKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxvZ1JlY29yZC5nZXRUaHJvd24oKSBpbnN0YW5jZW9mIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKTsKKyAgICAgICAgbG9nUmVjb3JkLmdldFRocm93bigpLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdBRVdpdGhvdXRFbnRpdHkoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9XQUUtbm8tZW50aXR5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKworICAgICAgICAvLyBjaGVjayBsb2dzCisgICAgICAgIExvZ1JlY29yZCBsb2dSZWNvcmQgPSB0aGlzLmdldExvZ1JlY29yZCgiU3RhcnRpbmcgbWFwcGluZyBvZiB0aGUgZXhjZXB0aW9uIik7CisgICAgICAgIGFzc2VydE5vdE51bGwobG9nUmVjb3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExldmVsLkZJTkVSLCBsb2dSZWNvcmQuZ2V0TGV2ZWwoKSk7CisKKyAgICAgICAgbG9nUmVjb3JkID0gdGhpcy5nZXRMb2dSZWNvcmQoIldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIChXQUUpIHdpdGggbm8gZW50aXR5IHRocm93biBhbmQgbm8iKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChsb2dSZWNvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGV2ZWwuRklORSwgbG9nUmVjb3JkLmdldExldmVsKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxvZ1JlY29yZC5nZXRUaHJvd24oKSBpbnN0YW5jZW9mIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKTsKKyAgICAgICAgbG9nUmVjb3JkLmdldFRocm93bigpLnByaW50U3RhY2tUcmFjZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9Qb3N0VG9QdXREZWxldGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvUG9zdFRvUHV0RGVsZXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNDE1OWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvUG9zdFRvUHV0RGVsZXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFBvc3RUb1B1dERlbGV0ZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBRdWVyeVBhcmFtKCJhIikgU3RyaW5nIGEpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUOiAiICsgYTsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIlBVVCI7CisgICAgICAgIH0KKworICAgICAgICBAREVMRVRFCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVsZXRlKCkgeworICAgICAgICAgICAgcmV0dXJuICJERUxFVEUiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuICJQT1NUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLmNsYXNzLCBSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBhc3NlcnRSZXNwb25zZUVxdWFscygiUFVULFBVVCxQVVQsIiwgX3Rlc3QoIlBVVCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB7CisgICAgICAgIGFzc2VydFJlc3BvbnNlRXF1YWxzKCJERUxFVEUsREVMRVRFLERFTEVURSwiLCBfdGVzdCgiREVMRVRFIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VFcXVhbHMoIkdFVDogdGVzdCxHRVQ6IHRlc3QsR0VUOiB0ZXN0LCIsIF90ZXN0KCJHRVQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmxpY3RpbmdNZXRob2RzKCkgeworICAgICAgICBSZXNwb25zZSBjciA9IHRhcmdldCgiLyIpLnF1ZXJ5UGFyYW0oIl9tZXRob2QiLCAiUFVUIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiWC1IVFRQLU1ldGhvZC1PdmVycmlkZSIsICJERUxFVEUiKS5wb3N0KEVudGl0eS50ZXh0KCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE1ldGhvZCgpIHsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VFcXVhbHMoIjQwNSw0MDUsNDA1LCIsIF90ZXN0KCJQQVRDSCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoUXVlcnlQYXJhbSgpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgpLnF1ZXJ5UGFyYW0oIl9tZXRob2QiLCAiR0VUIikucXVlcnlQYXJhbSgiYSIsICJ0ZXN0IikucmVxdWVzdCgpLnBvc3QobnVsbCwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQ6IHRlc3QiLCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpdGhPdGhlckVudGl0eSgpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgpLnF1ZXJ5UGFyYW0oIl9tZXRob2QiLCAiR0VUIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoImE9dGVzdCIpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVDogbnVsbCIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhaW5Qb3N0KCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QobnVsbCwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzcG9uc2VbXSBfdGVzdChTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIFJlc3BvbnNlW10gcmVzdWx0ID0gbmV3IFJlc3BvbnNlWzNdOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisKKyAgICAgICAgcmVzdWx0WzBdID0gdGFyZ2V0LnJlcXVlc3QoKS5oZWFkZXIoIlgtSFRUUC1NZXRob2QtT3ZlcnJpZGUiLCBtZXRob2QpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmZvcm0obmV3IEZvcm0oKS5wYXJhbSgiYSIsICJ0ZXN0IikpKTsKKyAgICAgICAgcmVzdWx0WzFdID0gdGFyZ2V0LnF1ZXJ5UGFyYW0oIl9tZXRob2QiLCBtZXRob2QpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCkucGFyYW0oImEiLCAidGVzdCIpKSk7CisgICAgICAgIHJlc3VsdFsyXSA9IHRhcmdldC5xdWVyeVBhcmFtKCJfbWV0aG9kIiwgbWV0aG9kKS5yZXF1ZXN0KCkuaGVhZGVyKCJYLUhUVFAtTWV0aG9kLU92ZXJyaWRlIiwgbWV0aG9kKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCkucGFyYW0oImEiLCAidGVzdCIpKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXNzZXJ0UmVzcG9uc2VFcXVhbHMoU3RyaW5nIGV4cGVjdGVkLCBSZXNwb25zZVtdIHJlc3BvbnNlcykgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgZm9yIChSZXNwb25zZSByIDogcmVzcG9uc2VzKSB7CisgICAgICAgICAgICBpZiAoci5nZXRTdGF0dXMoKSA9PSBSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoci5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIsIik7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvUm9sZXNBbGxvd2VkVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1JvbGVzQWxsb3dlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRhNmYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1JvbGVzQWxsb3dlZFRlc3QuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuRGVueUFsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LlBlcm1pdEFsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LlJvbGVzQWxsb3dlZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLlJvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFJvbGVzQWxsb3dlZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQcmVNYXRjaGluZworICAgIEBQcmlvcml0eShQcmlvcml0aWVzLkFVVEhFTlRJQ0FUSU9OKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VjdXJpdHlGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVzZXIgPSByZXF1ZXN0LmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiWC1VU0VSIik7CisgICAgICAgICAgICByZXF1ZXN0LnNldFNlY3VyaXR5Q29udGV4dChuZXcgQXV0aGVudGljYXRvcih1c2VyKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBdXRoZW50aWNhdG9yIGltcGxlbWVudHMgU2VjdXJpdHlDb250ZXh0IHsKKworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcmluY2lwYWwgcHJpbmNpcGFsOworCisgICAgICAgICAgICBBdXRoZW50aWNhdG9yKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgcHJpbmNpcGFsID0gbmFtZSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJpbmNpcGFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoZmluYWwgU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcm9sZS5lcXVhbHMocHJpbmNpcGFsLmdldE5hbWUoKSkgfHwgKCJ1c2VyIi5lcXVhbHMocm9sZSkgJiYgImFkbWluIi5lcXVhbHMocHJpbmNpcGFsLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBQZXJtaXRBbGwKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUm9sZXNBbGxvd2VkKCJ1c2VyIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBSb2xlc0FsbG93ZWQoImFkbWluIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUm9sZXNBbGxvd2VkKCJhZG1pbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImRlbnktYWxsIikKKyAgICAgICAgQERlbnlBbGwKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlbnlBbGwoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgicGVybWl0LWFsbCIpCisgICAgICAgIEBQZXJtaXRBbGwKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBlcm1pdEFsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIFJvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlLmNsYXNzLCBTZWN1cml0eUZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXNVc2VyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHRhcmdldCgpLnJlcXVlc3QoKS5oZWFkZXIoIlgtVVNFUiIsICJ1c2VyIikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFzQWRtaW4oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgdGFyZ2V0KCkucmVxdWVzdCgpLmhlYWRlcigiWC1VU0VSIiwgImFkbWluIikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RBc1VzZXIoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNyID0gdGFyZ2V0KCkucmVxdWVzdCgpLmhlYWRlcigiWC1VU0VSIiwgInVzZXIiKS5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAzLCBjci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdEFzQWRtaW4oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiUE9TVCIsIHRhcmdldCgpLnJlcXVlc3QoKS5oZWFkZXIoIlgtVVNFUiIsICJhZG1pbiIpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSwgU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVueUFsbCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMywgdGFyZ2V0KCJzdWIvZGVueS1hbGwiKS5yZXF1ZXN0KCkuaGVhZGVyKCJYLVVTRVIiLCAiYWRtaW4iKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVybWl0QWxsKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHRhcmdldCgic3ViL3Blcm1pdC1hbGwiKS5yZXF1ZXN0KCkuaGVhZGVyKCJYLVVTRVIiLCAieHl6IikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdEF1dGhvcml6ZWQoKSB7CisgICAgICAgIGFzc2VydFRoYXQoIlVzZXIgc2hvdWxkIG5vdCBiZSBhdXRob3JpemVkLiIsIHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoNDAzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlTmVnYXRpdmVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTGFuZ3VhZ2VNZWRpYVR5cGVOZWdhdGl2ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzE5MWRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlTmVnYXRpdmVUZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBObyBhY3RpdmF0aW9uIHByb3BlcnR5ICh7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI0xBTkdVQUdFX01BUFBJTkdTfSwKKyAqIHtAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjTUVESUFfVFlQRV9NQVBQSU5HU30pIGlzIHNldCBpbnRvIHtAbGluayBSZXNvdXJjZUNvbmZpZ30gd2hpY2ggc2hvdWxkCisgKiBsZWFkIHRvIHBvaW50IHRoYXQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuVXJpQ29ubmVnRmlsdGVyfSBpcyBub3QgcmVnaXN0ZXJlZC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFVyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlTmVnYXRpdmVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiL2FiYyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYW5ndWFnZVZhcmlhbnRSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZG9HZXQoQENvbnRleHQgUmVxdWVzdCByKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFZhcmlhbnQ+IHZhcmlhbnRzID0gVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIikpCisgICAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iKSkubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImZyIikpLmFkZCgpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9iYXIiKSkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIpKS5sYW5ndWFnZXMobmV3IExvY2FsZSgiZnIiKSkuYWRkKCkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFZhcmlhbnQgdmFyaWFudCA9IHIuc2VsZWN0VmFyaWFudCh2YXJpYW50cyk7CisgICAgICAgICAgICBpZiAodmFyaWFudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vdEFjY2VwdGFibGUodmFyaWFudHMpLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayh2YXJpYW50LmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkgKyAiLCAiICsgdmFyaWFudC5nZXRMYW5ndWFnZSgpLCB2YXJpYW50KS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhMYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5jbGFzcykucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZXNBbmRMYW5ndWFnZXNOZWdhdGl2ZSgpIHsKKyAgICAgICAgX3Rlc3QoImVuZ2xpc2giLCAiZm9vIiwgImVuIiwgImFwcGxpY2F0aW9uL2ZvbyIpOworICAgICAgICBfdGVzdCgiZnJlbmNoIiwgImZvbyIsICJmciIsICJhcHBsaWNhdGlvbi9mb28iKTsKKworICAgICAgICBfdGVzdCgiZW5nbGlzaCIsICJiYXIiLCAiZW4iLCAiYXBwbGljYXRpb24vYmFyIik7CisgICAgICAgIF90ZXN0KCJmcmVuY2giLCAiYmFyIiwgImZyIiwgImFwcGxpY2F0aW9uL2JhciIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChTdHJpbmcgdWwsIFN0cmluZyB1bSwgU3RyaW5nIGwsIFN0cmluZyBtKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYWJjLiIgKyB1bCArICIuIiArIHVtKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFiYy4iICsgdW0gKyAiLiIgKyB1bCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhYmMiKS5yZXF1ZXN0KG0pLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfTEFOR1VBR0UsIGwpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobSArICIsICIgKyBsLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMobCwgcmVzcG9uc2UuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0sIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdMYW5ndWFnZU1lZGlhVHlwZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdMYW5ndWFnZU1lZGlhVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzViNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlZhcmlhbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlDb25uZWdMYW5ndWFnZU1lZGlhVHlwZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCIvYWJjIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExhbmd1YWdlVmFyaWFudFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkb0dldChAQ29udGV4dCBSZXF1ZXN0IHIpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8VmFyaWFudD4gdmFyaWFudHMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKSkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIpKS5sYW5ndWFnZXMobmV3IExvY2FsZSgiZnIiKSkuYWRkKCkKKyAgICAgICAgICAgICAgICAgICAgLm1lZGlhVHlwZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIikpLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJmciIpKS5hZGQoKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgZmluYWwgVmFyaWFudCB2YXJpYW50ID0gci5zZWxlY3RWYXJpYW50KHZhcmlhbnRzKTsKKyAgICAgICAgICAgIGlmICh2YXJpYW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90QWNjZXB0YWJsZSh2YXJpYW50cykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHZhcmlhbnQuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSArICIsICIgKyB2YXJpYW50LmdldExhbmd1YWdlKCksIHZhcmlhbnQpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBNZWRpYVR5cGU+IG1lZGlhVHlwZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIG1lZGlhVHlwZXMucHV0KCJmb28iLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIikpOworICAgICAgICBtZWRpYVR5cGVzLnB1dCgiYmFyIiwgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxhbmd1YWdlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbGFuZ3VhZ2VzLnB1dCgiZW5nbGlzaCIsICJlbiIpOworICAgICAgICBsYW5ndWFnZXMucHV0KCJmcmVuY2giLCAiZnIiKTsKKworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhMYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTEFOR1VBR0VfTUFQUElOR1MsIGxhbmd1YWdlcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTUVESUFfVFlQRV9NQVBQSU5HUywgbWVkaWFUeXBlcyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGVzQW5kTGFuZ3VhZ2VzKCkgeworICAgICAgICBfdGVzdCgiZW5nbGlzaCIsICJmb28iLCAiZW4iLCAiYXBwbGljYXRpb24vZm9vIik7CisgICAgICAgIF90ZXN0KCJmcmVuY2giLCAiZm9vIiwgImZyIiwgImFwcGxpY2F0aW9uL2ZvbyIpOworCisgICAgICAgIF90ZXN0KCJlbmdsaXNoIiwgImJhciIsICJlbiIsICJhcHBsaWNhdGlvbi9iYXIiKTsKKyAgICAgICAgX3Rlc3QoImZyZW5jaCIsICJiYXIiLCAiZnIiLCAiYXBwbGljYXRpb24vYmFyIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KFN0cmluZyB1bCwgU3RyaW5nIHVtLCBTdHJpbmcgbCwgU3RyaW5nIG0pIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoImFiYy4iICsgdWwgKyAiLiIgKyB1bSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobSArICIsICIgKyBsLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsLCByLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtLCByLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHIgPSB0YXJnZXQoKS5wYXRoKCJhYmMuIiArIHVtICsgIi4iICsgdWwpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0gKyAiLCAiICsgbCwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMobCwgci5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobSwgci5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKworICAgICAgICByID0gdGFyZ2V0KCkucGF0aCgiYWJjIikucmVxdWVzdChtKS5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0xBTkdVQUdFLCBsKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0gKyAiLCAiICsgbCwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMobCwgci5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobSwgci5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTGFuZ3VhZ2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTGFuZ3VhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViNTM3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdMYW5ndWFnZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5WYXJpYW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgVXJpQ29ubmVnTGFuZ3VhZ2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiL2FiYyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYW5ndWFnZVZhcmlhbnRSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZG9HZXQoQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0LCBAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXJzLmdldEFjY2VwdGFibGVMYW5ndWFnZXMoKS5zaXplKCkpOworCisgICAgICAgICAgICBMaXN0PFZhcmlhbnQ+IHZzID0gVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoInpoIikpCisgICAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZnIiKSkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIpKS5hZGQoKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgVmFyaWFudCB2ID0gcmVxdWVzdC5zZWxlY3RWYXJpYW50KHZzKTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90QWNjZXB0YWJsZSh2cykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHYuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpLCB2KS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBsYW5ndWFnZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGxhbmd1YWdlcy5wdXQoImVuZ2xpc2giLCAiZW4iKTsKKyAgICAgICAgbGFuZ3VhZ2VzLnB1dCgiZnJlbmNoIiwgImZyIik7CisKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTLCBsYW5ndWFnZXMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFuZ3VhZ2VzKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFiYy5lbmdsaXNoIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIHJlc3BvbnNlLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhYmMuZnJlbmNoIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmciIsIHJlc3BvbnNlLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhYmMuZnJlbmNoIikucmVxdWVzdCgpLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfTEFOR1VBR0UsICJlbiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmciIsIHJlc3BvbnNlLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhYmMiKS5yZXF1ZXN0KCkuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgImVuIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgcmVzcG9uc2UuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFiYyIpLnJlcXVlc3QoKS5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0xBTkdVQUdFLCAiZnIiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmciIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZnIiLCByZXNwb25zZS5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdNYXBwaW5nRnJvbVByb3BlcnR5LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTWFwcGluZ0Zyb21Qcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGVkNDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTWFwcGluZ0Zyb21Qcm9wZXJ0eS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgVXJpQ29ubmVnTWFwcGluZ0Zyb21Qcm9wZXJ0eSBleHRlbmRzIFVyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhVcmlDb25uZWdMYW5ndWFnZU1lZGlhVHlwZVRlc3QuTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FRElBX1RZUEVfTUFQUElOR1MsICJmb28gOiBhcHBsaWNhdGlvbi9mb28sIGJhciA6IGFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTLCAiZW5nbGlzaCA6IGVuLCBmcmVuY2ggOiBmciIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ01hcHBpbmdGcm9tU3RyaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ01hcHBpbmdGcm9tU3RyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTA2MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTWFwcGluZ0Zyb21TdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlDb25uZWdNYXBwaW5nRnJvbVN0cmluZ1Rlc3QgZXh0ZW5kcyBVcmlDb25uZWdMYW5ndWFnZU1lZGlhVHlwZVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTLCAgImVuZ2xpc2ggOiBlbiwgZnJlbmNoIDogZnIiKTsKKyAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NRURJQV9UWVBFX01BUFBJTkdTLCAiZm9vIDogYXBwbGljYXRpb24vZm9vLCBiYXIgOiBhcHBsaWNhdGlvbi9iYXIiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdNZWRpYVR5cGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTWVkaWFUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDJhMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTWVkaWFUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlDb25uZWdNZWRpYVR5cGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBNZWRpYVR5cGU+IG1lZGlhVHlwZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIG1lZGlhVHlwZXMucHV0KCJmb28iLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIikpOworICAgICAgICBtZWRpYVR5cGVzLnB1dCgiYmFyIiwgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpKTsKKyAgICAgICAgbWVkaWFUeXBlcy5wdXQoImZvb3QiLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vdCIpKTsKKworICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgZm9yIChDbGFzczw/PiBjIDogVXJpQ29ubmVnTWVkaWFUeXBlVGVzdC5jbGFzcy5nZXRDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgIGlmIChjLmdldEFubm90YXRpb24oUGF0aC5jbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoY2xhc3Nlcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTUVESUFfVFlQRV9NQVBQSU5HUywgbWVkaWFUeXBlcyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEJhc2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZvbyhAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVycy5nZXRBY2NlcHRhYmxlTWVkaWFUeXBlcygpLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImZvbyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGb290KCkgeworICAgICAgICAgICAgcmV0dXJuICJmb290IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0QmFyKCkgeworICAgICAgICAgICAgcmV0dXJuICJiYXIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9hYmMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xlU2VnbWVudCBleHRlbmRzIEJhc2UgeworICAgIH0KKworICAgIEBQYXRoKCIveHl6LyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVTZWdtZW50U2xhc2ggZXh0ZW5kcyBCYXNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiL3h5ei9hYmMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXVsdGlwbGVTZWdtZW50cyBleHRlbmRzIEJhc2UgeworICAgIH0KKworICAgIEBQYXRoKCIveHl6L3h4eC8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXVsdGlwbGVTZWdtZW50c1NsYXNoIGV4dGVuZHMgQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi94eXovYWJjLnhtbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3RQcmVmaXhTZWdtZW50cyBleHRlbmRzIEJhc2UgeworICAgIH0KKworICAgIEBQYXRoKCIvZm9vX2Jhcl9mb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGhXaXRoU3VmZml4U2VnbWVudCBleHRlbmRzIEJhc2UgeworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlTWV0aG9kcyBleHRlbmRzIEJhc2UgeworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGb29TKCkgeworICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb290IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZvb3RTKCkgeworICAgICAgICAgICAgcmV0dXJuICJmb290IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJhclMoKSB7CisgICAgICAgICAgICByZXR1cm4gImJhciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlU2VnbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvIiwgImFiYyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVNlZ21lbnRTbGFzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvIiwgInh5eiIsICIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZWdtZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIveHl6IiwgImFiYyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU2VnbWVudHNTbGFzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIveHl6IiwgInh4eCIsICIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG90UHJlZml4U2VnbWVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBfdGVzdCgiL3h5eiIsICJhYmMueG1sIik7CisgICAgICAgIF90ZXN0KCIveHl6IiwgImFiYyIsICIueG1sIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WFhYU2VnbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvIiwgImZvb19iYXJfZm9vdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlTWV0aG9kcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvIiwgInN1YiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChTdHJpbmcgYmFzZSkgeworICAgICAgICBfdGVzdChiYXNlLCAiIiwgIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChTdHJpbmcgYmFzZSwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgX3Rlc3QoYmFzZSwgcGF0aCwgIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChTdHJpbmcgYmFzZSwgU3RyaW5nIHBhdGgsIFN0cmluZyB0ZXJtaW5hdGUpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoKS5wYXRoKGJhc2UpOworCisgICAgICAgIFN0cmluZyBzID0gci5wYXRoKHBhdGggKyAiLmZvbyIgKyB0ZXJtaW5hdGUpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBzKTsKKworICAgICAgICBzID0gci5wYXRoKHBhdGggKyAiLmZvbyIgKyB0ZXJtaW5hdGUpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2JhciIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHMpOworCisgICAgICAgIHMgPSByLnBhdGgocGF0aCArICIuZm9vdCIgKyB0ZXJtaW5hdGUpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb290Iiwgcyk7CisKKyAgICAgICAgcyA9IHIucGF0aChwYXRoICsgIi5iYXIiICsgdGVybWluYXRlKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgcyk7CisKKyAgICAgICAgcyA9IHIucGF0aChwYXRoICsgdGVybWluYXRlKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBzKTsKKworICAgICAgICBzID0gci5wYXRoKHBhdGggKyB0ZXJtaW5hdGUpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2Zvb3QiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb290Iiwgcyk7CisKKyAgICAgICAgcyA9IHIucGF0aChwYXRoICsgdGVybWluYXRlKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb287cT0wLjEiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL0FwcGxpY2F0aW9uSW5mb1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvQXBwbGljYXRpb25JbmZvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NmI5NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL0FwcGxpY2F0aW9uSW5mb1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25JbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICogVGhlIHRlc3QgdXNlcyBzZXJ2ZXIgcHJvcGVydGllcyB7QGxpbmsgU2VydmVyUHJvcGVydGllcyNNT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUR9LAorICoge0BsaW5rIFNlcnZlclByb3BlcnRpZXMjTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVEfSwKKyAqIHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI01PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRH0KKyAqIGFuZCBpdCBhbHNvIGltcGxlbWVudHMge0BsaW5rIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGV9IGFuZCB0ZXN0cyBpZiBpdCBpcyBwb3NzaWJsZSB0byBpbmplY3QKKyAqIHtAbGluayBBcHBsaWNhdGlvbkluZm99IGluIGRpZmZlcmVudCBjaXJjdW1zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25JbmZvVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUkNFX0VOQUJMRSA9ICJGT1JDRV9FTkFCTEUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfTU9OSVRPUklORyA9ICJFTkFCTEVfTU9OSVRPUklORyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9NT05JVE9SSU5HX1NUQVRJU1RJQ1MgPSAiRU5BQkxFX01PTklUT1JJTkdfU1RBVElTVElDUyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TID0gIkVOQUJMRV9NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TIjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgLy9mb3JjZSwgM3ggQXV0b0Rpc2NvdmVyYWJsZSwgM3ggUmVzb3VyY2VDb25maWcsICAgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAvLyBubyBwcm9wZXJ0eSBzZXQgPT4gNTAwCisgICAgICAgICAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsLCA1MDB9LAorICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IHNldCBieSBGb3JjZWRBdXRvRGlzY292ZXJhYmxlID0+IDIwMAorICAgICAgICAgICAgICAgIHtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsLCAyMDB9LAorICAgICAgICAgICAgICAgIHtmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBudWxsLCBudWxsLCBudWxsLCAyMDB9LAorICAgICAgICAgICAgICAgIHtmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsLCAyMDB9LAorICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGRpc2FibGUgYnkgUmVzb3VyY2VDb25maWcgPT4gNTAwCisgICAgICAgICAgICAgICAge2ZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDUwMH0sCisgICAgICAgICAgICAgICAge2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDUwMH0sCisgICAgICAgICAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDUwMH0sCisgICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgZGlzYWJsZSBieSBSZXNvdXJjZUNvbmZpZyBidXQgZm9yY2VkIGJ5IEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgPT4gMjAwCisgICAgICAgICAgICAgICAge3RydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMjAwfSwKKyAgICAgICAgICAgICAgICB7dHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAyMDB9LAorICAgICAgICAgICAgICAgIHt0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDIwMH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmVzcG9uc2VTdGF0dXM7CisKKyAgICBwdWJsaWMgQXBwbGljYXRpb25JbmZvVGVzdChib29sZWFuIGZvcmNlRW5hYmxlLCBib29sZWFuIGVuYWJsZU1vbml0b3JpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVNb25pdG9yaW5nU3RhdGlzdGljcywgYm9vbGVhbiBlbmFibGVNb25pdG9yaW5nU3RhdGlzdGljc01CZWFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuIG1vbml0b3JpbmdFbmFibGVkLCBCb29sZWFuIG1vbml0b3JpbmdTdGF0aXN0aWNzRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuIG1vbml0b3JpbmdTdGF0aXN0aWNzTUJlYW5zRW5hYmxlZCwgaW50IHJlc3BvbnNlU3RhdHVzKSB7CisgICAgICAgIHN1cGVyKGNyZWF0ZUFwcGxpY2F0aW9uKGZvcmNlRW5hYmxlLCBlbmFibGVNb25pdG9yaW5nLAorICAgICAgICAgICAgICAgIGVuYWJsZU1vbml0b3JpbmdTdGF0aXN0aWNzLCBlbmFibGVNb25pdG9yaW5nU3RhdGlzdGljc01CZWFucywKKyAgICAgICAgICAgICAgICBtb25pdG9yaW5nRW5hYmxlZCwgbW9uaXRvcmluZ1N0YXRpc3RpY3NFbmFibGVkLAorICAgICAgICAgICAgICAgIG1vbml0b3JpbmdTdGF0aXN0aWNzTUJlYW5zRW5hYmxlZCkpOworICAgICAgICB0aGlzLnJlc3BvbnNlU3RhdHVzID0gcmVzcG9uc2VTdGF0dXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb24gY3JlYXRlQXBwbGljYXRpb24oYm9vbGVhbiBmb3JjZUVuYWJsZSwgYm9vbGVhbiBlbmFibGVNb25pdG9yaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlTW9uaXRvcmluZ1N0YXRpc3RpY3MsIGJvb2xlYW4gZW5hYmxlTW9uaXRvcmluZ1N0YXRpc3RpY3NNQmVhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBtb25pdG9yaW5nRW5hYmxlZCwgQm9vbGVhbiBtb25pdG9yaW5nU3RhdGlzdGljc0VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBtb25pdG9yaW5nU3RhdGlzdGljc01CZWFuc0VuYWJsZWQpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkFQUExJQ0FUSU9OX05BTUUsICJ0ZXN0QXBwIik7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KEZPUkNFX0VOQUJMRSwgZm9yY2VFbmFibGUpOworICAgICAgICBpZiAoZW5hYmxlTW9uaXRvcmluZykgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoRU5BQkxFX01PTklUT1JJTkcsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChlbmFibGVNb25pdG9yaW5nU3RhdGlzdGljcykgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoRU5BQkxFX01PTklUT1JJTkdfU1RBVElTVElDUywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYWJsZU1vbml0b3JpbmdTdGF0aXN0aWNzTUJlYW5zKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShFTkFCTEVfTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOUywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vbml0b3JpbmdFbmFibGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19FTkFCTEVELCBtb25pdG9yaW5nRW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vbml0b3JpbmdTdGF0aXN0aWNzRW5hYmxlZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVELCBtb25pdG9yaW5nU3RhdGlzdGljc0VuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChtb25pdG9yaW5nU3RhdGlzdGljc01CZWFuc0VuYWJsZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIG1vbml0b3JpbmdTdGF0aXN0aWNzTUJlYW5zRW5hYmxlZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHJlc3BvbnNlU3RhdHVzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGlmIChyZXNwb25zZVN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRlc3RBcHAiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBQcm92aWRlcjxBcHBsaWNhdGlvbkluZm8+IGFwcGxpY2F0aW9uSW5mb1Byb3ZpZGVyOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBcHBOYW1lKCkgeworICAgICAgICAgICAgZmluYWwgQXBwbGljYXRpb25JbmZvIGFwcGxpY2F0aW9uSW5mbyA9IGFwcGxpY2F0aW9uSW5mb1Byb3ZpZGVyLmdldCgpOworICAgICAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uSW5mby5nZXRSZXNvdXJjZUNvbmZpZygpLmdldEFwcGxpY2F0aW9uTmFtZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorICAgIEBQcmlvcml0eShBdXRvRGlzY292ZXJhYmxlLkRFRkFVTFRfUFJJT1JJVFkgLSAxKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZUltcGwgaW1wbGVtZW50cyBGb3JjZWRBdXRvRGlzY292ZXJhYmxlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZm9yY2VFbmFibGUgPSBQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoRk9SQ0VfRU5BQkxFKSk7CisgICAgICAgICAgICBpZiAoUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KEVOQUJMRV9NT05JVE9SSU5HKSkpIHsKKyAgICAgICAgICAgICAgICBlbmFibGUoY29udGV4dCwgZm9yY2VFbmFibGUsIFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19FTkFCTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoRU5BQkxFX01PTklUT1JJTkdfU1RBVElTVElDUykpKSB7CisgICAgICAgICAgICAgICAgZW5hYmxlKGNvbnRleHQsIGZvcmNlRW5hYmxlLCBTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoRU5BQkxFX01PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlMpKSkgeworICAgICAgICAgICAgICAgIGVuYWJsZShjb250ZXh0LCBmb3JjZUVuYWJsZSwgU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGVuYWJsZShGZWF0dXJlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIGZvcmNlRW5hYmxlLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgICAgICBpZiAoZm9yY2VFbmFibGUpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnByb3BlcnR5KHByb3BlcnR5TmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL0V2ZW50TGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL0V2ZW50TGlzdGVuZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkYTlhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvRXZlbnRMaXN0ZW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDQwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudExpc3RlbmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX05BTUUgPSAiTXlBcHBsaWNhdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQXBwRXZlbnRMaXN0ZW5lciBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgPSBuZXcgQXBwRXZlbnRMaXN0ZW5lcigpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoYXBwbGljYXRpb25FdmVudExpc3RlbmVyKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoUmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFByZU1hdGNoaW5nUmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoTXlFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5zZXRBcHBsaWNhdGlvbk5hbWUoQVBQTElDQVRJT05fTkFNRSk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwcEV2ZW50TGlzdGVuZXIgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIEFwcGxpY2F0aW9uRXZlbnQgYXBwRXZlbnRJbml0U3RhcnQ7CisgICAgICAgIHByaXZhdGUgQXBwbGljYXRpb25FdmVudCBhcHBFdmVudEluaXRGaW5pc2hlZDsKKyAgICAgICAgcHJpdmF0ZSBSZXF1ZXN0RXZlbnQgbmV3UmVxdWVzdEV2ZW50OworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCByZXNvdXJjZU1ldGhvZEV2ZW50Q291bnQgPSAwOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIENvdW50RG93bkxhdGNoIGZpbmlzaGVkQ2FsbGVkID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEFwcGxpY2F0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBJTklUSUFMSVpBVElPTl9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBFdmVudEluaXRTdGFydCA9IGV2ZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOSVRJQUxJWkFUSU9OX0FQUF9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBFdmVudEluaXRGaW5pc2hlZCA9IGV2ZW50OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVxdWVzdEV2ZW50TGlzdGVuZXIgb25SZXF1ZXN0KFJlcXVlc3RFdmVudCBuZXdSZXF1ZXN0RXZlbnQpIHsKKyAgICAgICAgICAgIHRoaXMubmV3UmVxdWVzdEV2ZW50ID0gbmV3UmVxdWVzdEV2ZW50OworICAgICAgICAgICAgaWYgKCJQT1NUIi5lcXVhbHMobmV3UmVxdWVzdEV2ZW50LmdldENvbnRhaW5lclJlcXVlc3QoKS5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXFFdmVudExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXFFdmVudExpc3RlbmVyIGltcGxlbWVudHMgUmVxdWVzdEV2ZW50TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIGZpbmFsIEFwcEV2ZW50TGlzdGVuZXIgYXBwRXZlbnRMaXN0ZW5lcjsKKworICAgICAgICBwdWJsaWMgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGV2ZW50RGF0YSA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgICAgICAgcHVibGljIFJlcUV2ZW50TGlzdGVuZXIoQXBwRXZlbnRMaXN0ZW5lciBhcHBFdmVudExpc3RlbmVyKSB7CisgICAgICAgICAgICB0aGlzLmFwcEV2ZW50TGlzdGVuZXIgPSBhcHBFdmVudExpc3RlbmVyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAxOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KFJlcXVlc3RFdmVudCBldmVudCkgeworICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfTUFUQ0hFRDoKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5SRVFfRklMVEVSU19TVEFSVC5vcmRlciIsIFN0cmluZy52YWx1ZU9mKGluZGV4KyspKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVFVRVNUX0ZJTFRFUkVEOgorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLlJFUV9GSUxURVJTX0ZJTklTSEVELm9yZGVyIiwgU3RyaW5nLnZhbHVlT2YoaW5kZXgrKykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIExPQ0FUT1JfTUFUQ0hFRDoKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5NQVRDSEVEX0xPQ0FUT1Iub3JkZXIiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2VNZXRob2Q+IGxvY2F0b3JzID0gZXZlbnQuZ2V0VXJpSW5mbygpLmdldE1hdGNoZWRSZXNvdXJjZUxvY2F0b3JzKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcudmFsdWVPZihsb2NhdG9ycy5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiIgKyBsb2NhdG9ycy5nZXQoMCkuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5hZGQoIlIuTUFUQ0hFRF9MT0NBVE9SIiwgbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVUJSRVNPVVJDRV9MT0NBVEVEOgorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLk1BVENIRURfU1VCX1JFU09VUkNFLm9yZGVyIiwgU3RyaW5nLnZhbHVlT2YoaW5kZXgrKykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFU09VUkNFX01FVEhPRF9TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5SRVNPVVJDRV9NRVRIT0RfU1RBUlQub3JkZXIiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwRXZlbnRMaXN0ZW5lci5yZXNvdXJjZU1ldGhvZEV2ZW50Q291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBldmVudC5nZXRVcmlJbmZvKCkuZ2V0TWF0Y2hlZFJlc291cmNlTWV0aG9kKCk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5hZGQoIlIuUkVTT1VSQ0VfTUVUSE9EX1NUQVJULm1ldGhvZCIsIHJlc291cmNlTWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEludm9jYWJsZSgpLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVNPVVJDRV9NRVRIT0RfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5hZGQoIlIuUkVTT1VSQ0VfTUVUSE9EX0ZJTklTSEVELm9yZGVyIiwgU3RyaW5nLnZhbHVlT2YoaW5kZXgrKykpOworICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLlJFU09VUkNFX01FVEhPRF9GSU5JU0hFRCIsICJvayIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFU1BfRklMVEVSU19TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5SRVNQX0ZJTFRFUlNfU1RBUlQub3JkZXIiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVhDRVBUSU9OX01BUFBFUl9GT1VORDoKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5FWENFUFRJT05fTUFQUEVSX0ZPVU5ELm9yZGVyIiwgU3RyaW5nLnZhbHVlT2YoaW5kZXgrKykpOworICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLkVYQ0VQVElPTl9NQVBQRVJfRk9VTkQuZXhjZXB0aW9uIiwgZXZlbnQuZ2V0RXhjZXB0aW9uKCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVNQX0ZJTFRFUlNfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5hZGQoIlIuUkVTUF9GSUxURVJTX0ZJTklTSEVELm9yZGVyIiwgU3RyaW5nLnZhbHVlT2YoaW5kZXgrKykpOworICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBldmVudERhdGEuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0Q29udGFpbmVyUmVzcG9uc2UoKS5nZXRIZWFkZXJzKCkuYWRkQWxsKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChldmVudC5nZXRDb250YWluZXJSZXNwb25zZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBFdmVudExpc3RlbmVyLmZpbmlzaGVkQ2FsbGVkLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNYXBwYWJsZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgTXlNYXBwYWJsZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE15TWFwcGFibGVFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoTXlNYXBwYWJsZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygibWFwcGVkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZU1hdGNoaW5nUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYXN5bmMiKQorICAgICAgICBATWFuYWdlZEFzeW5jCisgICAgICAgIHB1YmxpYyB2b2lkIGdldEFzeW5jKEBTdXNwZW5kZWQgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShSZXNwb25zZS5vaygiYXN5bmMiKS5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIHdvcmtzIGluIHRoZSBhc3luYyB3YXkgYnV0IGl0IGlzIHNlcnZlZCBieSBvbmx5IG9uZSB0aHJlYWQuCisgICAgICAgICAqIEBwYXJhbSBhc3luY1Jlc3BvbnNlCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhc3luY09uZVRocmVhZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIGdldEFzeW5jT25lVGhyZWFkKEBTdXNwZW5kZWQgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShSZXNwb25zZS5vaygiYXN5bmMiKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInN1YiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNeU1hcHBhYmxlRXhjZXB0aW9uKCJ0ZXN0LWVycm9yIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvbkV2ZW50cygpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuYXBwRXZlbnRJbml0U3RhcnQpOworICAgICAgICBhc3NlcnROb3ROdWxsKGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5hcHBFdmVudEluaXRGaW5pc2hlZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBUFBMSUNBVElPTl9OQU1FLCBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuYXBwRXZlbnRJbml0U3RhcnQuZ2V0UmVzb3VyY2VDb25maWcoKS5nZXRBcHBsaWNhdGlvbk5hbWUoKSk7CisgICAgICAgIGFzc2VydE51bGwoYXBwbGljYXRpb25FdmVudExpc3RlbmVyLm5ld1JlcXVlc3RFdmVudCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIubmV3UmVxdWVzdEV2ZW50KTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlcXVlc3RFdmVudCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5yZXNvdXJjZU1ldGhvZEV2ZW50Q291bnQpOworICAgICAgICBhc3NlcnROb3ROdWxsKGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5hcHBFdmVudEluaXRTdGFydCk7CisgICAgICAgIGFzc2VydE51bGwoYXBwbGljYXRpb25FdmVudExpc3RlbmVyLm5ld1JlcXVlc3RFdmVudCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJlbnRpdHkiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5uZXdSZXF1ZXN0RXZlbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXBwbGljYXRpb25FdmVudExpc3RlbmVyLnJlc291cmNlTWV0aG9kRXZlbnRDb3VudCk7CisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5yZXNvdXJjZU1ldGhvZEV2ZW50Q291bnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hdGNoZWRMb2NhdG9yKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2xvY2F0b3IiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsxOmxvY2F0b3JdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLk1BVENIRURfTE9DQVRPUiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRjaGVkTWV0aG9kKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbZ2V0TWV0aG9kXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNPVVJDRV9NRVRIT0RfU1RBUlQubWV0aG9kIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltva10iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTT1VSQ0VfTUVUSE9EX0ZJTklTSEVEIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9sb2NhdG9yL2V4Y2VwdGlvbiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcHBlZCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiW29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubW9uaXRvcmluZy5FdmVudExpc3RlbmVyVGVzdCRNeU1hcHBhYmxlRXhjZXB0aW9uOiB0ZXN0LWVycm9yXSIsCisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLkVYQ0VQVElPTl9NQVBQRVJfRk9VTkQuZXhjZXB0aW9uIikpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUHJvY2Vzc2luZygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworCisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLmdldEhlYWRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVFfRklMVEVSU19TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFUV9GSUxURVJTX0ZJTklTSEVELm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTT1VSQ0VfTUVUSE9EX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTT1VSQ0VfTUVUSE9EX0ZJTklTSEVELm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTUF9GSUxURVJTX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU1BfRklMVEVSU19GSU5JU0hFRC5vcmRlciIpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0b3JQcm9jZXNzaW5nKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2xvY2F0b3IiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInN1YiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5nZXRIZWFkZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuTUFUQ0hFRF9MT0NBVE9SLm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuTUFUQ0hFRF9TVUJfUkVTT1VSQ0Uub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVFfRklMVEVSU19TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFUV9GSUxURVJTX0ZJTklTSEVELm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTT1VSQ0VfTUVUSE9EX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTT1VSQ0VfTUVUSE9EX0ZJTklTSEVELm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTUF9GSUxURVJTX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU1BfRklMVEVSU19GSU5JU0hFRC5vcmRlciIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25Qcm9jZXNzaW5nKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2xvY2F0b3IvZXhjZXB0aW9uIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXBwZWQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLk1BVENIRURfTE9DQVRPUi5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLk1BVENIRURfU1VCX1JFU09VUkNFLm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVRX0ZJTFRFUlNfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVFfRklMVEVSU19GSU5JU0hFRC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU09VUkNFX01FVEhPRF9TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU09VUkNFX01FVEhPRF9GSU5JU0hFRC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLkVYQ0VQVElPTl9NQVBQRVJfRk9VTkQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNQX0ZJTFRFUlNfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTUF9GSUxURVJTX0ZJTklTSEVELm9yZGVyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUHJvY2Vzc2luZygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvYXN5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhc3luYyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFUV9GSUxURVJTX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVRX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNPVVJDRV9NRVRIT0RfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNQX0ZJTFRFUlNfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTUF9GSUxURVJTX0ZJTklTSEVELm9yZGVyIikpOworICAgICAgICBmaW5hbCBib29sZWFuIHN1Y2Nlc3MgPSBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuZmluaXNoZWRDYWxsZWQuYXdhaXQoMyAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwKKyAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3VjY2Vzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQcm9jZXNzaW5nV2l0aE9uZVRocmVhZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvYXN5bmNPbmVUaHJlYWQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhc3luYyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFUV9GSUxURVJTX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVRX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNPVVJDRV9NRVRIT0RfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNQX0ZJTFRFUlNfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTUF9GSUxURVJTX0ZJTklTSEVELm9yZGVyIikpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VjY2VzcyA9IGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5maW5pc2hlZENhbGxlZC5hd2FpdCgzICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLAorICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzdWNjZXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL01CZWFuc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvTUJlYW5zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDBiOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL01CZWFuc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdEluc3RhbmNlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBNQmVhbnNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MsIE15RXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcuc2V0QXBwbGljYXRpb25OYW1lKCJteUFwcGxpY2F0aW9uIik7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KCJ2ZXJ5LWltcG9ydGFudCIsICJ5ZXMiKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoImFub3RoZXItcHJvcGVydHkiLCA0OCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoU3RhdGlzdGljc0xpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgICAgICBwdWJsaWMgTXlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxNeUV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShNeUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygibWFwcGVkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0R2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVzdC97dGVzdDogXFxkK30iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RHZXRQYXRoUGF0dGVybjEoKSB7CisgICAgICAgICAgICByZXR1cm4gInRlc3RHZXRQYXRoUGF0dGVybjEiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVzdDIve3Rlc3Q6IGhlbGw/b30iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RHZXRQYXRoUGF0dGVybjIoKSB7CisgICAgICAgICAgICByZXR1cm4gInRlc3RHZXRQYXRoUGF0dGVybjIiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVzdDMve3Rlc3Q6IGFiYy4qIChhKShiKVthLGNdPyRbMS00XWtreHxZfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdEdldFBhdGhQYXR0ZXJuMygpIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdEdldFBhdGhQYXR0ZXJuMiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZXN0NC97dGVzdDogW2EsYl06cn0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RHZXRQYXRoUGF0dGVybjQoKSB7CisgICAgICAgICAgICByZXR1cm4gInRlc3RHZXRQYXRoUGF0dGVybjIiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0UG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAicG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RTdWJHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInN1YiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RFeGNlcHRpb24oKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTXlFeGNlcHRpb24oInRlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzdWIyIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RTdTJiUG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gInBvc3QiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImxvY2F0b3IiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXRpc3RpY3NMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgaW1wbGVtZW50cyBNb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gT05fU0hVVERPV05fQ0FMTEVEID0gZmFsc2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhdGlzdGljcyhNb25pdG9yaW5nU3RhdGlzdGljcyBzdGF0aXN0aWNzKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TaHV0ZG93bihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICBTdGF0aXN0aWNzTGlzdGVuZXIuT05fU0hVVERPV05fQ0FMTEVEID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKFN0YXRpc3RpY3NMaXN0ZW5lci5PTl9TSFVURE9XTl9DQUxMRUQpOworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiaW4tc3VicmVzb3VyY2UiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiaW5TdWJSZXNvdXJjZSI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9ICJyZXNvdXJjZSI7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHRhcmdldCgpLnBhdGgocGF0aCkucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgdGFyZ2V0KCkucGF0aChwYXRoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKHBhdGgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHRhcmdldCgpLnBhdGgocGF0aCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgicG9zdCIsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgdGFyZ2V0KCkucGF0aChwYXRoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKHBhdGggKyAiL3N1YjIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSkuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocGF0aCArICIvZXhjZXB0aW9uIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWFwcGVkIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9zdWIiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9zdWIiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9sb2NhdG9yL2luLXN1YnJlc291cmNlIikucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbG9jYXRvci9sb2NhdG9yL2luLXN1YnJlc291cmNlIikucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbG9jYXRvci9sb2NhdG9yL2xvY2F0b3IvaW4tc3VicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9ub3QtZm91bmQtNDA0IikucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKworICAgICAgICAvLyB3YWl0IHVudGlsIHN0YXRpc3RpY3MgYXJlIHByb3BhZ2F0ZWQgdG8gbXhiZWFucworICAgICAgICBUaHJlYWQuc2xlZXAoMTUwMCk7CisKKyAgICAgICAgZmluYWwgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisgICAgICAgIGZpbmFsIE9iamVjdE5hbWUgbmFtZSA9IG5ldyBPYmplY3ROYW1lKCJvcmcuZ2xhc3NmaXNoLmplcnNleTp0eXBlPW15QXBwbGljYXRpb24sc3ViVHlwZT1HbG9iYWwsZ2xvYmFsPUNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0ciA9IChTdHJpbmcpIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShuYW1lLCAiQXBwbGljYXRpb25OYW1lIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm15QXBwbGljYXRpb24iLCBzdHIpOworCisgICAgICAgIGNoZWNrUmVzb3VyY2VNQmVhbigiL3Jlc291cmNlIik7CisgICAgICAgIGNoZWNrUmVzb3VyY2VNQmVhbigiL3Jlc291cmNlL3N1YiIpOworICAgICAgICBjaGVja1Jlc291cmNlTUJlYW4oIi9yZXNvdXJjZS9sb2NhdG9yIik7CisgICAgICAgIGNoZWNrUmVzb3VyY2VNQmVhbigiL3Jlc291cmNlL2V4Y2VwdGlvbiIpOworICAgICAgICBjaGVja1Jlc291cmNlTUJlYW4oIi9yZXNvdXJjZS90ZXN0L3t0ZXN0OiBcXFxcZCt9Iik7CisgICAgICAgIGNoZWNrUmVzb3VyY2VNQmVhbigiL3Jlc291cmNlL3Rlc3QyL3t0ZXN0OiBoZWxsXFw/b30iKTsKKyAgICAgICAgY2hlY2tSZXNvdXJjZU1CZWFuKCIvcmVzb3VyY2UvdGVzdDMve3Rlc3Q6IGFiYy5cXCogKGEpKGIpW2EsY11cXD8kWzEtNF1ra3h8WX0iKTsKKyAgICAgICAgY2hlY2tSZXNvdXJjZU1CZWFuKCIvcmVzb3VyY2UvdGVzdDQve3Rlc3Q6IFthLGJdOnJ9Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzb3VyY2VNQmVhbihTdHJpbmcgbmFtZSkgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0TmFtZSBvYmplY3ROYW1lID0gbmV3IE9iamVjdE5hbWUoCisgICAgICAgICAgICAgICAgIm9yZy5nbGFzc2Zpc2guamVyc2V5OnR5cGU9bXlBcHBsaWNhdGlvbixzdWJUeXBlPVVyaXMscmVzb3VyY2U9XCIiICsgbmFtZSArICJcIiIpOworICAgICAgICBPYmplY3RJbnN0YW5jZSBtYmVhbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYmVhbiA9IG1CZWFuU2VydmVyLmdldE9iamVjdEluc3RhbmNlKG9iamVjdE5hbWUpOworICAgICAgICB9IGNhdGNoIChJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJSZXNvdXJjZSBNQmVhbiBuYW1lICciICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnROb3ROdWxsKG1iZWFuKTsKKyAgICB9CisKKyAgICAvLyB0aGlzIHRlc3QgcnVucyB0aGUgamVyc2V5IGVudmlyb25tZW50cywgZXhwb3NlcyBtYmVhbnMgYW5kIG1ha2VzIHJlcXVlc3RzIHRvCisgICAgLy8gdGhlIGRlcGxveWVkIGFwcGxpY2F0aW9uLiBUaGUgdGVzdCB3aWxsIG5ldmVyIGZpbmlzaGVkLiBUaGlzIHNob3VsZCBiZSB1bmNvbW1lbnRlZAorICAgIC8vIG9ubHkgZm9yIGRldmVsb3BtZW50IHRlc3Rpbmcgb2YgbWJlYW5zIGluIGpjb25zb2xlLgorICAgIC8vIFN0ZXBzOiB1bmNvbW1lbnQgdGhlIHRlc3Q7IHJ1biBpdDsgcnVuIGpjb25zb2xlIGFuZCBhdHRhY2ggdG8gdGhlIHByb2Nlc3Mgb2YgdGhlIHRlc3RzCisgICAgLy8gICAgQFRlc3QKKyAgICAvLyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV2ZXJGaW5pc2hlc0FuZE11c3RCZUNvbW1lbnRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgIC8vICAgICAgICAgICAgdGVzdCgpOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc0xvY2F0b3JUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzTG9jYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTRkYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc0xvY2F0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLnByb2Nlc3Nvci5XYWRsTW9kZWxQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB7QGxpbmsgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzfSBhcmUgbm90IGR1cGxpY2F0ZWQgaW4KKyAqIHtAbGluayBNb25pdG9yaW5nU3RhdGlzdGljc30gd2hlbiBzdWIgcmVzb3VyY2UgbG9jYXRvcnMgYXJlIHVzZWQuIFN1YiByZXNvdXJjZXMgYW5kIHRoZWlyCisgKiBtZXRob2RzIHNob3VsZCBiZSBtYXBwZWQgdG8gY3VycmVudGx5IGV4aXN0aW5nIHtAbGluayBSZXNvdXJjZVN0YXRpc3RpY3N9IGFuZCB0aGVpcgorICoge0BsaW5rIFJlc291cmNlTWV0aG9kU3RhdGlzdGljc30uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JpbmdTdGF0aXN0aWNzTG9jYXRvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFN0YXRpc3RpY3NSZXNvdXJjZS5jbGFzcywgQW5vdGhlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgdHJ1ZSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuQVBQTElDQVRJT05fTkFNRSwgInRlc3RBcHAiKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0aXN0aWNzUmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0aXN0aWNzOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdGF0cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBNb25pdG9yaW5nU3RhdGlzdGljcyBtb25pdG9yaW5nU3RhdGlzdGljcyA9IHN0YXRpc3RpY3MuZ2V0KCk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZVN0YXRpc3RpY3MgcmVzb3VyY2VTdGF0aXN0aWNzID0gbW9uaXRvcmluZ1N0YXRpc3RpY3MuZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0KFN1YlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZVN0YXRpc3RpY3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyByZXNwID0gIiI7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFJlc291cmNlTWV0aG9kLCBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3M+IGVudHJ5CisgICAgICAgICAgICAgICAgICAgIDogcmVzb3VyY2VTdGF0aXN0aWNzLmdldFJlc291cmNlTWV0aG9kU3RhdGlzdGljcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkuZ2V0SHR0cE1ldGhvZCgpLmVxdWFscygiR0VUIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcCA9IHJlc3AgKyAiZ2V0Rm91bmQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXNwOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidXJpIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRVcmlTdGF0cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBNb25pdG9yaW5nU3RhdGlzdGljcyBtb25pdG9yaW5nU3RhdGlzdGljcyA9IHN0YXRpc3RpY3MuZ2V0KCk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZVN0YXRpc3RpY3MgcmVzb3VyY2VTdGF0aXN0aWNzID0gbW9uaXRvcmluZ1N0YXRpc3RpY3MuZ2V0VXJpU3RhdGlzdGljcygpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoIi9yZXNvdXJjZS9yZXNvdXJjZS1sb2NhdG9yIik7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VTdGF0aXN0aWNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgcmVzcCA9ICIiOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxSZXNvdXJjZU1ldGhvZCwgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzPiBlbnRyeQorICAgICAgICAgICAgICAgICAgICA6IHJlc291cmNlU3RhdGlzdGljcy5nZXRSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmdldEh0dHBNZXRob2QoKS5lcXVhbHMoIkdFVCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3AgPSByZXNwICsgImdldEZvdW5kIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXNwOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJlc291cmNlLWxvY2F0b3IiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgbG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJoZWxsbyIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBoZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSGVsbG8hIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc291cmNlQ2xhc3NTdGF0aXN0aWNzV2FkbE9wdGlvbnNUZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljc1dhZGxPcHRpb25zVGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljc1Rlc3QoV2FkbE1vZGVsUHJvY2Vzc29yLk9wdGlvbnNIYW5kbGVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXNvdXJjZUNsYXNzU3RhdGlzdGljc0dlbmVyaWNPcHRpb25zVGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NHZW5lcmljT3B0aW9uc1Rlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NUZXN0KAorICAgICAgICAgICAgICAgICAgICAib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwucHJvY2Vzc29yLk9wdGlvbnNNZXRob2RQcm9jZXNzb3IkR2VuZXJpY09wdGlvbnNJbmZsZWN0b3IiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc291cmNlQ2xhc3NTdGF0aXN0aWNzUGxhaW5UZXh0T3B0aW9uc1Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQ2xhc3NTdGF0aXN0aWNzUGxhaW5UZXN0T3B0aW9uc1Rlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NUZXN0KAorICAgICAgICAgICAgICAgICAgICAib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwucHJvY2Vzc29yLk9wdGlvbnNNZXRob2RQcm9jZXNzb3IkUGxhaW5UZXh0T3B0aW9uc0luZmxlY3RvciIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NUZXN0KGZpbmFsIFN0cmluZyByZXNvdXJjZUNsYXNzTmFtZSkgeworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VTdGF0aXN0aWNzIHJlc291cmNlTWV0aG9kU3RhdGlzdGljcyA9IGZpbmRSZXNvdXJjZUNsYXNzU3RhdGlzdGljcyhzdGF0aXN0aWNzLmdldCgpLCByZXNvdXJjZUNsYXNzTmFtZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzb3VyY2VIZWxsb09wdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gYW5vdGhlckhlbGxvT3B0aW9ucyA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBhbm90aGVyWG1sT3B0aW9ucyA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8UmVzb3VyY2VNZXRob2QsIFJlc291cmNlTWV0aG9kU3RhdGlzdGljcz4gZW50cnkgOiByZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlTWV0aG9kU3RhdGlzdGljcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmdWxsUGF0aCA9IGdldEZ1bGxQYXRoKHJlc291cmNlTWV0aG9kKTsKKyAgICAgICAgICAgICAgICBpZiAoIi9yZXNvdXJjZS9oZWxsbyIuZXF1YWxzKGZ1bGxQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUhlbGxvT3B0aW9ucyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiL2Fub3RoZXIvaGVsbG8iLmVxdWFscyhmdWxsUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5vdGhlckhlbGxvT3B0aW9ucyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiL2Fub3RoZXIveG1sIi5lcXVhbHMoZnVsbFBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFub3RoZXJYbWxPcHRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzb3VyY2VIZWxsb09wdGlvbnMgJiYgYW5vdGhlckhlbGxvT3B0aW9ucyAmJiBhbm90aGVyWG1sT3B0aW9ucykgeworICAgICAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkZBSUw6IC9yZXNvdXJjZS9oZWxsbz0iICsgcmVzb3VyY2VIZWxsb09wdGlvbnMgKyAiOyAvYW5vdGhlci9oZWxsbz0iICsgYW5vdGhlckhlbGxvT3B0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyAvYW5vdGhlci94bWw9IiArIGFub3RoZXJYbWxPcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidXJpU3RhdGlzdGljc1Jlc291cmNlSGVsbG9UZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRVcmlTdGF0aXN0aWNzUmVzb3VyY2VIZWxsb1Rlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VXJpU3RhdGlzdGljc1Rlc3QoIi9yZXNvdXJjZS9oZWxsbyIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidXJpU3RhdGlzdGljc0Fub3RoZXJIZWxsb1Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVyaVN0YXRpc3RpY3NBbm90aGVySGVsbG9UZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVyaVN0YXRpc3RpY3NUZXN0KCIvYW5vdGhlci9oZWxsbyIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidXJpU3RhdGlzdGljc0Fub3RoZXJYbWxUZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRVcmlTdGF0aXN0aWNzQW5vdGhlclhtbFRlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VXJpU3RhdGlzdGljc1Rlc3QoIi9hbm90aGVyL3htbCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VXJpU3RhdGlzdGljc1Rlc3QoZmluYWwgU3RyaW5nIHVyaSkgeworICAgICAgICAgICAgYm9vbGVhbiBwbGFpblRleHRPcHRpb25zID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIHdhZGxPcHRpb25zID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGdlbmVyaWNPcHRpb25zID0gZmFsc2U7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZVN0YXRpc3RpY3MgcmVzb3VyY2VTdGF0aXN0aWNzID0gc3RhdGlzdGljcy5nZXQoKS5nZXRVcmlTdGF0aXN0aWNzKCkuZ2V0KHVyaSk7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFJlc291cmNlTWV0aG9kLCBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3M+IGVudHJ5IDogcmVzb3VyY2VTdGF0aXN0aWNzCisgICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmdldEh0dHBNZXRob2QoKS5lcXVhbHMoIk9QVElPTlMiKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvZHVjZWRUeXBlcyA9IHJlc291cmNlTWV0aG9kLmdldFByb2R1Y2VkVHlwZXMoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICBpZiAoIlt0ZXh0L3BsYWluXSIuZXF1YWxzKHByb2R1Y2VkVHlwZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFpblRleHRPcHRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiW2FwcGxpY2F0aW9uL3ZuZC5zdW4ud2FkbCt4bWxdIi5lcXVhbHMocHJvZHVjZWRUeXBlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhZGxPcHRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiWyovKl0iLmVxdWFscyhwcm9kdWNlZFR5cGVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY09wdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBsYWluVGV4dE9wdGlvbnMgJiYgd2FkbE9wdGlvbnMgJiYgZ2VuZXJpY09wdGlvbnMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJGQUlMOiBbdGV4dC9wbGFpbl09IiArIHBsYWluVGV4dE9wdGlvbnMgKyAiOyBbYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbF09IiArIHdhZGxPcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICArICI7IFsqLypdPSIgKyBnZW5lcmljT3B0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVzb3VyY2VTdGF0aXN0aWNzIGZpbmRSZXNvdXJjZUNsYXNzU3RhdGlzdGljcyhmaW5hbCBNb25pdG9yaW5nU3RhdGlzdGljcyBtb25pdG9yaW5nU3RhdGlzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZUNsYXNzTmFtZSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8Q2xhc3M8Pz4sIFJlc291cmNlU3RhdGlzdGljcz4gZW50cnkgOiBtb25pdG9yaW5nU3RhdGlzdGljcy5nZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljcygpCisgICAgICAgICAgICAgICAgICAgIC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4ga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXp6ID0ga2V5LmdldE5hbWUoKTsKKworICAgICAgICAgICAgICAgIGlmIChjbGF6ei5lcXVhbHMocmVzb3VyY2VDbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZ1bGxQYXRoKGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGZ1bGxQYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJlZml4UGF0aChmdWxsUGF0aCwgcmVzb3VyY2VNZXRob2QuZ2V0UGFyZW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZ1bGxQYXRoLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByZWZpeFBhdGgoZmluYWwgU3RyaW5nQnVpbGRlciBmdWxsUGF0aCwgZmluYWwgUmVzb3VyY2UgcGFyZW50KSB7CisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHBhcmVudC5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnVsbFBhdGguaW5zZXJ0KDAsICIvIiArIHBhdGgpOworICAgICAgICAgICAgICAgIHByZWZpeFBhdGgoZnVsbFBhdGgsIHBhcmVudC5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIHN1YkxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQYXRoKCIvYW5vdGhlciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm90aGVyUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJoZWxsbyIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBzYXlIZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSGVsbG8sIGFnYWluLiI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgieG1sIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfWE1MKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHNheVhNTEhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PjxoZWxsbz5Xb3JsZCE8L2hlbGxvPiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibnVsbCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9yZXNvdXJjZS1sb2NhdG9yIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3Jlc291cmNlLWxvY2F0b3IiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvcmVzb3VyY2UtbG9jYXRvci9zdWIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvaGVsbG8iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYW5vdGhlci9oZWxsbyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvLCBhZ2Fpbi4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYW5vdGhlci94bWwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PjxoZWxsbz5Xb3JsZCE8L2hlbGxvPiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKDYwMCk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldEZvdW5kIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3VyaSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldEZvdW5kIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNsYXNzU3RhdGlzdGljc1dhZGxPcHRpb25zKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3Jlc291cmNlQ2xhc3NTdGF0aXN0aWNzV2FkbE9wdGlvbnNUZXN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQ2xhc3NTdGF0aXN0aWNzR2VuZXJpY09wdGlvbnMoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvcmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NHZW5lcmljT3B0aW9uc1Rlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NQbGFpblRleHRPcHRpb25zKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3Jlc291cmNlQ2xhc3NTdGF0aXN0aWNzUGxhaW5UZXh0T3B0aW9uc1Rlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpU3RhdGlzdGljc1Jlc291cmNlSGVsbG8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2hlbGxvIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8hIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoNjAwKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3VyaVN0YXRpc3RpY3NSZXNvdXJjZUhlbGxvVGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlTdGF0aXN0aWNzQW5vdGhlckhlbGxvKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhbm90aGVyL2hlbGxvIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8sIGFnYWluLiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKDYwMCk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS91cmlTdGF0aXN0aWNzQW5vdGhlckhlbGxvVGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlTdGF0aXN0aWNzQW5vdGhlclhtbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYW5vdGhlci94bWwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PjxoZWxsbz5Xb3JsZCE8L2hlbGxvPiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKDYwMCk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS91cmlTdGF0aXN0aWNzQW5vdGhlclhtbFRlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbW9uaXRvcmluZy9SZWxvYWRBcHBsaWNhdGlvbkV2ZW50VGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbW9uaXRvcmluZy9SZWxvYWRBcHBsaWNhdGlvbkV2ZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTM2OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL1JlbG9hZEFwcGxpY2F0aW9uRXZlbnRUZXN0LmphdmEKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUmVmbGVjdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamV0dHkuSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZS5TaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGhpcyB0ZXN0IHRlc3RzIHRoZSBsaWZlY3ljbGUgb2YgdGhlIGFwcGxpY2F0aW9uIGluIGFjY29yZGFuY2UgdG8gdGhlIG1vbml0b3JpbmcKKyAqIGFuZCB7QGxpbmsgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgY29udGFpbmVyIGV2ZW50c30uIEFtb25nIG90aGVycywgaXQgY2hlY2tzIHRoYXQKKyAqIE1vbml0b3JpbmcgTUJlYW5zIGFyZSBjb3JyZWN0bHkgZXhwb3NlZCBhbmQgZGVzdHJveWVkIHdoZW4gYXBwbGljYXRpb24gaXMgcmVsb2FkZWQuIFVzZXMgZGlmZmVyZW50CisgKiBjb250YWluZXJzIHRvIHRlc3QgaXQuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoe1JlbG9hZEFwcGxpY2F0aW9uRXZlbnRUZXN0LkdyaXp6bHlUZXN0Q2FzZS5jbGFzcywgUmVsb2FkQXBwbGljYXRpb25FdmVudFRlc3QuSmRrU2VydmVyVGVzdENhc2UuY2xhc3MsCisgICAgICAgIFJlbG9hZEFwcGxpY2F0aW9uRXZlbnRUZXN0LlNpbXBsZUh0dHBTZXJ2ZXJUZXN0Q2FzZS5jbGFzc30pCitwdWJsaWMgY2xhc3MgUmVsb2FkQXBwbGljYXRpb25FdmVudFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SSUdJTkFMID0gIm9yaWdpbmFsIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxPQURFRCA9ICJyZWxvYWRlZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyaXp6bHlUZXN0Q2FzZSBleHRlbmRzIFBhcmVudFRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZGtTZXJ2ZXJUZXN0Q2FzZSBleHRlbmRzIFBhcmVudFRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV29ya3Mgb25seSB3aXRoIEphdmEgNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmV0dHlTZXJ2ZXJUZXN0Q2FzZSBleHRlbmRzIFBhcmVudFRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpldHR5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlSHR0cFNlcnZlclRlc3RDYXNlIGV4dGVuZHMgUGFyZW50VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgT3JpZ2luYWxSZXN1bHQucmVzZXQoKTsKKyAgICAgICAgICAgIFJlbG9hZGVkUmVzdWx0LnJlc2V0KCk7CisgICAgICAgICAgICBPcmlnaW5hbFJlc3VsdCBvcmlnaW5hbFJlc3VsdCA9IG5ldyBPcmlnaW5hbFJlc3VsdCgpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBnZXRSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgICAgIC5zZXRBcHBsaWNhdGlvbk5hbWUoT1JJR0lOQUwpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgVGVzdFJlc291cmNlKG9yaWdpbmFsUmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBBcHBFdmVudExpc3RlbmVyKG9yaWdpbmFsUmVzdWx0KSk7CisKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQ29uZmlnIGdldFJlc291cmNlQ29uZmlnKCkgeworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFRlc3RSZXN1bHRUcmFja2VyIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsb2FkZWQoKTsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKTsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnR1cCgpOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIHtAbGluayBBcHBsaWNhdGlvbkV2ZW50LlR5cGUjUkVMT0FEX0ZJTklTSEVEfSBjYWxsZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZGVkRXZlbnQoKTsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiB7QGxpbmsgQXBwbGljYXRpb25FdmVudC5UeXBlI0lOSVRJQUxJWkFUSU9OX0ZJTklTSEVEfSBjYWxsZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRFdmVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPcmlnaW5hbFJlc3VsdCBpbXBsZW1lbnRzIFRlc3RSZXN1bHRUcmFja2VyIHsKKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlbG9hZGVkQ2FsbGVkOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNodXRkb3duQ2FsbGVkOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0dXBDYWxsZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVsb2FkZWRFdmVudENhbGxlZDsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbml0RXZlbnRDYWxsZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgICAgICByZWxvYWRlZENhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNodXRkb3duQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RhcnR1cENhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlbG9hZGVkRXZlbnRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbml0RXZlbnRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxvYWRlZCgpIHsKKyAgICAgICAgICAgICAgICByZWxvYWRlZENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgICAgICAgICAgICAgc2h1dGRvd25DYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB7CisgICAgICAgICAgICAgICAgc3RhcnR1cENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsb2FkZWRFdmVudCgpIHsKKyAgICAgICAgICAgICAgICByZWxvYWRlZEV2ZW50Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBpbml0RXZlbnQoKSB7CisgICAgICAgICAgICAgICAgaW5pdEV2ZW50Q2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWxvYWRlZFJlc3VsdCBpbXBsZW1lbnRzIFRlc3RSZXN1bHRUcmFja2VyIHsKKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNodXRkb3duQ2FsbGVkOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlbG9hZGVkQ2FsbGVkOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlbG9hZGVkRXZlbnRDYWxsZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5pdEV2ZW50Q2FsbGVkOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0dXBDYWxsZWQ7CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgICAgICByZWxvYWRlZENhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNodXRkb3duQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RhcnR1cENhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlbG9hZGVkRXZlbnRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbml0RXZlbnRDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxvYWRlZCgpIHsKKyAgICAgICAgICAgICAgICByZWxvYWRlZENhbGxlZCA9IHRydWU7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICAgICAgICAgICAgICBzaHV0ZG93bkNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnR1cCgpIHsKKyAgICAgICAgICAgICAgICBzdGFydHVwQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxvYWRlZEV2ZW50KCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGVkRXZlbnRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRFdmVudCgpIHsKKyAgICAgICAgICAgICAgICBpbml0RXZlbnRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgICAgICBAU2luZ2xldG9uCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIGltcGxlbWVudHMgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgICAgICAgICBwcml2YXRlIHZvbGF0aWxlIENvbnRhaW5lciBjb250YWluZXI7CisKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgVGVzdFJlc3VsdFRyYWNrZXIgdGVzdFJlc3VsdFRyYWNrZXI7CisKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0UmVzb3VyY2UoVGVzdFJlc3VsdFRyYWNrZXIgdGVzdFJlc3VsdFRyYWNrZXIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRlc3RSZXN1bHRUcmFja2VyID0gdGVzdFJlc3VsdFRyYWNrZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5yZWxvYWQoZ2V0UmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnNldEFwcGxpY2F0aW9uTmFtZShSRUxPQURFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgVGVzdFJlc291cmNlKG5ldyBSZWxvYWRlZFJlc3VsdCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQXBwRXZlbnRMaXN0ZW5lcihuZXcgUmVsb2FkZWRSZXN1bHQoKSkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydHVwKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0VHJhY2tlci5zdGFydHVwKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWxvYWQoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgICAgIHRlc3RSZXN1bHRUcmFja2VyLnJlbG9hZGVkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TaHV0ZG93bihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgdGVzdFJlc3VsdFRyYWNrZXIuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwRXZlbnRMaXN0ZW5lciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciB7CisKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgVGVzdFJlc3VsdFRyYWNrZXIgcmVzdWx0VHJhY2tlcjsKKworICAgICAgICAgICAgcHVibGljIEFwcEV2ZW50TGlzdGVuZXIoVGVzdFJlc3VsdFRyYWNrZXIgcmVzdWx0VHJhY2tlcikgeworICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0VHJhY2tlciA9IHJlc3VsdFRyYWNrZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChBcHBsaWNhdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJTklUSUFMSVpBVElPTl9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFRyYWNrZXIuaW5pdEV2ZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUxPQURfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUcmFja2VyLnJlbG9hZGVkRXZlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVxdWVzdEV2ZW50TGlzdGVuZXIgb25SZXF1ZXN0KFJlcXVlc3RFdmVudCByZXF1ZXN0RXZlbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0cyB0aGF0IG1vbml0b3JpbmcgYW5kIGNvbnRhaW5lciBldmVudHMgYXJlIGNvcnJlY3RseSBjYWxsZWQgd2hlbiBhcHBsaWNhdGlvbiBpcyBjcmVhdGVkIGFuZCByZWRlcGxveWVkLgorICAgICAgICAgKiBJdCBhbHNvIGNoZWNrcyB0aGF0IE1CZWFucyBhcmUgZXhwb3NlZCBhbmQgZGVyZWdpc3RlcmVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHVuZGVwbG95ZWQuIFRlc3QgY29udGFpbnMKKyAgICAgICAgICogd2FpdHMgYW5kIHRpbWVvdXRzIGFzIG1vbml0b3JpbmcgZXZlbnRzIGFyZSBwcm9jZXNzZWQgYXN5bmNocm9ub3VzbHkgYW5kIGl0IG1pZ2h0IHRha2Ugc29tZSB0aW1lCisgICAgICAgICAqIHVudGlsIE1CZWFucyBhcmUgcmVnaXN0ZXJlZC4gVGhlIHRlc3QgZGVwbG95cyBvcmlnaW5hbCBhcHBsaWNhdGlvbiwgdGhlbiByZWxvYWQgaXMgaW5pdGlhdGVkIGFuZAorICAgICAgICAgKiBhbm90aGVyIGFwcGxpY2F0aW9uIGlzIGRlcGxveWVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24KKyAgICAgICAgICogQHRocm93cyBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgKiBAdGhyb3dzIE1CZWFuRXhjZXB0aW9uCisgICAgICAgICAqIEB0aHJvd3MgUmVmbGVjdGlvbkV4Y2VwdGlvbgorICAgICAgICAgKiBAdGhyb3dzIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uRXZlbnRzKCkgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24sIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIE1CZWFuRXhjZXB0aW9uLCBSZWZsZWN0aW9uRXhjZXB0aW9uLCBJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyB3YWl0IHRvIGV4cG9zZSBNQmVhbnMgaW4gdGhlIE9SSUdJTkFMIGFwcGxpY2F0aW9uCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNzAwKTsKKworICAgICAgICAgICAgLy8gYmVmb3JlIHJlbG9hZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShPcmlnaW5hbFJlc3VsdC5zdGFydHVwQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoT3JpZ2luYWxSZXN1bHQuaW5pdEV2ZW50Q2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKE9yaWdpbmFsUmVzdWx0LnNodXRkb3duQ2FsbGVkKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoUmVsb2FkZWRSZXN1bHQucmVsb2FkZWRDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoUmVsb2FkZWRSZXN1bHQuc3RhcnR1cENhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShSZWxvYWRlZFJlc3VsdC5pbml0RXZlbnRDYWxsZWQpOworCisgICAgICAgICAgICBjaGVja01CZWFuUmVnaXN0cmF0aW9uKE9SSUdJTkFMLCB0cnVlKTsKKyAgICAgICAgICAgIGNoZWNrTUJlYW5SZWdpc3RyYXRpb24oUkVMT0FERUQsIGZhbHNlKTsKKworICAgICAgICAgICAgLy8gbm93IGNhdXNlIHRoZSByZWxvYWQ6CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICBpbnQgY250ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgoIVJlbG9hZGVkUmVzdWx0LmluaXRFdmVudENhbGxlZCkgJiYgKGNudCsrIDwgMzApKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaW1lb3V0OiBhcHBsaWNhdGlvbiB3YXMgbm90IHJlbG9hZGVkIGluIHRpbWUuIiwgUmVsb2FkZWRSZXN1bHQuaW5pdEV2ZW50Q2FsbGVkKTsKKyAgICAgICAgICAgIC8vIHdhaXQgYWdhaW4gc29tZSB0aW1lIHVudGlsIGV2ZW50cyBhcmUgcHJvY2Vzc2VkIGFuZCBtYmVhbnMgYXJlIGludm9rZWQKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg3MDApOworCisgICAgICAgICAgICAvLyBhZnRlciByZWxvYWQKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKE9yaWdpbmFsUmVzdWx0LnJlbG9hZGVkQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKE9yaWdpbmFsUmVzdWx0LnJlbG9hZGVkRXZlbnRDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShPcmlnaW5hbFJlc3VsdC5zaHV0ZG93bkNhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFJlbG9hZGVkUmVzdWx0LnN0YXJ0dXBDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShSZWxvYWRlZFJlc3VsdC5pbml0RXZlbnRDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShSZWxvYWRlZFJlc3VsdC5yZWxvYWRlZENhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFJlbG9hZGVkUmVzdWx0LnJlbG9hZGVkRXZlbnRDYWxsZWQpOworCisgICAgICAgICAgICBjaGVja01CZWFuUmVnaXN0cmF0aW9uKE9SSUdJTkFMLCBmYWxzZSk7CisgICAgICAgICAgICBjaGVja01CZWFuUmVnaXN0cmF0aW9uKFJFTE9BREVELCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja01CZWFuUmVnaXN0cmF0aW9uKFN0cmluZyBhcHBOYW1lLCBib29sZWFuIHNob3VsZEJlUmVnaXN0ZXJlZCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBNQmVhbkV4Y2VwdGlvbiwgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24sIFJlZmxlY3Rpb25FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisgICAgICAgICAgICBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdE5hbWUgbmFtZSA9IG5ldyBPYmplY3ROYW1lKAorICAgICAgICAgICAgICAgICAgICAib3JnLmdsYXNzZmlzaC5qZXJzZXk6dHlwZT0iICsgYXBwTmFtZSArICIsc3ViVHlwZT1HbG9iYWwsZ2xvYmFsPUNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVnaXN0ZXJlZCA9IG1CZWFuU2VydmVyLmlzUmVnaXN0ZXJlZChuYW1lKTsKKworICAgICAgICAgICAgaW50IHRpbWUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHNob3VsZEJlUmVnaXN0ZXJlZCAmJiAhcmVnaXN0ZXJlZCAmJiB0aW1lIDwgNDAwMCkgeworICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgTUJlYW5zIGFyZSBhc3luY2hyb25vdXNseSBleHBvc2VkCisgICAgICAgICAgICAgICAgaW50IHdhaXRUaW1lID0gMzAwOworICAgICAgICAgICAgICAgIHRpbWUgKz0gd2FpdFRpbWU7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lKTsKKyAgICAgICAgICAgICAgICByZWdpc3RlcmVkID0gbUJlYW5TZXJ2ZXIuaXNSZWdpc3RlcmVkKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzaG91bGRCZVJlZ2lzdGVyZWQsIHJlZ2lzdGVyZWQpOworICAgICAgICAgICAgaWYgKHJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG5hbWUsICJBcHBsaWNhdGlvbk5hbWUiKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFwcE5hbWUsIHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvU3RhdGlzdGljc0Rlc3Ryb3lUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL1N0YXRpc3RpY3NEZXN0cm95VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYTVkNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL1N0YXRpc3RpY3NEZXN0cm95VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkRlc3Ryb3lMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamV0dHkuSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZS5TaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BSdW5XaXRoKFN1aXRlLmNsYXNzKQorQFN1aXRlLlN1aXRlQ2xhc3Nlcyh7U3RhdGlzdGljc0Rlc3Ryb3lUZXN0LkdyaXp6bHlUZXN0Q2FzZS5jbGFzcywgU3RhdGlzdGljc0Rlc3Ryb3lUZXN0Lkpka1NlcnZlclRlc3RDYXNlLmNsYXNzLAorICAgICAgICBTdGF0aXN0aWNzRGVzdHJveVRlc3QuU2ltcGxlSHR0cFNlcnZlclRlc3RDYXNlLmNsYXNzfSkKK3B1YmxpYyBjbGFzcyBTdGF0aXN0aWNzRGVzdHJveVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJlbnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgU3RhdGlzdGljc0xpc3RlbmVyLnJlc2V0KCk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcuc2V0QXBwbGljYXRpb25OYW1lKCJteUFwcGxpY2F0aW9uIik7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eSgidmVyeS1pbXBvcnRhbnQiLCAieWVzIik7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eSgiYW5vdGhlci1wcm9wZXJ0eSIsIDQ4KTsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFN0YXRpc3RpY3NMaXN0ZW5lci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQEFmdGVyCisgICAgICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdGF0aXN0aWNzTGlzdGVuZXIuT05fU0hVVERPV05fQ0FMTEVEKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoU3RhdGlzdGljc0xpc3RlbmVyLk9OX0RFU1RST1lfQ0FMTEVEKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoU3RhdGlzdGljc0xpc3RlbmVyLk9OX1NUQVRJU1RJQ1NfQ0FMTEVEKTsKKworICAgICAgICAgICAgZmluYWwgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICBmaW5hbCBPYmplY3ROYW1lIG5hbWUgPSBuZXcgT2JqZWN0TmFtZSgib3JnLmdsYXNzZmlzaC5qZXJzZXk6dHlwZT1teUFwcGxpY2F0aW9uLHN1YlR5cGU9R2xvYmFsLGdsb2JhbD1Db25maWd1cmF0aW9uIik7CisgICAgICAgICAgICBib29sZWFuIHJlZ2lzdGVyZWQgPSBtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQobmFtZSk7CisgICAgICAgICAgICBpbnQgdGltZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAocmVnaXN0ZXJlZCAmJiB0aW1lIDwgNDAwMCkgeworICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgTUJlYW5zIGFyZSBhc3luY2hyb25vdXNseSBleHBvc2VkCisgICAgICAgICAgICAgICAgaW50IHdhaXRUaW1lID0gMzAwOworICAgICAgICAgICAgICAgIHRpbWUgKz0gd2FpdFRpbWU7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lKTsKKyAgICAgICAgICAgICAgICByZWdpc3RlcmVkID0gbUJlYW5TZXJ2ZXIuaXNSZWdpc3RlcmVkKG5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIk1CZWFuIHNob3VsZCBiZSBhbHJlYWR5IHVucmVnaXN0ZXJlZCEiLCBtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQobmFtZSkpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJlc291cmNlIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0R2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gInJlc291cmNlIjsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHRhcmdldCgpLnBhdGgocGF0aCkucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGZpbmFsIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0TmFtZSBuYW1lID0gbmV3IE9iamVjdE5hbWUoIm9yZy5nbGFzc2Zpc2guamVyc2V5OnR5cGU9bXlBcHBsaWNhdGlvbixzdWJUeXBlPUdsb2JhbCxnbG9iYWw9Q29uZmlndXJhdGlvbiIpOworICAgICAgICAgICAgYm9vbGVhbiByZWdpc3RlcmVkID0gbUJlYW5TZXJ2ZXIuaXNSZWdpc3RlcmVkKG5hbWUpOworCisgICAgICAgICAgICAvLyB3YWl0IChldmVudHMgYXJlIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseSBhbmQgaXQgbWlnaHQgdGFrZSB0aW1lIHRvIGV4cG9zZSBtYmVhbnMKKyAgICAgICAgICAgIGludCB0aW1lID0gMDsKKyAgICAgICAgICAgIHdoaWxlICghcmVnaXN0ZXJlZCAmJiB0aW1lIDwgNDAwMCkgeworICAgICAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgTUJlYW5zIGFyZSBhc3luY2hyb25vdXNseSBleHBvc2VkCisgICAgICAgICAgICAgICAgaW50IHdhaXRUaW1lID0gMzAwOworICAgICAgICAgICAgICAgIHRpbWUgKz0gd2FpdFRpbWU7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHdhaXRUaW1lKTsKKyAgICAgICAgICAgICAgICByZWdpc3RlcmVkID0gbUJlYW5TZXJ2ZXIuaXNSZWdpc3RlcmVkKG5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJNQmVhbiBzaG91bGQgYmUgYWxyZWFkeSByZWdpc3RlcmVkISIsIG1CZWFuU2VydmVyLmlzUmVnaXN0ZXJlZChuYW1lKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG5hbWUsICJBcHBsaWNhdGlvbk5hbWUiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm15QXBwbGljYXRpb24iLCBzdHIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHcml6emx5VGVzdENhc2UgZXh0ZW5kcyBQYXJlbnRUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0YXRpc3RpY3NMaXN0ZW5lci5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmRrU2VydmVyVGVzdENhc2UgZXh0ZW5kcyBQYXJlbnRUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0YXRpc3RpY3NMaXN0ZW5lci5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdvcmtzIG9ubHkgd2l0aCBKYXZhIDcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpldHR5U2VydmVyVGVzdENhc2UgZXh0ZW5kcyBQYXJlbnRUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0YXRpc3RpY3NMaXN0ZW5lci5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXR0eVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZUh0dHBTZXJ2ZXJUZXN0Q2FzZSBleHRlbmRzIFBhcmVudFRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgU3RhdGlzdGljc0xpc3RlbmVyLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXRpc3RpY3NMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lciwgRGVzdHJveUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gT05fU0hVVERPV05fQ0FMTEVEID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBPTl9TVEFUSVNUSUNTX0NBTExFRCA9IGZhbHNlOworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gT05fREVTVFJPWV9DQUxMRUQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBPTl9TSFVURE9XTl9DQUxMRUQgPSBmYWxzZTsKKyAgICAgICAgICAgIE9OX1NUQVRJU1RJQ1NfQ0FMTEVEID0gZmFsc2U7CisgICAgICAgICAgICBPTl9ERVNUUk9ZX0NBTExFRCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhdGlzdGljcyhNb25pdG9yaW5nU3RhdGlzdGljcyBzdGF0aXN0aWNzKSB7CisgICAgICAgICAgICBTdGF0aXN0aWNzTGlzdGVuZXIuT05fU1RBVElTVElDU19DQUxMRUQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1dGRvd24oQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgU3RhdGlzdGljc0xpc3RlbmVyLk9OX1NIVVRET1dOX0NBTExFRCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICAgICAgU3RhdGlzdGljc0xpc3RlbmVyLk9OX0RFU1RST1lfQ0FMTEVEID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9CZWFuVmFsaWRhdGlvbkVycm9yVGVtcGxhdGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvQmVhblZhbGlkYXRpb25FcnJvclRlbXBsYXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NThiYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvQmVhblZhbGlkYXRpb25FcnJvclRlbXBsYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLkVycm9yVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5iZWFudmFsaWRhdGlvbi5NdmNCZWFuVmFsaWRhdGlvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXIuVGVzdFZpZXdQcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5MZW5ndGg7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgUHJvcGVydGllcyBwcm9wczsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXJyb3JUZW1wbGF0ZVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNCZWFuVmFsaWRhdGlvbkZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVycm9yVGVtcGxhdGVSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInBhcmFtcyIpCisgICAgICAgIEBFcnJvclRlbXBsYXRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaW52YWxpZFBhcmFtcyhATGVuZ3RoKG1pbiA9IDUpIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGZhaWwgb24gQmVhbiBWYWxpZGF0aW9uISIpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInJldHVybiIpCisgICAgICAgIEBFcnJvclRlbXBsYXRlCisgICAgICAgIEBMZW5ndGgobWluID0gNSkKKyAgICAgICAgcHVibGljIFN0cmluZyBpbnZhbGlkUmV0dXJuVmFsdWUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJwYXJhbXMiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiZm9vIikpOworICAgICAgICBwcm9wcy5sb2FkKHJlc3BvbnNlLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHByb3BzLmdldFByb3BlcnR5KCJtb2RlbCIpLAorICAgICAgICAgICAgICAgIGVxdWFsVG8oIntvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5MZW5ndGgubWVzc2FnZX1fRXJyb3JUZW1wbGF0ZVJlc291cmNlLmludmFsaWRQYXJhbXMuYXJnMF9mb28iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFJldHVyblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXR1cm4iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiZm9vIikpOworICAgICAgICBwcm9wcy5sb2FkKHJlc3BvbnNlLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDUwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHByb3BzLmdldFByb3BlcnR5KCJtb2RlbCIpLAorICAgICAgICAgICAgICAgIGVxdWFsVG8oIntvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5MZW5ndGgubWVzc2FnZX1fRXJyb3JUZW1wbGF0ZVJlc291cmNlLmludmFsaWRSZXR1cm5WYWx1ZS4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8cmV0dXJuIHZhbHVlPl9mb28iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0N1c3RvbVZpZXdhYmxlQ29udGV4dFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9DdXN0b21WaWV3YWJsZUNvbnRleHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjYjRkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9DdXN0b21WaWV3YWJsZUNvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLkN1c3RvbVZpZXdhYmxlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbVZpZXdhYmxlQ29udGV4dFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFeHBsaWNpdFRlbXBsYXRlLmNsYXNzLCBJbXBsaWNpdFRlbXBsYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQ3VzdG9tVmlld2FibGVDb250ZXh0LmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2V4cGxpY2l0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFRlbXBsYXRlCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBnZXRWaWV3YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoIiIsICJtZXRob2QiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFubm90YXRpb24iKQorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiYW5ub3RhdGlvbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVtcGxhdGUKKyAgICBAUGF0aCgiL2ltcGxpY2l0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJpbXBsaWNpdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UmVzb3VyY2UoImV4cGxpY2l0IiwgIm1ldGhvZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UmVzb3VyY2UoImV4cGxpY2l0L2Fubm90YXRpb24iLCAiYW5ub3RhdGlvbiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RSZXNvdXJjZSgiaW1wbGljaXQiLCAiaW1wbGljaXQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFJlc291cmNlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgbW9kZWxWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQocGF0aCkucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygiL0N1c3RvbVZpZXdhYmxlQ29udGV4dC9pbmRleC50ZXN0cCIsIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtb2RlbFZhbHVlLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0Vmlld1Byb2Nlc3NvciIsIHAuZ2V0UHJvcGVydHkoIm5hbWUiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjg0NzVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5FcnJvclRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEVycm9yVGVtcGxhdGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXJyb3JUZW1wbGF0ZVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3JUZW1wbGF0ZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBFcnJvclRlbXBsYXRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yVGVtcGxhdGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1ldGhvZFJlbGF0aXZlUGF0aCIpCisgICAgICAgIEBFcnJvclRlbXBsYXRlKG5hbWUgPSAicmVsYXRpdmUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvclRlbXBsYXRlIik7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJtZXRob2RBYnNvbHV0ZVBhdGgiKQorICAgICAgICBARXJyb3JUZW1wbGF0ZShuYW1lID0gIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvYWJzb2x1dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZEFic29sdXRlUGF0aCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvclRlbXBsYXRlIik7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViUmVzb3VyY2UiKQorICAgICAgICBwdWJsaWMgRXJyb3JUZW1wbGF0ZVJlc291cmNlIHN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvclRlbXBsYXRlUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWJSZXNvdXJjZVRlbXBsYXRlIikKKyAgICAgICAgQEVycm9yVGVtcGxhdGUKKyAgICAgICAgcHVibGljIEVycm9yVGVtcGxhdGVTdWJSZXNvdXJjZSBzdWJSZXNvdXJjZVRlbXBsYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3JUZW1wbGF0ZVN1YlJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yVGVtcGxhdGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXJyb3JNZXRob2RUZW1wbGF0ZVN1YlJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRhcmdldCgic3ViUmVzb3VyY2VUZW1wbGF0ZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcnJvclRlbXBsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RFcnJvclRlbXBsYXRlKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVycm9yVGVtcGxhdGUodGFyZ2V0KCJzdWJSZXNvdXJjZSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEVycm9yVGVtcGxhdGUoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5sb2FkKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IEVycm9yVGVtcGxhdGUiLCBwcm9wcy5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5sb2FkKHRhcmdldC5wYXRoKCJtZXRob2RSZWxhdGl2ZVBhdGgiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9yZWxhdGl2ZS50ZXN0cCIsCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IEVycm9yVGVtcGxhdGUiLCBwcm9wcy5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5sb2FkKHRhcmdldC5wYXRoKCJtZXRob2RBYnNvbHV0ZVBhdGgiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9hYnNvbHV0ZS50ZXN0cCIsCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IEVycm9yVGVtcGxhdGUiLCBwcm9wcy5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJjMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXIuVGVzdFZpZXdQcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25WaWV3UHJvY2Vzc29yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEV4cGxpY2l0VGVtcGxhdGUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihXZWJBcHBFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2ViQXBwRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uPiB7CisKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAvLyBBYnNvbHV0ZS4KKyAgICAgICAgICAgIGlmIChleGNlcHRpb24uZ2V0UmVzcG9uc2UoKS5nZXRTdGF0dXMoKSA9PSA0MDQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoNDA0KQorICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eShuZXcgVmlld2FibGUoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeGNlcHRpb25WaWV3UHJvY2Vzc29yVGVzdC80MDQiLCAiNDA0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVsYXRpdmUuCisgICAgICAgICAgICBpZiAoZXhjZXB0aW9uLmdldFJlc3BvbnNlKCkuZ2V0U3RhdHVzKCkgPT0gNDA2KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg0MDYpLmVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWaWV3YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeGNlcHRpb25WaWV3UHJvY2Vzc29yVGVzdC9XZWJBcHBFeGNlcHRpb25NYXBwZXIvNDA2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwNiIpKS5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uLmdldFJlc3BvbnNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoInNob3ciLCAiZ2V0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZUV4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgiL2RvZXMtbm90LWV4aXN0IikucmVxdWVzdCgpOworCisgICAgICAgIFJlc3BvbnNlIGNyID0gcmVxdWVzdC5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCBjci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QvNDA0LnRlc3RwIiwgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI0MDQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZpbmdDbGFzc0V4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgiLyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3dyb25nLW1lZGlhLXR5cGUiKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHJlcXVlc3QuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNiwgY3IuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0L1dlYkFwcEV4Y2VwdGlvbk1hcHBlci80MDYudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiNDA2IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZDk3MGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLkFiY1ZpZXdQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXIuRGVmVmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXhwbGljaXRUd29HZXRQcm9kdWNlc1RlbXBsYXRlLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4cGxpY2l0Tm9Qcm9kdWNlc1RlbXBsYXRlLmNsYXNzLCBFeHBsaWNpdFdpbGRjYXJkUHJvZHVjZXNUZW1wbGF0ZS5jbGFzcywgRXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEFiY1ZpZXdQcm9jZXNzb3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKERlZlZpZXdQcm9jZXNzb3IuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvZXhwbGljaXQtbm8tcHJvZHVjZXMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwbGljaXROb1Byb2R1Y2VzVGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFRlbXBsYXRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVmKCkgeworICAgICAgICAgICAgcmV0dXJuICJkZWYiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9leHBsaWNpdC13aWxkY2FyZC1wcm9kdWNlcyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFdpbGRjYXJkUHJvZHVjZXNUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgQFByb2R1Y2VzKCIqLyoiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlZigpIHsKKyAgICAgICAgICAgIHJldHVybiAiZGVmIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvZXhwbGljaXQtdHdvLWdldC1wcm9kdWNlcyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFR3b0dldFByb2R1Y2VzVGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFRlbXBsYXRlCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYWJjIikKKyAgICAgICAgcHVibGljIFN0cmluZyBhYmMoKSB7CisgICAgICAgICAgICByZXR1cm4gImFiYyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBUZW1wbGF0ZQorICAgICAgICBAUHJvZHVjZXMoIiovKiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVmKCkgeworICAgICAgICAgICAgcmV0dXJuICJkZWYiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImV4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2FiYyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcyBleHRlbmRzIEV4cGxpY2l0VGVtcGxhdGVUZXN0LkV4cGxpY2l0VGVtcGxhdGUgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2VzV2lsZGNhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGF0aCA6IG5ldyBTdHJpbmdbXSB7ImV4cGxpY2l0LW5vLXByb2R1Y2VzIiwgImV4cGxpY2l0LXdpbGRjYXJkLXByb2R1Y2VzIiwKKyAgICAgICAgICAgICAgICAiZXhwbGljaXQtdHdvLWdldC1wcm9kdWNlcyJ9KSB7CisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KHBhdGgpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBtZWRpYVR5cGUgOiBuZXcgU3RyaW5nW10geyJhcHBsaWNhdGlvbi9kZWYiLCAidGV4dC9wbGFpbiJ9KSB7CisgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QobWVkaWFUeXBlKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKworICAgICAgICAgICAgICAgIGFzc2VydFRydWUocC5nZXRQcm9wZXJ0eSgicGF0aCIpCisgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2hlcygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdChbYS16QS1aXSspIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUZW1wbGF0ZS9pbmRleC5kZWYiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWYiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRlZlZpZXdQcm9jZXNzb3IiLCBwLmdldFByb3BlcnR5KCJuYW1lIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNTcGVjaWZpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJleHBsaWNpdC10d28tZ2V0LXByb2R1Y2VzIik7CisKKyAgICAgICAgZmluYWwgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9hYmMiKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUd29HZXRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmFiYyIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBYmNWaWV3UHJvY2Vzc29yIiwgcC5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJleHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcyIpOworCisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5sb2FkKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcy9pbmRleC5hYmMiLAorICAgICAgICAgICAgICAgIHByb3BzLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1ldGhvZCIsIHByb3BzLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLmxvYWQodGFyZ2V0LnBhdGgoIm1ldGhvZFJlbGF0aXZlUGF0aCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzL3JlbGF0aXZlIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmFiYyIsCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kUmVsYXRpdmVQYXRoIiwgcHJvcHMuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMubG9hZCh0YXJnZXQucGF0aCgibWV0aG9kQWJzb2x1dGVQYXRoIikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlLmFiYyIsCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kQWJzb2x1dGVQYXRoIiwgcHJvcHMuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiZDhiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXhwbGljaXRUZW1wbGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoVGVzdFZpZXdQcm9jZXNzb3IuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tUmVzb2x2aW5nQ2xhc3MgeworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFRlbXBsYXRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kKCkgeworICAgICAgICAgICAgcmV0dXJuICJtZXRob2QiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibWV0aG9kUmVsYXRpdmVQYXRoIikKKyAgICAgICAgQFRlbXBsYXRlKG5hbWUgPSAicmVsYXRpdmUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiAibWV0aG9kUmVsYXRpdmVQYXRoIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1ldGhvZEFic29sdXRlUGF0aCIpCisgICAgICAgIEBUZW1wbGF0ZShuYW1lID0gIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBtZXRob2RBYnNvbHV0ZVBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gIm1ldGhvZEFic29sdXRlUGF0aCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViUmVzb3VyY2UiKQorICAgICAgICBwdWJsaWMgRXhwbGljaXRUZW1wbGF0ZSBzdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhwbGljaXRUZW1wbGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YlJlc291cmNlVGVtcGxhdGUiKQorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgcHVibGljIEV4cGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZSBzdWJSZXNvdXJjZVRlbXBsYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRNZXRob2RUZW1wbGF0ZVN1YlJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgdGFyZ2V0KCJzdWJSZXNvdXJjZVRlbXBsYXRlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFRlbXBsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RXhwbGljaXRUZW1wbGF0ZSh0YXJnZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RXhwbGljaXRUZW1wbGF0ZSh0YXJnZXQoInN1YlJlc291cmNlIikpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3RFeHBsaWNpdFRlbXBsYXRlKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMubG9hZCh0YXJnZXQucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXRob2QiLCBwcm9wcy5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5sb2FkKHRhcmdldC5wYXRoKCJtZXRob2RSZWxhdGl2ZVBhdGgiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvcmVsYXRpdmUudGVzdHAiLAorICAgICAgICAgICAgICAgIHByb3BzLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1ldGhvZFJlbGF0aXZlUGF0aCIsIHByb3BzLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLmxvYWQodGFyZ2V0LnBhdGgoIm1ldGhvZEFic29sdXRlUGF0aCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS50ZXN0cCIsCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kQWJzb2x1dGVQYXRoIiwgcHJvcHMuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2MwZGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXIuVGVzdFZpZXdQcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBGbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFeHBsaWNpdFRlbXBsYXRlLmNsYXNzLCBJbXBsaWNpdFRlbXBsYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi9leHBsaWNpdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlIGV4dGVuZHMgRXhwbGljaXRUZW1wbGF0ZUJhc2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoInNob3ciLCAiZ2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiaW5oZXJpdCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldEluaGVyaXRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoImluaGVyaXQiLCAiZ2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgib3ZlcnJpZGUiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBnZXRPdmVycmlkZW4oKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJvdmVycmlkZSIsICJnZXQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJleHBsaWNpdCIpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZUJhc2Uuc2hvdy50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5wYXRoKCJpbmhlcml0IikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZUJhc2UuaW5oZXJpdC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5wYXRoKCJvdmVycmlkZSIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGUub3ZlcnJpZGUudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFRlbXBsYXRlQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdCIpCisgICAgQFRlbXBsYXRlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFRlbXBsYXRlIGV4dGVuZHMgSW1wbGljaXRUZW1wbGF0ZUJhc2UgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImltcGxpY2l0Iik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlQmFzZS5pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucGF0aCgiaW5oZXJpdCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGVCYXNlLmluaGVyaXQudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnBhdGgoIm92ZXJyaWRlIikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZS5vdmVycmlkZS50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhMWYzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEZsYXRWaWV3UHJvY2Vzc29yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEV4cGxpY2l0VGVtcGxhdGUuY2xhc3MsIEltcGxpY2l0VGVtcGxhdGUuY2xhc3MsIEltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS5jbGFzcywgSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoVGVzdFZpZXdQcm9jZXNzb3IuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvZXhwbGljaXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgic2hvdyIsICJnZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBwb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgic2hvdyIsICJwb3N0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoImV4cGxpY2l0IikucmVxdWVzdCgpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChyZXF1ZXN0LmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZS5zaG93LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQocmVxdWVzdC5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLCBJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZS5zaG93LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3QiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0IikKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCJpbXBsaWNpdCIpLnJlcXVlc3QoKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQocmVxdWVzdC5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGUuaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQtZXhwbGljaXQiKQorICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIHBvc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJzaG93IiwgInBvc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJzaG93IiwgImdldCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoImltcGxpY2l0LWV4cGxpY2l0IikucmVxdWVzdCgpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChyZXF1ZXN0LmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlLmluZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQocmVxdWVzdC5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLCBJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlLnNob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0KCJpbXBsaWNpdC1leHBsaWNpdCIpLnBhdGgoInN1YiIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS5zaG93LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQtZ2V0IikKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0V2l0aEdldFRlbXBsYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRXaXRoR2V0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdC1nZXQiKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0V2l0aEdldFRlbXBsYXRlLmluZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aEdldFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSIsIHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1nZXQtc3VicmVzb3VyY2UiKQorICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdC1nZXQtc3VicmVzb3VyY2UiKS5wYXRoKCJzdWIiKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUuc3ViLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUiLCB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vIikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNzA1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIEltcGxpY2l0VGVtcGxhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoVGVzdFZpZXdQcm9jZXNzb3IuY2xhc3MpLnByb3BlcnR5KCJqZXJzZXkuY29uZmlnLnNlcnZlci50cmFjaW5nIiwgIkFMTCIpOworICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQiKQorICAgIEBUZW1wbGF0ZQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbjtxcz0uNSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFRlbXBsYXRlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdCIpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIFJlc3BvbnNlIGNyID0gdGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iLCAiYXBwbGljYXRpb24vZm9vIikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIGNyLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iLCAidGV4dC9wbGFpbiIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbjtxPTAuNSIsICJhcHBsaWNhdGlvbi9mb28iKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGNyID0gdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2ZvbyIsICJ0ZXh0L3BsYWluO3E9MC41IikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIGNyLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQtZ2V0IikKKyAgICBAVGVtcGxhdGUKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW47cXM9MC41IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0V2l0aEdldFRlbXBsYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vO3FzPTAuMiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0V2l0aEdldFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0V2l0aEdldFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQtZ2V0Iik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgUmVzcG9uc2UgY3IgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIsICJhcHBsaWNhdGlvbi9mb28iKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUvaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICArICIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vIiwgInRleHQvcGxhaW4iKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUvaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICArICIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIsICJhcHBsaWNhdGlvbi9mb287cT0wLjUiKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUvaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICArICIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vO3E9MC41IiwgInRleHQvcGxhaW4iKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUvaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICArICIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgiKi8qIikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIGNyLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aEdldFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbjtxPTAuNSIsICJhcHBsaWNhdGlvbi9mb28iKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAiZm9vIiksIGNyLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSIsIGNyLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1nZXQtc3VicmVzb3VyY2UiKQorICAgIEBUZW1wbGF0ZQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbjtxcz0wLjUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb287cXM9MC4yIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQtZ2V0LXN1YnJlc291cmNlIikucGF0aCgic3ViIik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgUmVzcG9uc2UgY3IgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIsICJhcHBsaWNhdGlvbi9mb28iKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QiCisgICAgICAgICAgICAgICAgICAgICAgICArICIvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iLCAidGV4dC9wbGFpbiIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGNyID0gdGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iLCAiYXBwbGljYXRpb24vZm9vO3E9MC41IikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIGNyLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiL0ltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUvc3ViLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vO3E9MC41IiwgInRleHQvcGxhaW4iKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QiCisgICAgICAgICAgICAgICAgICAgICAgICArICIvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSIsIHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVByb2dyYW1tYXRpY1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlUHJvZ3JhbW1hdGljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTM0ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVByb2dyYW1tYXRpY1Rlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5IdHRwTWV0aG9kOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGVQcm9ncmFtbWF0aWNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhhbmRsZXIgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbnN0cnVjdG9yID0gIm5vLWFyZyI7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICAgICAgcHVibGljIEhhbmRsZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSGFuZGxlcihmaW5hbCBTdHJpbmcgY29uc3RydWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXNvdXJjZV8iICsgY29uc3RydWN0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBNZXRob2QgdG9TdHJpbmdNZXRob2QgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0b1N0cmluZ01ldGhvZCA9IEhhbmRsZXIuY2xhc3MuZ2V0TWV0aG9kKCJ0b1N0cmluZyIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRWF0IHRoYXQuCisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoImltcGxpY2l0Iik7CisKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZChIdHRwTWV0aG9kLlBPU1QpLmNvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28iKS5oYW5kbGVkQnkoSGFuZGxlci5jbGFzcywgdG9TdHJpbmdNZXRob2QpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKEh0dHBNZXRob2QuUE9TVCkuY29uc3VtZXMoImFwcGxpY2F0aW9uL2JhciIpLmhhbmRsZWRCeShuZXcgSGFuZGxlcigiYXJnIiksIHRvU3RyaW5nTWV0aG9kKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdEhhbmRsZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0KCJpbXBsaWNpdCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVByb2dyYW1tYXRpY1Rlc3QvSGFuZGxlci9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXNvdXJjZV9uby1hcmciLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjBiYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSW1wbGljaXRUZW1wbGF0ZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFJlc291cmNlLmNsYXNzLCBBbm90aGVySW1wbGljaXRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFNpbmdsZXRvblJlc291cmNlLmNsYXNzLCBJbXBsaWNpdFJvb3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdEdldFJlc291cmNlLmNsYXNzLCBBbm90aGVySW1wbGljaXRHZXRSZXNvdXJjZS5jbGFzcywgQW5vdGhlckFub3RoZXJJbXBsaWNpdEdldFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlbXBsYXRlCisgICAgQFBhdGgoIi9pbXBsaWNpdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFJlc291cmNlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5vdGhlckltcGxpY2l0UmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0QW5vdGhlclRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0VGVtcGxhdGVSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGF0aCA6IG5ldyBTdHJpbmdbXSB7IiIsICJpbmRleCIsICJnZXQifSkgeworICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQiKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiaW5kZXgiOworCisgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZSA9IHBhdGg7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhdGgocGF0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFJlc291cmNlLyIgKyB0ZW1wbGF0ZU5hbWUgKyAiLnRlc3RwIiwKKyAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZVJlc291cmNlc05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHRhcmdldCgiaW1wbGljaXQiKS5wYXRoKCJkby1ub3QtZXhpc3QiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQtZ2V0IikKKyAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdEdldFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdEdldFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQtZ2V0IikKKyAgICBAVGVtcGxhdGUKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5vdGhlckltcGxpY2l0R2V0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJBbm90aGVySW1wbGljaXRHZXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0LWdldC9hbm90aGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFub3RoZXJBbm90aGVySW1wbGljaXRHZXRSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQW5vdGhlckFub3RoZXJJbXBsaWNpdEdldFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0R2V0VGVtcGxhdGVSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGF0aCA6IG5ldyBTdHJpbmdbXSB7IiIsICJpbmRleCIsICJnZXQifSkgeworICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQtZ2V0Iik7CisgICAgICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gImluZGV4IjsKKworICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZU5hbWUgPSBwYXRoOworICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXRoKHBhdGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvQW5vdGhlckltcGxpY2l0R2V0UmVzb3VyY2UvIiArIHRlbXBsYXRlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi50ZXN0cCIsCisgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFub3RoZXJJbXBsaWNpdEdldFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVtcGxhdGUKKyAgICBAU2luZ2xldG9uCisgICAgQFBhdGgoIi9pbXBsaWNpdC1zaW5nbGV0b24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRTaW5nbGV0b25SZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRTaW5nbGV0b25UZW1wbGF0ZSIgKyBjb3VudGVyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFRlbXBsYXRlU2luZ2xldG9uUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQtc2luZ2xldG9uIik7CisKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0U2luZ2xldG9uUmVzb3VyY2UvaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFNpbmdsZXRvblRlbXBsYXRlIiArIGksIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1zdWItcmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRSb290UmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgSW1wbGljaXRTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW1wbGljaXRTdWJSZXNvdXJjZSgiSW1wbGljaXRSb290UmVzb3VyY2UiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RyaW5nOworCisgICAgICAgIHB1YmxpYyBJbXBsaWNpdFN1YlJlc291cmNlKGZpbmFsIFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBJbXBsaWNpdFN1YlN1YlJlc291cmNlIGdldFN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbXBsaWNpdFN1YlN1YlJlc291cmNlKHN0cmluZyArICJJbXBsaWNpdFN1YlJlc291cmNlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0U3ViU3ViUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN0cmluZzsKKworICAgICAgICBwdWJsaWMgSW1wbGljaXRTdWJTdWJSZXNvdXJjZShmaW5hbCBTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZyArICJJbXBsaWNpdFN1YlN1YlJlc291cmNlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQtc3ViLXJlc291cmNlIikucGF0aCgic3ViIikucGF0aCgic3ViIik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0U3ViU3ViUmVzb3VyY2UvaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRSb290UmVzb3VyY2VJbXBsaWNpdFN1YlJlc291cmNlSW1wbGljaXRTdWJTdWJSZXNvdXJjZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFZpZXdXaXRoUmVzb3VyY2VGaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRWaWV3V2l0aFJlc291cmNlRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkODE1NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRWaWV3V2l0aFJlc291cmNlRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSW1wbGljaXRWaWV3V2l0aFJlc291cmNlRmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEltcGxpY2l0VGVtcGxhdGUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEZpbHRlck9uZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRmlsdGVyVHdvLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMTApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXJPbmUgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB4VGVzdCA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpOworICAgICAgICAgICAgYXNzZXJ0TnVsbCh4VGVzdCk7CisKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIlgtVEVTVCIsICJvbmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cworICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByeFRlc3QgPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCByeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgcnhUZXN0LmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInR3byIsIHJ4VGVzdC5nZXQoMSkpOworCisgICAgICAgICAgICBMaXN0PE9iamVjdD4geFRlc3QgPSByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidHdvIiwgeFRlc3QuZ2V0KDApKTsKKworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmdldCgiWS1URVNUIikpOworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIlktVEVTVCIsICJvbmUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgyMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlclR3byBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHhUZXN0ID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgeFRlc3QuZ2V0KDApKTsKKworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiWC1URVNUIiwgInR3byIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzCisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJ4VGVzdCA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJ4VGVzdC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCByeFRlc3QuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidHdvIiwgcnhUZXN0LmdldCgxKSk7CisKKyAgICAgICAgICAgIGFzc2VydE51bGwocmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwocmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5nZXQoIlktVEVTVCIpKTsKKworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIlgtVEVTVCIsICJ0d28iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgiLyIpLnJlcXVlc3QoKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHJlcXVlc3QuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgICAgICBMaXN0PE9iamVjdD4geFRlc3QgPSBjci5nZXRNZXRhZGF0YSgpLmdldCgiWC1URVNUIik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB4VGVzdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInR3byIsIHhUZXN0LmdldCgwKSk7CisKKyAgICAgICAgTGlzdDxPYmplY3Q+IHlUZXN0ID0gY3IuZ2V0TWV0YWRhdGEoKS5nZXQoIlktVEVTVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgeVRlc3Quc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCB5VGVzdC5nZXQoMCkpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0Vmlld1dpdGhSZXNvdXJjZUZpbHRlclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGQ4NDdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgRXhwbGljaXRUZW1wbGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFRlbXBsYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi9leHBsaWNpdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlIGV4dGVuZHMgRXhwbGljaXRUZW1wbGF0ZUJhc2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoInNob3ciLCAiZ2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiaW5oZXJpdCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldEluaGVyaXRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoImluaGVyaXQiLCAiZ2V0Iik7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgib3ZlcnJpZGUiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBnZXRPdmVycmlkZW4oKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJvdmVycmlkZSIsICJnZXQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJleHBsaWNpdCIpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlQmFzZS9zaG93LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnBhdGgoImluaGVyaXQiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGVCYXNlL2luaGVyaXQudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucGF0aCgib3ZlcnJpZGUiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvb3ZlcnJpZGUudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFRlbXBsYXRlQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdCIpCisgICAgQFRlbXBsYXRlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFRlbXBsYXRlIGV4dGVuZHMgSW1wbGljaXRUZW1wbGF0ZUJhc2UgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImltcGxpY2l0Iik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGVCYXNlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5wYXRoKCJpbmhlcml0IikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlQmFzZS9pbmhlcml0LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5wYXRoKCJvdmVycmlkZSIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9vdmVycmlkZS50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhZDEyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9NdmNFbmNvZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuZnJlZW1hcmtlci5GcmVlbWFya2VyTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLm11c3RhY2hlLk11c3RhY2hlTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBNVkMgZW5jb2RpbmcgY2hhcnNldCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTXZjRW5jb2RpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIlxcdTAxNjFcXHUwMTBkXFx1MDE1OVxcdTAxN2VcXHUwMGZkXFx1MDBlMVxcdTAwZWRcXHUwMGU5IjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICAgICAgICAgIHtuZXcgRnJlZW1hcmtlck12Y0ZlYXR1cmUoKSwgImZyZWVtYXJrZXIiLCAiRnJlZW1hcmtlclJlc291cmNlLmZ0bCIsICJVVEYtOCJ9LAorICAgICAgICAgICAgICAgIHtuZXcgRnJlZW1hcmtlck12Y0ZlYXR1cmUoKSwgImZyZWVtYXJrZXIiLCAiRnJlZW1hcmtlclJlc291cmNlLmZ0bCIsICJVVEYtMTYifSwKKyAgICAgICAgICAgICAgICB7bmV3IEZyZWVtYXJrZXJNdmNGZWF0dXJlKCksICJmcmVlbWFya2VyIiwgIkZyZWVtYXJrZXJSZXNvdXJjZS5mdGwiLCAid2luZG93cy0xMjUwIn0sCisgICAgICAgICAgICAgICAge25ldyBGcmVlbWFya2VyTXZjRmVhdHVyZSgpLCAiZnJlZW1hcmtlciIsICJGcmVlbWFya2VyUmVzb3VyY2UuZnRsIiwgIklTTy04ODU5LTIifSwKKyAgICAgICAgICAgICAgICB7bmV3IE11c3RhY2hlTXZjRmVhdHVyZSgpLCAibXVzdGFjaGUiLCAiTXVzdGFjaGVSZXNvdXJjZS5tdXN0YWNoZSIsICJVVEYtOCJ9LAorICAgICAgICAgICAgICAgIHtuZXcgTXVzdGFjaGVNdmNGZWF0dXJlKCksICJtdXN0YWNoZSIsICJNdXN0YWNoZVJlc291cmNlLm11c3RhY2hlIiwgIlVURi0xNiJ9LAorICAgICAgICAgICAgICAgIHtuZXcgTXVzdGFjaGVNdmNGZWF0dXJlKCksICJtdXN0YWNoZSIsICJNdXN0YWNoZVJlc291cmNlLm11c3RhY2hlIiwgIndpbmRvd3MtMTI1MCJ9LAorICAgICAgICAgICAgICAgIHtuZXcgTXVzdGFjaGVNdmNGZWF0dXJlKCksICJtdXN0YWNoZSIsICJNdXN0YWNoZVJlc291cmNlLm11c3RhY2hlIiwgIklTTy04ODU5LTIifSwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0RW5jb2Rpbmc7CisKKyAgICBwdWJsaWMgTXZjRW5jb2RpbmdUZXN0KEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIHByb3BlcnR5U3VmZml4LCBTdHJpbmcgdGVtcGxhdGVOYW1lLCBTdHJpbmcgZGVmYXVsdEVuY29kaW5nKSB7CisgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZlYXR1cmUpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEZyZWVtYXJrZXJSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoTXZjRmVhdHVyZS5FTkNPRElORyArICIuIiArIHByb3BlcnR5U3VmZml4LCBkZWZhdWx0RW5jb2RpbmcpKTsKKyAgICAgICAgTXZjRW5jb2RpbmdUZXN0LnRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKKyAgICAgICAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBkZWZhdWx0RW5jb2Rpbmc7CisgICAgfQorCisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRnJlZW1hcmtlclJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0KCkgeworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1hcC5wdXQoInVzZXIiLCBNRVNTQUdFKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC8iICsgdGVtcGxhdGVOYW1lLCBtYXApOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGV4dHBsYWluIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldFRleHRQbGFpbigpIHsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgICBtYXAucHV0KCJ1c2VyIiwgTUVTU0FHRSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9NdmNFbmNvZGluZ1Rlc3QvIiArIHRlbXBsYXRlTmFtZSwgbWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInRleHRwbGFpblVURjE2IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTE2IikKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldFRleHRQbGFpblVURjE2KCkgeworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1hcC5wdXQoInVzZXIiLCBNRVNTQUdFKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC8iICsgdGVtcGxhdGVOYW1lLCBtYXApOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbmNvZGluZygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTW9kZWw6IiArIE1FU1NBR0UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiovKjtjaGFyc2V0PSIgKyBkZWZhdWx0RW5jb2RpbmcsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRlZmF1bHRFbmNvZGluZywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkuZ2V0UGFyYW1ldGVycygpLmdldChNZWRpYVR5cGUuQ0hBUlNFVF9QQVJBTUVURVIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0UGxhaW5EZWZhdWx0RW5jb2RpbmcoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvdGV4dHBsYWluIikucmVxdWVzdCgiKi8qLHRleHQvcGxhaW4sdGV4dC9odG1sIikuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1vZGVsOiIgKyBNRVNTQUdFLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluO2NoYXJzZXQ9IiArIGRlZmF1bHRFbmNvZGluZywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGVmYXVsdEVuY29kaW5nLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KE1lZGlhVHlwZS5DSEFSU0VUX1BBUkFNRVRFUikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRQbGFpbjQwNigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS90ZXh0cGxhaW4iKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDYsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0UGxhaW5VVEYxNigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS90ZXh0cGxhaW5VVEYxNiIpLnJlcXVlc3QoIiovKix0ZXh0L3BsYWluLHRleHQvaHRtbCIpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNb2RlbDoiICsgTUVTU0FHRSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidGV4dC9wbGFpbjtjaGFyc2V0PVVURi0xNiIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVVEYtMTYiLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KE1lZGlhVHlwZS5DSEFSU0VUX1BBUkFNRVRFUikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQzZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXIuVGVzdFZpZXdQcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5hbnlPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3RzIHRoYXQge0BsaW5rIFRlbXBsYXRlfSBhbm5vdGF0ZWQgbWV0aG9kcyBhcmUgc2VsZWN0ZWQgYnkgdGhlIHJvdXRpbmcgYWxnb3JpdGhtcyBhcyBpZiB0aGV5CisgKiB3b3VsZCBhY3R1YWxseSByZXR1cm4ge0BsaW5rIFZpZXdhYmxlfSBpbnN0ZWFkIG9mIHRoZSBtb2RlbC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gTU9ERUwgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSB7eworICAgICAgICBwdXQoImEiLCAiaGVsbG8iKTsKKyAgICAgICAgcHV0KCJiIiwgIndvcmxkIik7CisgICAgfX07CisKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZU1ldGhvZC5jbGFzcywKKyAgICAgICAgICAgICAgICBUZW1wbGF0ZUFubm90YXRlZFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEJhc2ljUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQXNWaWV3YWJsZVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE5vVGVtcGxhdGVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBMb2dnaW5nRmVhdHVyZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNdmNGZWF0dXJlLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzLAorICAgICAgICAgICAgICAgIE1veHlKc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE1veHlKc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNeUJlYW4gZ2V0TXlCZWFuKCkgeworICAgICAgICBmaW5hbCBNeUJlYW4gbXlCZWFuID0gbmV3IE15QmVhbigpOworICAgICAgICBteUJlYW4uc2V0TmFtZSgiaGVsbG8iKTsKKyAgICAgICAgcmV0dXJuIG15QmVhbjsKKyAgICB9CisKKyAgICBAWG1sUm9vdEVsZW1lbnQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QmVhbiB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImFubm90YXRlZE1ldGhvZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZW1wbGF0ZUFubm90YXRlZFJlc291cmNlTWV0aG9kIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9IVE1MKQorICAgICAgICBAVGVtcGxhdGUoKQorICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBc0hUTUwoKSB7CisgICAgICAgICAgICByZXR1cm4gTU9ERUw7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgICAgIHB1YmxpYyBNeUJlYW4gZ2V0QXNKU09OKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldE15QmVhbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm5vVGVtcGxhdGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9UZW1wbGF0ZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9IVE1MKQorICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBc0hUTUwoKSB7CisgICAgICAgICAgICByZXR1cm4gTU9ERUw7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgICAgIHB1YmxpYyBNeUJlYW4gZ2V0QXNKU09OKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldE15QmVhbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImFubm90YXRlZENsYXNzIikKKyAgICBAVGVtcGxhdGUKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfSFRNTCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgcHVibGljIE15QmVhbiBnZXRBc0pTT04oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TXlCZWFuKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiVGhpcyB0b1N0cmluZygpIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZ2V0IG1vZGVsLiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiYmFzaWMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX0hUTUwpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNIVE1MKCkgeworICAgICAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgcHVibGljIE15QmVhbiBnZXRBc0pTT04oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TXlCZWFuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgidmlld2FibGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXNWaWV3YWJsZVJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfSFRNTCkKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldEFzSFRNTCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoImluZGV4LnRlc3RwIiwgTU9ERUwpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgIHB1YmxpYyBNeUJlYW4gZ2V0QXNKU09OKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldE15QmVhbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IG1ha2VzIHJlcXVlc3QgZm9yIHRleHQvaHRtbCB3aGljaCBpcyBwcmVmZXJyZWQuIFRoZSByZXNvdXJjZSBkZWZpbmVzIHRoZSBtZXRob2QKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMuVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0LlRlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2VNZXRob2QjZ2V0QXNIVE1MKCl9CisgICAgICogd2hpY2ggcmV0dXJucyB7QGxpbmsgTWFwfSBmb3Igd2hpY2ggdGhlcmUgaXMgbm90IHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXJ9LiBUaGUgYWJzZW5jZSBvZiB0aGUKKyAgICAgKiB3cml0ZXIgd291bGQgY2F1c2UgdGhhdCB0aGUgbWV0aG9kIHdvdWxkIG5vdCBoYXZlIGJlZW4gc2VsZWN0ZWQgYnV0IGFzIHRoZSB7QGxpbmsgVGVtcGxhdGV9IGFubm90YXRpb24KKyAgICAgKiBpcyBvbiB0aGUgbWV0aG9kLCB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nLk1ldGhvZFNlbGVjdGluZ1JvdXRlcn0gY29uc2lkZXJzCisgICAgICogaXQgYXMgaWYgdGhpcyB3b3VsZCBoYXZlIGJlZW4ge0BsaW5rIFZpZXdhYmxlfSBpbnN0ZWFkIG9mIHRoZSB7QGxpbmsgTWFwfS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0ZWRNZXRob2RCeVRlbXBsYXRlSHRtbCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhbm5vdGF0ZWRNZXRob2QiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWw7cT0wLjgiLCAiYXBwbGljYXRpb24vanNvbjtxPTAuNyIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksCisgICAgICAgICAgICAgICAgYW55T2YoY29udGFpbnNTdHJpbmcoIntiPXdvcmxkLCBhPWhlbGxvfSIpLCBjb250YWluc1N0cmluZygie2E9aGVsbG8sIGI9d29ybGR9IikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0ZWRNZXRob2RCeVRlbXBsYXRlSnNvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhbm5vdGF0ZWRNZXRob2QiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWw7cT0wLjYiLCAiYXBwbGljYXRpb24vanNvbjtxPTAuNyIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCByZXNwb25zZS5yZWFkRW50aXR5KE15QmVhbi5jbGFzcykuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0ZWRDbGFzc0J5VGVtcGxhdGVIdG1sKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFubm90YXRlZENsYXNzIikucmVxdWVzdCgidGV4dC9odG1sO3E9MC44IiwgImFwcGxpY2F0aW9uL2pzb247cT0wLjciKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLmNvbnRhaW5zKCJtb2RlbD1UaGlzIHRvU3RyaW5nKCkgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBnZXQgbW9kZWwuIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRlZENsYXNzQnlUZW1wbGF0ZUpzb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYW5ub3RhdGVkQ2xhc3MiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWw7cT0wLjYiLCAiYXBwbGljYXRpb24vanNvbjtxPTAuNyIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCByZXNwb25zZS5yZWFkRW50aXR5KE15QmVhbi5jbGFzcykuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0h0bWwoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYmFzaWMiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWw7cT0wLjgiLCAiYXBwbGljYXRpb24vanNvbjtxPTAuNyIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuY29udGFpbnMoIkhlbGxvIFdvcmxkIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljSnNvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJiYXNpYyIpLnJlcXVlc3QoInRleHQvaHRtbDtxPTAuNiIsICJhcHBsaWNhdGlvbi9qc29uO3E9MC43IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlCZWFuLmNsYXNzKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzVmlld2FibGVIdG1sKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInZpZXdhYmxlIikucmVxdWVzdCgidGV4dC9odG1sO3E9MC44IiwgImFwcGxpY2F0aW9uL2pzb247cT0wLjciKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLAorICAgICAgICAgICAgICAgIGFueU9mKGNvbnRhaW5zU3RyaW5nKCJ7Yj13b3JsZCwgYT1oZWxsb30iKSwgY29udGFpbnNTdHJpbmcoInthPWhlbGxvLCBiPXdvcmxkfSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNWaWV3YWJsZUpzb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidmlld2FibGUiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWw7cT0wLjYiLCAiYXBwbGljYXRpb24vanNvbjtxPTAuNyIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCByZXNwb25zZS5yZWFkRW50aXR5KE15QmVhbi5jbGFzcykuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB0aGVyZSBpcyByZWFsbHkgbm8ge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcn0KKyAgICAgKiBmb3Ige0Bjb2RlIE1hcDxTdHJpbmcsU3RyaW5nPn19LiB0ZXh0L2h0bWwgaXMgcmVxdWVzdGVkIGJ1dCBhcHBsaWNhdGlvbi9qc29uIGlzIGNob3NlbiB0aGVyZSBpcyBubworICAgICAqIE1CVyBmb3Ige0Bjb2RlIE1hcH0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UZW1wbGF0ZUh0bWwoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgibm9UZW1wbGF0ZSIpLnJlcXVlc3QoInRleHQvaHRtbDtxPTAuOSIsICJhcHBsaWNhdGlvbi9qc29uO3E9MC43IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlCZWFuLmNsYXNzKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vVGVtcGxhdGVKc29uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIm5vVGVtcGxhdGUiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWw7cT0wLjYiLCAiYXBwbGljYXRpb24vanNvbjtxPTAuNyIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCByZXNwb25zZS5yZWFkRW50aXR5KE15QmVhbi5jbGFzcykuZ2V0TmFtZSgpKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJlM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFZpZXdQcm9jZXNzb3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlZ2lzdGVyID0gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIEV4cGxpY2l0VGVtcGxhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgSW1wbGljaXRUZW1wbGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoVGVzdFZpZXdQcm9jZXNzb3IuY2xhc3MpOworICAgICAgICByZWdpc3Rlci5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyOworICAgIH0KKworICAgIEBUZW1wbGF0ZQorICAgIEBQYXRoKCIvZXhwbGljaXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShuZXcgVmlld2FibGUoInNob3ciLCAiZ2V0IikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgcG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoInNob3ciLCAicG9zdCIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYWJzb2x1dGUiKQorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0QWJzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUvc2hvdyIsCisgICAgICAgICAgICAgICAgICAgICJnZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJhYnNvbHV0ZSIpCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBwb3N0QWJzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUvc2hvdyIsCisgICAgICAgICAgICAgICAgICAgICJwb3N0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoImV4cGxpY2l0IikucmVxdWVzdCgpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChyZXF1ZXN0LmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChyZXF1ZXN0LnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSksIElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRBYnNvbHV0ZVRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoImV4cGxpY2l0IikucGF0aCgiYWJzb2x1dGUiKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHJlcXVlc3QuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUvc2hvdy50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHJlcXVlc3QucG9zdChFbnRpdHkuZW50aXR5KCIiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSwgSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3QiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0IikKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCJpbXBsaWNpdCIpLnJlcXVlc3QoKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQocmVxdWVzdC5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1leHBsaWNpdCIpCisgICAgQFRlbXBsYXRlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgcG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoInNob3ciLCAicG9zdCIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoInNob3ciLCAiZ2V0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgiaW1wbGljaXQtZXhwbGljaXQiKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHJlcXVlc3QuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHJlcXVlc3QucG9zdChFbnRpdHkuZW50aXR5KCIiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSwgSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0KCJpbXBsaWNpdC1leHBsaWNpdCIpLnBhdGgoInN1YiIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1nZXQiKQorICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImltcGxpY2l0LWdldCIpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiLCB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vIikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQtZ2V0LXN1YnJlc291cmNlIikKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQtZ2V0LXN1YnJlc291cmNlIikucGF0aCgic3ViIik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUvc3ViLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUiLCB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vIikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9BYmNWaWV3UHJvY2Vzc29yLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvQWJjVmlld1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzcyYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvQWJjVmlld1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFiY1ZpZXdQcm9jZXNzb3IgZXh0ZW5kcyBUZXN0Vmlld1Byb2Nlc3NvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKKyAgICAgICAgcmV0dXJuICIuYWJjIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdQcm9jZXNzb3JOYW1lKCkgeworICAgICAgICByZXR1cm4gIkFiY1ZpZXdQcm9jZXNzb3IiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdE1lZGlhVHlwZShmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJhYmMiKS5lcXVhbHMobWVkaWFUeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvQ3VzdG9tVmlld2FibGVDb250ZXh0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvQ3VzdG9tVmlld2FibGVDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiZDhmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9DdXN0b21WaWV3YWJsZUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsLlRlbXBsYXRlSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlJlc29sdmVkVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVGVtcGxhdGVQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVmlld2FibGVDb250ZXh0OworCisvKioKKyAqIEN1c3RvbSB7QGxpbmsgVmlld2FibGVDb250ZXh0IHZpZXdhYmxlIGNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBDdXN0b21WaWV3YWJsZUNvbnRleHQgaW1wbGVtZW50cyBWaWV3YWJsZUNvbnRleHQgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc29sdmVkVmlld2FibGUgcmVzb2x2ZVZpZXdhYmxlKGZpbmFsIFZpZXdhYmxlIHZpZXdhYmxlLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiByZXNvdXJjZUNsYXNzLCBmaW5hbCBUZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZVByb2Nlc3NvcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IFRlbXBsYXRlSGVscGVyLmdldFRlbXBsYXRlTmFtZSh2aWV3YWJsZSk7CisgICAgICAgIGZpbmFsIE9iamVjdCB0ZW1wbGF0ZVJlZmVyZW5jZSA9IHRlbXBsYXRlUHJvY2Vzc29yLnJlc29sdmUoIi9DdXN0b21WaWV3YWJsZUNvbnRleHQvIiArIHBhdGgsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisKKyAgICAgICAgaWYgKHRlbXBsYXRlUmVmZXJlbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRWaWV3YWJsZSh0ZW1wbGF0ZVByb2Nlc3NvciwgdGVtcGxhdGVSZWZlcmVuY2UsIHZpZXdhYmxlLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9EZWZWaWV3UHJvY2Vzc29yLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvRGVmVmlld1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzAyZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvRGVmVmlld1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIERlZlZpZXdQcm9jZXNzb3IgZXh0ZW5kcyBUZXN0Vmlld1Byb2Nlc3NvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKKyAgICAgICAgcmV0dXJuICIuZGVmIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdQcm9jZXNzb3JOYW1lKCkgeworICAgICAgICByZXR1cm4gIkRlZlZpZXdQcm9jZXNzb3IiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdE1lZGlhVHlwZShmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAhbmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAiYWJjIikuZXF1YWxzKG1lZGlhVHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3Byb3ZpZGVyL1Rlc3RWaWV3UHJvY2Vzc29yLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvVGVzdFZpZXdQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjEyNTZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3Byb3ZpZGVyL1Rlc3RWaWV3UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5UZW1wbGF0ZVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXJyb3I7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Vmlld1Byb2Nlc3NvciBpbXBsZW1lbnRzIFRlbXBsYXRlUHJvY2Vzc29yPFN0cmluZz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyByZXNvbHZlKFN0cmluZyBwYXRoLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oKTsKKworICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgcGF0aCA9IHBhdGggKyBleHRlbnNpb247CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBVUkwgdSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShwYXRoKTsKKyAgICAgICAgaWYgKHUgPT0gbnVsbCB8fCAhYWNjZXB0TWVkaWFUeXBlKG1lZGlhVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdE1lZGlhVHlwZShmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nIHRlbXBsYXRlUmVmZXJlbmNlLCBWaWV3YWJsZSB2aWV3YWJsZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbShvdXQpOworICAgICAgICBwcy5wcmludCgibmFtZT0iKTsKKyAgICAgICAgcHMucHJpbnQoZ2V0Vmlld1Byb2Nlc3Nvck5hbWUoKSk7CisgICAgICAgIHBzLnByaW50bG4oKTsKKyAgICAgICAgcHMucHJpbnQoInBhdGg9Iik7CisgICAgICAgIHBzLnByaW50KHRlbXBsYXRlUmVmZXJlbmNlKTsKKyAgICAgICAgcHMucHJpbnRsbigpOworICAgICAgICBwcy5wcmludCgibW9kZWw9Iik7CisgICAgICAgIHBzLnByaW50KGdldE1vZGVsKHZpZXdhYmxlLmdldE1vZGVsKCkpKTsKKyAgICAgICAgcHMucHJpbnRsbigpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldE1vZGVsKGZpbmFsIE9iamVjdCBtb2RlbCkgeworICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3Qgb2JqZWN0IDogKENvbGxlY3Rpb24pIG1vZGVsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0TW9kZWwob2JqZWN0KSkuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5kZWxldGUoYnVpbGRlci5sZW5ndGgoKSAtIDEsIGJ1aWxkZXIubGVuZ3RoKCkpLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHsKKyAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRpb25FcnJvciBlcnJvciA9IChWYWxpZGF0aW9uRXJyb3IpIG1vZGVsOworICAgICAgICAgICAgcmV0dXJuIGVycm9yLmdldE1lc3NhZ2VUZW1wbGF0ZSgpICsgIl8iICsgZXJyb3IuZ2V0UGF0aCgpICsgIl8iICsgZXJyb3IuZ2V0SW52YWxpZFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZGVsLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7CisgICAgICAgIHJldHVybiAiLnRlc3RwIjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdQcm9jZXNzb3JOYW1lKCkgeworICAgICAgICByZXR1cm4gIlRlc3RWaWV3UHJvY2Vzc29yIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9zcGkvQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9zcGkvQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTllMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnNwaTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoeworICAgICAgICBBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC5GYWN0b3J5SW5zdGFuY2VUZXN0LmNsYXNzLAorICAgICAgICBBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC5GYWN0b3J5SW5zdGFuY2VOZWdhdGl2ZVRlc3QuY2xhc3MsCisgICAgICAgIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LkZhY3RvcnlDbGFzc1Rlc3QuY2xhc3MsCisgICAgICAgIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LkZhY3RvcnlDbGFzc05lZ2F0aXZlVGVzdC5jbGFzcywKKyAgICAgICAgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuRmFjdG9yeUNsYXNzTmFtZVRlc3QuY2xhc3MsCisgICAgICAgIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LkZhY3RvcnlDbGFzc05hbWVOZWdhdGl2ZVRlc3QuY2xhc3MsCisgICAgICAgIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LkNhY2hlUG9zaXRpdmVUZXN0LmNsYXNzLAorICAgICAgICBBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC5DYWNoZVBvc2l0aXZlU3RyaW5nVGVzdC5jbGFzcywKKyAgICAgICAgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuQ2FjaGVOZWdhdGl2ZVRlc3QuY2xhc3MsCisgICAgICAgIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LkNhY2hlSW52YWxpZFRlc3QuY2xhc3MKK30pCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFRlbXBsYXRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJrbyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RGYWN0b3J5IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgVGVzdEZhY3RvcnkoKSB7CisgICAgICAgICAgICB0aGlzKCJJbmplY3RlZCBUZXN0IEZhY3RvcnkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0RmFjdG9yeShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeVRlbXBsYXRlUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvcjxTdHJpbmc+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFRlc3RGYWN0b3J5IGZhY3Rvcnk7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgRmFjdG9yeVRlbXBsYXRlUHJvY2Vzc29yKENvbmZpZ3VyYXRpb24gY29uZmlnLCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbmZpZywgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTZXJ2bGV0Q29udGV4dC5jbGFzcyksICJmYWN0b3J5IiwgImZjdCIpOworCisgICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBnZXRUZW1wbGF0ZU9iamVjdEZhY3RvcnkoaW5qZWN0aW9uTWFuYWdlcjo6Y3JlYXRlQW5kSW5pdGlhbGl6ZSwgVGVzdEZhY3RvcnkuY2xhc3MsIFZhbHVlcy5sYXp5KAorICAgICAgICAgICAgICAgICAgICAoVmFsdWU8VGVzdEZhY3Rvcnk+KSAoKSAtPiBuZXcgVGVzdEZhY3RvcnkoIkRlZmF1bHQgVGVzdCBGYWN0b3J5IikpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoZmluYWwgU3RyaW5nIHRlbXBsYXRlUGF0aCwgZmluYWwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS52YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyB0ZW1wbGF0ZVJlZmVyZW5jZSwgZmluYWwgVmlld2FibGUgdmlld2FibGUsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBvdXQud3JpdGUodGVtcGxhdGVSZWZlcmVuY2UuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEZhY3RvcnlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlOworCisgICAgICAgIEZhY3RvcnlUZXN0KGZpbmFsIE9iamVjdCBmYWN0b3J5LCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRmFjdG9yeVRlbXBsYXRlUHJvY2Vzc29yLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoTXZjRmVhdHVyZS5URU1QTEFURV9PQkpFQ1RfRkFDVE9SWSArICIuZmFjdG9yeSIsIGZhY3RvcnkpKTsKKworICAgICAgICAgICAgdGhpcy5leHBlY3RlZE1lc3NhZ2UgPSBleHBlY3RlZE1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKGV4cGVjdGVkTWVzc2FnZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5SW5zdGFuY2VUZXN0IGV4dGVuZHMgRmFjdG9yeVRlc3QgeworCisgICAgICAgIHB1YmxpYyBGYWN0b3J5SW5zdGFuY2VUZXN0KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIobmV3IFRlc3RGYWN0b3J5KCksICJJbmplY3RlZCBUZXN0IEZhY3RvcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeUluc3RhbmNlTmVnYXRpdmVUZXN0IGV4dGVuZHMgRmFjdG9yeVRlc3QgeworCisgICAgICAgIHB1YmxpYyBGYWN0b3J5SW5zdGFuY2VOZWdhdGl2ZVRlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcigiRGVmYXVsdCBUZXN0IEZhY3RvcnkiLCAiRGVmYXVsdCBUZXN0IEZhY3RvcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeUNsYXNzVGVzdCBleHRlbmRzIEZhY3RvcnlUZXN0IHsKKworICAgICAgICBwdWJsaWMgRmFjdG9yeUNsYXNzVGVzdCgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKFRlc3RGYWN0b3J5LmNsYXNzLCAiSW5qZWN0ZWQgVGVzdCBGYWN0b3J5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnlDbGFzc05lZ2F0aXZlVGVzdCBleHRlbmRzIEZhY3RvcnlUZXN0IHsKKworICAgICAgICBwdWJsaWMgRmFjdG9yeUNsYXNzTmVnYXRpdmVUZXN0KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoU3RyaW5nLmNsYXNzLCAiRGVmYXVsdCBUZXN0IEZhY3RvcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeUNsYXNzTmFtZVRlc3QgZXh0ZW5kcyBGYWN0b3J5VGVzdCB7CisKKyAgICAgICAgcHVibGljIEZhY3RvcnlDbGFzc05hbWVUZXN0KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoVGVzdEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCAiSW5qZWN0ZWQgVGVzdCBGYWN0b3J5Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnlDbGFzc05hbWVOZWdhdGl2ZVRlc3QgZXh0ZW5kcyBGYWN0b3J5VGVzdCB7CisKKyAgICAgICAgcHVibGljIEZhY3RvcnlDbGFzc05hbWVOZWdhdGl2ZVRlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLCAiRGVmYXVsdCBUZXN0IEZhY3RvcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FjaGVUZW1wbGF0ZVByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3I8U3RyaW5nPiB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaSA9IDA7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgQ2FjaGVUZW1wbGF0ZVByb2Nlc3NvcihDb25maWd1cmF0aW9uIGNvbmZpZywgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgICAgICBzdXBlcihjb25maWcsIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU2VydmxldENvbnRleHQuY2xhc3MpLCAiZmFjdG9yeSIsICJmY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoZmluYWwgU3RyaW5nIHRlbXBsYXRlUGF0aCwgZmluYWwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gIiIgKyBpKys7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBTdHJpbmcgdGVtcGxhdGVSZWZlcmVuY2UsIGZpbmFsIFZpZXdhYmxlIHZpZXdhYmxlLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgb3V0LndyaXRlKHRlbXBsYXRlUmVmZXJlbmNlLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDYWNoZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2FjaGU7CisKKyAgICAgICAgQ2FjaGVUZXN0KGZpbmFsIE9iamVjdCBjYWNoZSkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKENhY2hlVGVtcGxhdGVQcm9jZXNzb3IuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShNdmNGZWF0dXJlLkNBQ0hFX1RFTVBMQVRFUyArICIuZmFjdG9yeSIsIGNhY2hlKSk7CisKKyAgICAgICAgICAgIHRoaXMuY2FjaGUgPSBCb29sZWFuLnZhbHVlT2YoY2FjaGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiMCIpKTsKKworICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKGNhY2hlID8gIjAiIDogIjEiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhY2hlUG9zaXRpdmVUZXN0IGV4dGVuZHMgQ2FjaGVUZXN0IHsKKworICAgICAgICBwdWJsaWMgQ2FjaGVQb3NpdGl2ZVRlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcih0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FjaGVQb3NpdGl2ZVN0cmluZ1Rlc3QgZXh0ZW5kcyBDYWNoZVRlc3QgeworCisgICAgICAgIHB1YmxpYyBDYWNoZVBvc2l0aXZlU3RyaW5nVGVzdCgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKCJ0cnVlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhY2hlTmVnYXRpdmVUZXN0IGV4dGVuZHMgQ2FjaGVUZXN0IHsKKworICAgICAgICBwdWJsaWMgQ2FjaGVOZWdhdGl2ZVRlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENhY2hlSW52YWxpZFRlc3QgZXh0ZW5kcyBDYWNoZVRlc3QgeworCisgICAgICAgIHB1YmxpYyBDYWNoZUludmFsaWRUZXN0KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoImludmFsaWQiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3BhY2thZ2UtaW5mby5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYjA2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IEVuZCB0byBFbmQgc2VydmVyIHRlc3QgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvcm91dGluZy9Jbmhlcml0YW5jZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3JvdXRpbmcvSW5oZXJpdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3Mjk3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3JvdXRpbmcvSW5oZXJpdGFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5yb3V0aW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEluaGVyaXRhbmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykucmVnaXN0ZXIoV3JpdGVyQS5jbGFzcykucmVnaXN0ZXIoV3JpdGVyQi5jbGFzcykucmVnaXN0ZXIoV3JpdGVyU3RyaW5nLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEEgeworCisgICAgICAgIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgQSgpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSAiYSI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQiBleHRlbmRzIEEgeworCisgICAgICAgIHB1YmxpYyBCKCkgeworICAgICAgICAgICAgc3VwZXIoImIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgc3VwZXIoImIiICsgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIEEgZ2V0QSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQigiYSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXcml0ZXJBIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8QT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBBLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBBIGEsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBBIGEsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoKCJhIiArIGEudmFsdWUpLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKHsidGV4dC9wbGFpbiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV3JpdGVyU3RyaW5nIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBTdHJpbmcgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImIvYiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXcml0ZXJCIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8Qj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBCLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBCIGIsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBCIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgoImIiICsgYi52YWx1ZSkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZXJFbnRpdHlJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnJlcXVlc3QoImEvYiIpLmdldChTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJhYmEiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvcm91dGluZy9SZXNwb25zZU1lZGlhVHlwZUZyb21Qcm92aWRlcnNUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9yb3V0aW5nL1Jlc3BvbnNlTWVkaWFUeXBlRnJvbVByb3ZpZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWVkNzhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvcm91dGluZy9SZXNwb25zZU1lZGlhVHlwZUZyb21Qcm92aWRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5yb3V0aW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFJlc3BvbnNlTWVkaWFUeXBlRnJvbVByb3ZpZGVyc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJyZXNwb25zZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZVJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRMaXN0KCkgeworICAgICAgICAgICAgLy8gbXVzdCBiZSBhbiBBcnJheUxpc3QuIEFycmF5cy5hc0xpc3QgY3JlYXRlcyBBcnJheXMkQXJyYXlMaXN0LgorICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoImFycmF5IiwgImxpc3QiKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKEFycmF5TGlzdDo6bmV3KSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsaXN0IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHJlc3BvbnNlTGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhnZXRMaXN0KCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbGxlY3Rpb25NZXNzYWdlQm9keVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPENvbGxlY3Rpb248Pz4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoQXJyYXlMaXN0LmNsYXNzKSAmJiBnZW5lcmljVHlwZS5lcXVhbHMoQXJyYXlMaXN0LmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIENvbGxlY3Rpb248Pz4gb2JqZWN0cywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIENvbGxlY3Rpb248Pz4gb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCJPSyIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluY29ycmVjdENvbGxlY3Rpb25NZXNzYWdlQm9keVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPENvbGxlY3Rpb248Pz4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gIW5ldyBDb2xsZWN0aW9uTWVzc2FnZUJvZHlXcml0ZXIoKS5pc1dyaXRlYWJsZSh0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBDb2xsZWN0aW9uPD8+IG9iamVjdHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBDb2xsZWN0aW9uPD8+IG9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgiRVJST1IiLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNwb25zZSIpLnBhdGgoImxpc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIk9LIikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nQmVhbiB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIFN0cmluZ0JlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nQmVhbihmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nQmVhbk1lc3NhZ2VCb2R5V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nQmVhbj4geworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFUeXBlIFNUUklOR19CRUFOX01UID0gbmV3IE1lZGlhVHlwZSgic3RyaW5nIiwgImJlYW4iKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoU3RyaW5nQmVhbi5jbGFzcykgJiYgU1RSSU5HX0JFQU5fTVQuZXF1YWxzKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBTdHJpbmdCZWFuIG9iamVjdHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBTdHJpbmdCZWFuIG9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShvYmplY3RzLmdldFZhbHVlKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiQWNjZXB0YWJsZU5vbldyaXRlYWJsZU1ldGhvZFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFjY2VwdGFibGVOb25Xcml0ZWFibGVNZXRob2RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nQmVhbiBnZXRTdHJpbmdCZWFuKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCZWFuKCJnZXRTdHJpbmdCZWFuIik7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZ0JlYW4gZ2V0VGV4dEh0bWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0JlYW4oImdldFRleHRIdG1sIik7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC94aHRtbCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmdCZWFuIGdldFRleHRYSHRtbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmVhbigiZ2V0VGV4dFhIdG1sIik7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInN0cmluZy9iZWFuIikKKyAgICAgICAgQFByb2R1Y2VzKCJzdHJpbmcvYmVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmdCZWFuIHBvc3RTdHJpbmdCZWFuKGZpbmFsIFN0cmluZ0JlYW4gc3RyaW5nQmVhbikgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZ0JlYW47CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoInN0cmluZy9iZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZ0JlYW4gcG9zdFN0cmluZ0JlYW4oZmluYWwgU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCZWFuKCJwb3N0U3RyaW5nQmVhbl8iICsgc3RyaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygic3RyaW5nL2JlYW4iKQorICAgICAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdFJlc3BvbnNlKGZpbmFsIFN0cmluZ0JlYW4gc3RyaW5nQmVhbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHN0cmluZ0JlYW4pLnR5cGUoInN0cmluZy9iZWFuIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJyZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0UmVzcG9uc2UoZmluYWwgU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG5ldyBTdHJpbmdCZWFuKCJwb3N0U3RyaW5nQmVhbl8iICsgc3RyaW5nKSkudHlwZSgic3RyaW5nL2JlYW4iKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0aG9kUm91dGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiQWNjZXB0YWJsZU5vbldyaXRlYWJsZU1ldGhvZFJlc291cmNlIikucmVxdWVzdCgidGV4dC9odG1sIiwgInRleHQveGh0bWwiLAorICAgICAgICAgICAgICAgICJzdHJpbmcvYmVhbjtxPTAuMiIpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIGVxdWFsVG8oU3RyaW5nQmVhbk1lc3NhZ2VCb2R5V3JpdGVyLlNUUklOR19CRUFOX01UKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJnZXRTdHJpbmdCZWFuIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RNZXRob2RSb3V0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJBY2NlcHRhYmxlTm9uV3JpdGVhYmxlTWV0aG9kUmVzb3VyY2UiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiLCAidGV4dC94aHRtbCIsCisgICAgICAgICAgICAgICAgInN0cmluZy9iZWFuO3E9MC4yIikucG9zdChFbnRpdHkuZW50aXR5KCJ2YWx1ZSIsICJzdHJpbmcvYmVhbiIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLCBlcXVhbFRvKFN0cmluZ0JlYW5NZXNzYWdlQm9keVdyaXRlci5TVFJJTkdfQkVBTl9NVCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygicG9zdFN0cmluZ0JlYW5fdmFsdWUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdE1ldGhvZFJvdXRpbmdXaWxkY2FyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiQWNjZXB0YWJsZU5vbldyaXRlYWJsZU1ldGhvZFJlc291cmNlIikucmVxdWVzdCgiKi8qIikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJ2YWx1ZSIsICJzdHJpbmcvYmVhbiIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLCBlcXVhbFRvKFN0cmluZ0JlYW5NZXNzYWdlQm9keVdyaXRlci5TVFJJTkdfQkVBTl9NVCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygicG9zdFN0cmluZ0JlYW5fdmFsdWUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdE1ldGhvZFJvdXRpbmdSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiQWNjZXB0YWJsZU5vbldyaXRlYWJsZU1ldGhvZFJlc291cmNlIikucGF0aCgicmVzcG9uc2UiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJ2YWx1ZSIsICJzdHJpbmcvYmVhbiIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLCBlcXVhbFRvKFN0cmluZ0JlYW5NZXNzYWdlQm9keVdyaXRlci5TVFJJTkdfQkVBTl9NVCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygicG9zdFN0cmluZ0JlYW5fdmFsdWUiKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNwb25zZVJlc291cmNlLmNsYXNzLCBBY2NlcHRhYmxlTm9uV3JpdGVhYmxlTWV0aG9kUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKENvbGxlY3Rpb25NZXNzYWdlQm9keVdyaXRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSW5jb3JyZWN0Q29sbGVjdGlvbk1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihTdHJpbmdCZWFuTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL0N1c3RvbUZlYXR1cmUuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL0N1c3RvbUZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTM3MjY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvQ3VzdG9tRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmcuZXh0LkV4dDFXcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nLmV4dC5FeHQyV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZy5leHQuRXh0M1dyaXRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmcuZXh0LkV4dDRXcml0ZXJJbnRlcmNlcHRvcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgQ3VzdG9tRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQzV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsIDEwMDApOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDJXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgMTAwKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQxV3JpdGVySW50ZXJjZXB0b3IuSU5TVEFOQ0UsIDUwMCk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRXh0NFdyaXRlckludGVyY2VwdG9yLklOU1RBTkNFLCAxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvUmFua2VkUHJvdmlkZXJTY2FubmluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL1JhbmtlZFByb3ZpZGVyU2Nhbm5pbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ZGVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL1JhbmtlZFByb3ZpZGVyU2Nhbm5pbmdUZXN0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5rZWRQcm92aWRlclNjYW5uaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpLnBhY2thZ2VzKGZhbHNlLCBSYW5rZWRQcm92aWRlclNjYW5uaW5nVGVzdC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5rZWRQcm92aWRlclNjYW5uaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCk7CisgICAgICAgIHQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnBhdGgoIi8iKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0LWV4dDQtZXh0Mi1leHQxLWV4dDMiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTZlYzIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZy5leHQuRXh0MVdyaXRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmcuZXh0LkV4dDJXcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nLmV4dC5FeHQzV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZy5leHQuRXh0NFdyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisqIEBhdXRob3IgTWljaGFsIEdhamRvcworKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnOworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBSZXNvdXJjZShmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENsYXNzZXMoKS5zaXplKCkgPj0gNCk7IC8vIGUuZy4gV0FETCByZXNvdXJjZSBjYW4gYmUgdGhlcmUgdG9vLgorICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQ3VzdG9tRmVhdHVyZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoRXh0MldyaXRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChFeHQzV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENsYXNzZXMoKS5jb250YWlucyhDdXN0b21GZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENsYXNzZXMoKS5jb250YWlucyhFeHQyV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q2xhc3NlcygpLmNvbnRhaW5zKEV4dDNXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDbGFzc2VzKCkuY29udGFpbnMoUmVzb3VyY2UuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5zaXplKCkgPj0gMik7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldEluc3RhbmNlcygpLmNvbnRhaW5zKEV4dDFXcml0ZXJJbnRlcmNlcHRvci5JTlNUQU5DRSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5jb250YWlucyhFeHQ0V3JpdGVySW50ZXJjZXB0b3IuSU5TVEFOQ0UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEV4dDFXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoRXh0NFdyaXRlckludGVyY2VwdG9yLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNFbmFibGVkKEN1c3RvbUZlYXR1cmUuY2xhc3MpKTsKKworICAgICAgICByZXR1cm4gImdldCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvZXh0L0V4dDFXcml0ZXJJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvZXh0L0V4dDFXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWIyZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0MVdyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDFXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRXh0MVdyaXRlckludGVyY2VwdG9yIElOU1RBTkNFID0gbmV3IEV4dDFXcml0ZXJJbnRlcmNlcHRvcigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWV4dDEiKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvZXh0L0V4dDJXcml0ZXJJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvZXh0L0V4dDJXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTNhMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDJXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQyIik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL2V4dC9FeHQzV3JpdGVySW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL2V4dC9FeHQzV3JpdGVySW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDFlNDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvZXh0L0V4dDNXcml0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZy5leHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBFeHQzV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0MyIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0NFdyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0NFdyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhY2E2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL2V4dC9FeHQ0V3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmcuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0NFdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHQ0V3JpdGVySW50ZXJjZXB0b3IgSU5TVEFOQ0UgPSBuZXcgRXh0NFdyaXRlckludGVyY2VwdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0NCIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0Jhc2ljQmFkU3ViUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNCYWRTdWJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYTliODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0Jhc2ljQmFkU3ViUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTnVsbDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJhc2ljQmFkU3ViUmVzb3VyY2UgeworCisgICAgQENvbnRleHQKKyAgICBATnVsbAorICAgIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNob3VsZCBub3QgZ2V0IGhlcmUuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9CYXNpY1Jlc291cmNlLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0Jhc2ljUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGM1OTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9CYXNpY1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuQ29va2llUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5OdWxsOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoImJlYW52YWxpZGF0aW9uIikKK3B1YmxpYyBjbGFzcyBCYXNpY1Jlc291cmNlIHsKKworICAgIEBOb3ROdWxsCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRJbnB1dFBhcmFtc1Jlc3BvbnNlKGZpbmFsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZvcm0pIHsKKworICAgICAgICByZXR1cm4gcGF0aCArICdfJyArIG1hdHJpeCArICdfJyArIHF1ZXJ5ICsgJ18nICsgaGVhZGVyICsgJ18nICsgY29va2llICsgJ18nICsgZm9ybTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJiYXNpY1BhcmFtL3twYXRoOiAuKn0iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkUGFyYW1ldGVycyIpCisgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZVBhcmFtZXRlcnNCYXNpY0NvbnN0cmFpbnQoCisgICAgICAgICAgICBATm90TnVsbCBAUGF0aFBhcmFtKCJwYXRoIikgZmluYWwgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICBATm90TnVsbCBATWF0cml4UGFyYW0oIm1hdHJpeCIpIGZpbmFsIFN0cmluZyBtYXRyaXgsCisgICAgICAgICAgICBATm90TnVsbCBAUXVlcnlQYXJhbSgicXVlcnkiKSBmaW5hbCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBATm90TnVsbCBASGVhZGVyUGFyYW0oImhlYWRlciIpIGZpbmFsIFN0cmluZyBoZWFkZXIsCisgICAgICAgICAgICBATm90TnVsbCBAQ29va2llUGFyYW0oImNvb2tpZSIpIGZpbmFsIFN0cmluZyBjb29raWUsCisgICAgICAgICAgICBATm90TnVsbCBARm9ybVBhcmFtKCJmb3JtIikgZmluYWwgU3RyaW5nIGZvcm0sCisgICAgICAgICAgICBATm90TnVsbCBAQ29udGV4dCBmaW5hbCBSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICByZXR1cm4gZ2V0SW5wdXRQYXJhbXNSZXNwb25zZShwYXRoLCBtYXRyaXgsIHF1ZXJ5LCBoZWFkZXIsIGNvb2tpZSwgZm9ybSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgiYmFzaWNEZWZhdWx0UGFyYW0ve3BhdGg6IC4qfSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWRQYXJhbWV0ZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlUGFyYW1ldGVyc0RlZmF1bHRCYXNpY0NvbnN0cmFpbnQoCisgICAgICAgICAgICBATm90TnVsbCBARGVmYXVsdFZhbHVlKCJwYXRoUGFyYW0iKSBAUGF0aFBhcmFtKCJwYXRoIikgZmluYWwgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICBATm90TnVsbCBARGVmYXVsdFZhbHVlKCJtYXRyaXhQYXJhbSIpIEBNYXRyaXhQYXJhbSgibWF0cml4IikgZmluYWwgU3RyaW5nIG1hdHJpeCwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBEZWZhdWx0VmFsdWUoInF1ZXJ5UGFyYW0iKSBAUXVlcnlQYXJhbSgicXVlcnkiKSBmaW5hbCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBATm90TnVsbCBARGVmYXVsdFZhbHVlKCJoZWFkZXJQYXJhbSIpIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgZmluYWwgU3RyaW5nIGhlYWRlciwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBEZWZhdWx0VmFsdWUoImNvb2tpZVBhcmFtIikgQENvb2tpZVBhcmFtKCJjb29raWUiKSBmaW5hbCBTdHJpbmcgY29va2llLAorICAgICAgICAgICAgQE5vdE51bGwgQERlZmF1bHRWYWx1ZSgiZm9ybVBhcmFtIikgQEZvcm1QYXJhbSgiZm9ybSIpIGZpbmFsIFN0cmluZyBmb3JtLAorICAgICAgICAgICAgQE5vdE51bGwgQENvbnRleHQgZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgcmV0dXJuIGdldElucHV0UGFyYW1zUmVzcG9uc2UocGF0aCwgbWF0cml4LCBxdWVyeSwgaGVhZGVyLCBjb29raWUsIGZvcm0pOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoImN1c3RvbVBhcmFtL3twYXRoOiAuKn0iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlUGFyYW1ldGVyc0N1c3RvbUNvbnN0cmFpbnQoCisgICAgICAgICAgICBAUGFyYW1Db25zdHJhaW50IEBQYXRoUGFyYW0oInBhdGgiKSBmaW5hbCBTdHJpbmcgcGF0aCwKKyAgICAgICAgICAgIEBQYXJhbUNvbnN0cmFpbnQgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKSBmaW5hbCBTdHJpbmcgbWF0cml4LAorICAgICAgICAgICAgQFBhcmFtQ29uc3RyYWludCBAUXVlcnlQYXJhbSgicXVlcnkiKSBmaW5hbCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBAUGFyYW1Db25zdHJhaW50IEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgZmluYWwgU3RyaW5nIGhlYWRlciwKKyAgICAgICAgICAgIEBQYXJhbUNvbnN0cmFpbnQgQENvb2tpZVBhcmFtKCJjb29raWUiKSBmaW5hbCBTdHJpbmcgY29va2llLAorICAgICAgICAgICAgQFBhcmFtQ29uc3RyYWludCBARm9ybVBhcmFtKCJmb3JtIikgZmluYWwgU3RyaW5nIGZvcm0pIHsKKworICAgICAgICByZXR1cm4gZ2V0SW5wdXRQYXJhbXNSZXNwb25zZShwYXRoLCBtYXRyaXgsIHF1ZXJ5LCBoZWFkZXIsIGNvb2tpZSwgZm9ybSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgibWl4ZWRQYXJhbS97cGF0aDogLip9IikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZVBhcmFtZXRlcnNNaXhlZENvbnN0cmFpbnQoCisgICAgICAgICAgICBAU2l6ZShtYXggPSAxMSkgQFBhcmFtQ29uc3RyYWludCBAUGF0aFBhcmFtKCJwYXRoIikgZmluYWwgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICBAU2l6ZShtYXggPSAxMSkgQFBhcmFtQ29uc3RyYWludCBATWF0cml4UGFyYW0oIm1hdHJpeCIpIGZpbmFsIFN0cmluZyBtYXRyaXgsCisgICAgICAgICAgICBAU2l6ZShtYXggPSAxMSkgQFBhcmFtQ29uc3RyYWludCBAUXVlcnlQYXJhbSgicXVlcnkiKSBmaW5hbCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBAU2l6ZShtYXggPSAxMSkgQFBhcmFtQ29uc3RyYWludCBASGVhZGVyUGFyYW0oImhlYWRlciIpIGZpbmFsIFN0cmluZyBoZWFkZXIsCisgICAgICAgICAgICBAU2l6ZShtYXggPSAxMSkgQFBhcmFtQ29uc3RyYWludCBAQ29va2llUGFyYW0oImNvb2tpZSIpIGZpbmFsIFN0cmluZyBjb29raWUsCisgICAgICAgICAgICBAU2l6ZShtYXggPSAxMSkgQFBhcmFtQ29uc3RyYWludCBARm9ybVBhcmFtKCJmb3JtIikgZmluYWwgU3RyaW5nIGZvcm0pIHsKKworICAgICAgICByZXR1cm4gZ2V0SW5wdXRQYXJhbXNSZXNwb25zZShwYXRoLCBtYXRyaXgsIHF1ZXJ5LCBoZWFkZXIsIGNvb2tpZSwgZm9ybSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgibXVsdGlwbGVQYXJhbS97cGF0aDogLip9IikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZVBhcmFtZXRlcnNNdWx0aXBsZUNvbnN0cmFpbnQoCisgICAgICAgICAgICBATXVsdGlwbGVQYXJhbUNvbnN0cmFpbnQgQFBhdGhQYXJhbSgicGF0aCIpIGZpbmFsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgQE11bHRpcGxlUGFyYW1Db25zdHJhaW50IEBNYXRyaXhQYXJhbSgibWF0cml4IikgZmluYWwgU3RyaW5nIG1hdHJpeCwKKyAgICAgICAgICAgIEBNdWx0aXBsZVBhcmFtQ29uc3RyYWludCBAUXVlcnlQYXJhbSgicXVlcnkiKSBmaW5hbCBTdHJpbmcgcXVlcnksCisgICAgICAgICAgICBATXVsdGlwbGVQYXJhbUNvbnN0cmFpbnQgQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBmaW5hbCBTdHJpbmcgaGVhZGVyLAorICAgICAgICAgICAgQE11bHRpcGxlUGFyYW1Db25zdHJhaW50IEBDb29raWVQYXJhbSgiY29va2llIikgZmluYWwgU3RyaW5nIGNvb2tpZSwKKyAgICAgICAgICAgIEBNdWx0aXBsZVBhcmFtQ29uc3RyYWludCBARm9ybVBhcmFtKCJmb3JtIikgZmluYWwgU3RyaW5nIGZvcm0pIHsKKworICAgICAgICByZXR1cm4gZ2V0SW5wdXRQYXJhbXNSZXNwb25zZShwYXRoLCBtYXRyaXgsIHF1ZXJ5LCBoZWFkZXIsIGNvb2tpZSwgZm9ybSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgiZW1wdHlCZWFuUGFyYW0iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIHB1YmxpYyBDb250YWN0QmVhbiB2YWxpZGF0ZUVtcHR5QmVhblBhcmFtQ29uc3RyYWludChATm90TnVsbCBmaW5hbCBDb250YWN0QmVhbiBiZWFuKSB7CisgICAgICAgIHJldHVybiBiZWFuOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoInZhbGlkQmVhblBhcmFtIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikKKyAgICBwdWJsaWMgQ29udGFjdEJlYW4gdmFsaWRhdGVWYWxpZEJlYW5QYXJhbUNvbnN0cmFpbnQoQE5vdE51bGwgQFZhbGlkIGZpbmFsIENvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgiY3VzdG9tQmVhblBhcmFtIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikKKyAgICBwdWJsaWMgQ29udGFjdEJlYW4gdmFsaWRhdGVDdXN0b21CZWFuUGFyYW1Db25zdHJhaW50KEBPbmVDb250YWN0IGZpbmFsIENvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgiZW1wdHlCZWFuUmVzcG9uc2UiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBOb3ROdWxsCisgICAgcHVibGljIENvbnRhY3RCZWFuIHZhbGlkYXRlRW1wdHlCZWFuUmVzcG9uc2VDb25zdHJhaW50KGZpbmFsIENvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgidmFsaWRCZWFuUmVzcG9uc2UiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBOb3ROdWxsCisgICAgQFZhbGlkCisgICAgcHVibGljIENvbnRhY3RCZWFuIHZhbGlkYXRlVmFsaWRCZWFuUmVzcG9uc2VDb25zdHJhaW50KGZpbmFsIENvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgidmFsaWRCZWFuV3JhcHBlZEluUmVzcG9uc2UiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBOb3ROdWxsCisgICAgQFZhbGlkCisgICAgcHVibGljIFJlc3BvbnNlIHZhbGlkYXRlVmFsaWRCZWFuV3JhcHBlZEluUmVzcG9uc2VDb25zdHJhaW50KGZpbmFsIENvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGJlYW4pLnR5cGUoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJjdXN0b21CZWFuUmVzcG9uc2UiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBPbmVDb250YWN0CisgICAgcHVibGljIENvbnRhY3RCZWFuIHZhbGlkYXRlQ3VzdG9tQmVhblJlc3BvbnNlQ29uc3RyYWludChmaW5hbCBDb250YWN0QmVhbiBiZWFuKSB7CisgICAgICAgIHJldHVybiBiZWFuOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaW52YWxpZENvbnRleHQiKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWRQYXJhbWV0ZXJzIikKKyAgICBwdWJsaWMgUmVzcG9uc2UgaW52YWxpZENvbnRleHQoQE51bGwgQENvbnRleHQgZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTAwKS5idWlsZCgpOworICAgIH0KKworICAgIEBQYXRoKCJzdWIvdmFsaWRSZXNvdXJjZUNvbnRleHRJbnN0YW5jZSIpCisgICAgcHVibGljIEJhc2ljU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2VWYWxpZFJlc291cmNlQ29udGV4dEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0LmluaXRSZXNvdXJjZShuZXcgQmFzaWNTdWJSZXNvdXJjZShyZXNvdXJjZUNvbnRleHQpKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViL251bGxSZXNvdXJjZUNvbnRleHRJbnN0YW5jZSIpCisgICAgcHVibGljIEJhc2ljU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2VOdWxsUmVzb3VyY2VDb250ZXh0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbnRleHQuaW5pdFJlc291cmNlKG5ldyBCYXNpY1N1YlJlc291cmNlKG51bGwpKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViL251bGxSZXNvdXJjZUNvbnRleHRDbGFzcyIpCisgICAgcHVibGljIEJhc2ljU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2VOdWxsUmVzb3VyY2VDb250ZXh0Q2xhc3MoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbnRleHQuZ2V0UmVzb3VyY2UoQmFzaWNTdWJSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi93cm9uZyIpCisgICAgcHVibGljIEJhc2ljQmFkU3ViUmVzb3VyY2UgZ2V0V3JvbmdTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZShCYXNpY0JhZFN1YlJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0Jhc2ljU3ViUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNTdWJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzBlMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0Jhc2ljU3ViUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLkV4ZWN1dGFibGVUeXBlOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5WYWxpZGF0ZU9uRXhlY3V0aW9uOworCitpbXBvcnQgb3JnLmhpYmVybmF0ZS52YWxpZGF0b3IuY29uc3RyYWludHMuRW1haWw7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BOb25FbXB0eU5hbWVzCitAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorcHVibGljIGNsYXNzIEJhc2ljU3ViUmVzb3VyY2UgeworCisgICAgQE5vdE51bGwKKyAgICBARm9ybVBhcmFtKCJmaXJzdE5hbWUiKQorICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKKworICAgIEBOb3ROdWxsCisgICAgQEZvcm1QYXJhbSgibGFzdE5hbWUiKQorICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7CisKKyAgICAvKioKKyAgICAgKiBOb3RlOiBDb25zdHJ1Y3RvciBpbnB1dCBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZFBhcmFtZXRlcnMiKQorICAgIHB1YmxpYyBCYXNpY1N1YlJlc291cmNlKEBOb3ROdWxsIEBDb250ZXh0IGZpbmFsIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQpIHsKKyAgICB9CisKKyAgICBARm9ybVBhcmFtKCJlbWFpbCIpCisgICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKSB7CisgICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsKKyAgICB9CisKKyAgICBATm90TnVsbAorICAgIEBFbWFpbChyZWdleHAgPSAiW2EtekEtWjAtOS5fJS1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsNH0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKSB7CisgICAgICAgIHJldHVybiBlbWFpbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkgeworICAgICAgICByZXR1cm4gbGFzdE5hbWU7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQFZhbGlkCisgICAgcHVibGljIENvbnRhY3RCZWFuIHBvc3RDb250YWN0VmFsaWRhdGlvbkJlYW4oKSB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldE5hbWUoZmlyc3ROYW1lICsgIiAiICsgbGFzdE5hbWUpOworICAgICAgICBjb250YWN0QmVhbi5zZXRFbWFpbChnZXRFbWFpbCgpKTsKKyAgICAgICAgcmV0dXJuIGNvbnRhY3RCZWFuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9CYXNpY1ZhbGlkYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0ZDQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuQ29va2llUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLk1hdHJpeFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkueG1sLk1veHlYbWxGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQmFzaWNWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhCYXNpY1Jlc291cmNlLmNsYXNzKTsKKworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihDb250YWN0QmVhblByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoTW94eVhtbEZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuQlZfU0VORF9FUlJPUl9JTl9SRVNQT05TRSwgdHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZUNsaWVudChjb25maWcpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29udGFjdEJlYW5Qcm92aWRlci5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNb3h5WG1sRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250YWN0QmVhblByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8Q29udGFjdEJlYW4+LCBNZXNzYWdlQm9keVdyaXRlcjxDb250YWN0QmVhbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUuZXF1YWxzKENvbnRhY3RCZWFuLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29udGFjdEJlYW4gcmVhZEZyb20oQ2xhc3M8Q29udGFjdEJlYW4+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdElucHV0U3RyZWFtIG9iamVjdElucHV0U3RyZWFtID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChDb250YWN0QmVhbikgb2JqZWN0SW5wdXRTdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoQ29udGFjdEJlYW4uY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoQ29udGFjdEJlYW4gY29udGFjdEJlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhDb250YWN0QmVhbiBjb250YWN0QmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGVudGl0eVN0cmVhbSkud3JpdGVPYmplY3QoY29udGFjdEJlYW4pOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGFyYW1CZWFuIHsKKworICAgICAgICBASGVhZGVyUGFyYW0oImhlYWRlciIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlclBhcmFtOworCisgICAgICAgIEBQYXRoUGFyYW0oInBhdGgiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoUGFyYW07CisKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBtYXRyaXhQYXJhbTsKKworICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBxdWVyeVBhcmFtOworCisgICAgICAgIEBDb29raWVQYXJhbSgiY29va2llIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29va2llOworCisgICAgICAgIEBGb3JtUGFyYW0oImZvcm0iKQorICAgICAgICBwcml2YXRlIFN0cmluZyBmb3JtUGFyYW07CisKKyAgICAgICAgcHVibGljIFBhcmFtQmVhbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29va2llKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvb2tpZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZShTdHJpbmcgY29va2llKSB7CisgICAgICAgICAgICB0aGlzLmNvb2tpZSA9IGNvb2tpZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIGZvcm1QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvcm1QYXJhbShTdHJpbmcgZm9ybVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLmZvcm1QYXJhbSA9IGZvcm1QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJQYXJhbShTdHJpbmcgaGVhZGVyUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyUGFyYW0gPSBoZWFkZXJQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF0cml4UGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0cml4UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNYXRyaXhQYXJhbShTdHJpbmcgbWF0cml4UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMubWF0cml4UGFyYW0gPSBtYXRyaXhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGhQYXJhbShTdHJpbmcgcGF0aFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLnBhdGhQYXJhbSA9IHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UXVlcnlQYXJhbShTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJCZWFueyIKKyAgICAgICAgICAgICAgICAgICAgKyAiY29va2llPSciICsgY29va2llICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIGZvcm1QYXJhbT0nIiArIGZvcm1QYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBoZWFkZXJQYXJhbT0nIiArIGhlYWRlclBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIG1hdHJpeFBhcmFtPSciICsgbWF0cml4UGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgcGF0aFBhcmFtPSciICsgcGF0aFBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIHF1ZXJ5UGFyYW09JyIgKyBxdWVyeVBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUGFyYW1CZWFuIGdldERlZmF1bHRQYXJhbUJlYW4oKSB7CisgICAgICAgIGZpbmFsIFBhcmFtQmVhbiBwYXJhbUJlYW4gPSBuZXcgUGFyYW1CZWFuKCk7CisgICAgICAgIHBhcmFtQmVhbi5zZXRDb29raWUoImNvb2tpZVBhcmFtIik7CisgICAgICAgIHBhcmFtQmVhbi5zZXRGb3JtUGFyYW0oImZvcm1QYXJhbSIpOworICAgICAgICBwYXJhbUJlYW4uc2V0SGVhZGVyUGFyYW0oImhlYWRlclBhcmFtIik7CisgICAgICAgIHBhcmFtQmVhbi5zZXRNYXRyaXhQYXJhbSgibWF0cml4UGFyYW0iKTsKKyAgICAgICAgcGFyYW1CZWFuLnNldFBhdGhQYXJhbSgicGF0aFBhcmFtIik7CisgICAgICAgIHBhcmFtQmVhbi5zZXRRdWVyeVBhcmFtKCJxdWVyeVBhcmFtIik7CisgICAgICAgIHJldHVybiBwYXJhbUJlYW47CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZSB0ZXN0SW5wdXRQYXJhbXMoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFBhcmFtQmVhbiBwYXJhbUJlYW4pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLmFzTWFwKCkucHV0KCJmb3JtIiwgQXJyYXlzLmFzTGlzdChwYXJhbUJlYW4uZ2V0Rm9ybVBhcmFtKCkpKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJiZWFudmFsaWRhdGlvbiIpLnBhdGgocGF0aCk7CisKKyAgICAgICAgaWYgKHBhcmFtQmVhbi5nZXRQYXRoUGFyYW0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGF0aChwYXJhbUJlYW4uZ2V0UGF0aFBhcmFtKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhdGgoIi8iKTsKKyAgICAgICAgfQorCisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0CisgICAgICAgICAgICAgICAgLm1hdHJpeFBhcmFtKCJtYXRyaXgiLCBwYXJhbUJlYW4uZ2V0TWF0cml4UGFyYW0oKSkKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicXVlcnkiLCBwYXJhbUJlYW4uZ2V0UXVlcnlQYXJhbSgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCk7CisKKyAgICAgICAgaWYgKHBhcmFtQmVhbi5nZXRIZWFkZXJQYXJhbSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LmhlYWRlcigiaGVhZGVyIiwgcGFyYW1CZWFuLmdldEhlYWRlclBhcmFtKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmFtQmVhbi5nZXRDb29raWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0ID0gcmVxdWVzdC5jb29raWUoImNvb2tpZSIsIHBhcmFtQmVhbi5nZXRDb29raWUoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdC5wb3N0KEVudGl0eS5lbnRpdHkoZm9ybSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNCYXNpY0NvbnN0cmFpbnRzUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SW5wdXRQYXJhbXMoImJhc2ljUGFyYW0iLCBnZXREZWZhdWx0UGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRoUGFyYW1fbWF0cml4UGFyYW1fcXVlcnlQYXJhbV9oZWFkZXJQYXJhbV9jb29raWVQYXJhbV9mb3JtUGFyYW0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0UGFyYW1zQmFzaWNDb25zdHJhaW50c05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdElucHV0UGFyYW1zKCJiYXNpY1BhcmFtIiwgbmV3IFBhcmFtQmVhbigpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMSIpKTsgLy8gQE1hdHJpeFBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMiIpKTsgLy8gQFF1ZXJ5UGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmczIikpOyAvLyBASGVhZGVyUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc0IikpOyAvLyBAQ29va2llUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc1IikpOyAvLyBARm9ybVBhcmFtCisKKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsgLy8gQFBhdGhQYXJhbQorICAgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc2IikpOyAvLyBAQ29udGV4dAorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0UGFyYW1zRGVmYXVsdEJhc2ljQ29uc3RyYWludHNQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RJbnB1dFBhcmFtcygiYmFzaWNEZWZhdWx0UGFyYW0iLCBuZXcgUGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJfbWF0cml4UGFyYW1fcXVlcnlQYXJhbV9oZWFkZXJQYXJhbV9jb29raWVQYXJhbV9mb3JtUGFyYW0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0UGFyYW1zQ3VzdG9tQ29uc3RyYWludHNQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RJbnB1dFBhcmFtcygiY3VzdG9tUGFyYW0iLCBnZXREZWZhdWx0UGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRoUGFyYW1fbWF0cml4UGFyYW1fcXVlcnlQYXJhbV9oZWFkZXJQYXJhbV9jb29raWVQYXJhbV9mb3JtUGFyYW0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0UGFyYW1zQ3VzdG9tQ29uc3RyYWludHNOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RJbnB1dFBhcmFtcygiY3VzdG9tUGFyYW0iLCBuZXcgUGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcwIikpOyAvLyBAUGF0aFBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMSIpKTsgLy8gQE1hdHJpeFBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMiIpKTsgLy8gQFF1ZXJ5UGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmczIikpOyAvLyBASGVhZGVyUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc0IikpOyAvLyBAQ29va2llUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc1IikpOyAvLyBARm9ybVBhcmFtCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNNaXhlZENvbnN0cmFpbnRzUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SW5wdXRQYXJhbXMoIm1peGVkUGFyYW0iLCBnZXREZWZhdWx0UGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRoUGFyYW1fbWF0cml4UGFyYW1fcXVlcnlQYXJhbV9oZWFkZXJQYXJhbV9jb29raWVQYXJhbV9mb3JtUGFyYW0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0UGFyYW1zTWl4ZWRDb25zdHJhaW50c05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdElucHV0UGFyYW1zKCJtaXhlZFBhcmFtIiwgbmV3IFBhcmFtQmVhbigpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsgLy8gQFBhdGhQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzEiKSk7IC8vIEBNYXRyaXhQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzIiKSk7IC8vIEBRdWVyeVBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMyIpKTsgLy8gQEhlYWRlclBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnNCIpKTsgLy8gQENvb2tpZVBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnNSIpKTsgLy8gQEZvcm1QYXJhbQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0UGFyYW1zTWl4ZWRDb25zdHJhaW50c05lZ2F0aXZlVG9vTG9uZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXJhbUJlYW4gZGVmYXVsdFBhcmFtQmVhbiA9IGdldERlZmF1bHRQYXJhbUJlYW4oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1QYXJhbSA9IGRlZmF1bHRQYXJhbUJlYW4uZ2V0Rm9ybVBhcmFtKCk7CisgICAgICAgIGRlZmF1bHRQYXJhbUJlYW4uc2V0Rm9ybVBhcmFtKGZvcm1QYXJhbSArIGZvcm1QYXJhbSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SW5wdXRQYXJhbXMoIm1peGVkUGFyYW0iLCBkZWZhdWx0UGFyYW1CZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzAiKSk7IC8vIEBQYXRoUGFyYW0KKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMSIpKTsgLy8gQE1hdHJpeFBhcmFtCisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzIiKSk7IC8vIEBRdWVyeVBhcmFtCisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzMiKSk7IC8vIEBIZWFkZXJQYXJhbQorICAgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc0IikpOyAvLyBAQ29va2llUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc1IikpOyAvLyBARm9ybVBhcmFtCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNNdWx0aXBsZUNvbnN0cmFpbnRzUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SW5wdXRQYXJhbXMoIm11bHRpcGxlUGFyYW0iLCBnZXREZWZhdWx0UGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRoUGFyYW1fbWF0cml4UGFyYW1fcXVlcnlQYXJhbV9oZWFkZXJQYXJhbV9jb29raWVQYXJhbV9mb3JtUGFyYW0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0UGFyYW1zTXVsdGlwbGVDb25zdHJhaW50c05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdElucHV0UGFyYW1zKCJtdWx0aXBsZVBhcmFtIiwgbmV3IFBhcmFtQmVhbigpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsgLy8gQFBhdGhQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzEiKSk7IC8vIEBNYXRyaXhQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzIiKSk7IC8vIEBRdWVyeVBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMyIpKTsgLy8gQEhlYWRlclBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnNCIpKTsgLy8gQENvb2tpZVBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnNSIpKTsgLy8gQEZvcm1QYXJhbQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0UGFyYW1zTXVsdGlwbGVDb25zdHJhaW50c05lZ2F0aXZlVG9vTG9uZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXJhbUJlYW4gZGVmYXVsdFBhcmFtQmVhbiA9IGdldERlZmF1bHRQYXJhbUJlYW4oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1QYXJhbSA9IGRlZmF1bHRQYXJhbUJlYW4uZ2V0Rm9ybVBhcmFtKCk7CisgICAgICAgIGRlZmF1bHRQYXJhbUJlYW4uc2V0Rm9ybVBhcmFtKGZvcm1QYXJhbSArIGZvcm1QYXJhbSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SW5wdXRQYXJhbXMoIm1peGVkUGFyYW0iLCBkZWZhdWx0UGFyYW1CZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzAiKSk7IC8vIEBQYXRoUGFyYW0KKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMSIpKTsgLy8gQE1hdHJpeFBhcmFtCisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzIiKSk7IC8vIEBRdWVyeVBhcmFtCisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzMiKSk7IC8vIEBIZWFkZXJQYXJhbQorICAgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc0IikpOyAvLyBAQ29va2llUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc1IikpOyAvLyBARm9ybVBhcmFtCisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZSB0ZXN0QmVhbihmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4pIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldCgiYmVhbnZhbGlkYXRpb24iKQorICAgICAgICAgICAgICAgIC5wYXRoKHBhdGgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikucG9zdChFbnRpdHkuZW50aXR5KGNvbnRhY3RCZWFuLCAiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCZWFuUGFyYW1Qb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBDb250YWN0QmVhbigpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJlbXB0eUJlYW5QYXJhbSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGFjdEJlYW4sIHJlc3BvbnNlLnJlYWRFbnRpdHkoQ29udGFjdEJlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUJlYW5QYXJhbU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oImVtcHR5QmVhblBhcmFtIiwgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzAiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRCZWFuUGFyYW1Qb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBDb250YWN0QmVhbigpOworICAgICAgICBjb250YWN0QmVhbi5zZXROYW1lKCJKZXJzZXkiKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0RW1haWwoImplcnNleUBleGFtcGxlLmNvbSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJ2YWxpZEJlYW5QYXJhbSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGFjdEJlYW4sIHJlc3BvbnNlLnJlYWRFbnRpdHkoQ29udGFjdEJlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEJlYW5QYXJhbU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIC8vIEFkZCB2YWx1ZSB0byBwYXNzIEBPbmVDb250YWN0IGNvbnN0cmFpbnQgYnV0IGZhaWxzIG9uIEBQYXR0ZXJuIGNvbnN0cmFpbnQgZGVmaW5lZCBvbiBnZXR0ZXIuCisgICAgICAgIGNvbnRhY3RCZWFuLnNldFBob25lKCIxMiIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJ2YWxpZEJlYW5QYXJhbSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21CZWFuUGFyYW1Qb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBDb250YWN0QmVhbigpOworICAgICAgICBjb250YWN0QmVhbi5zZXRFbWFpbCgiamVyc2V5QGV4YW1wbGUuY29tIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigiY3VzdG9tQmVhblBhcmFtIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyhjb250YWN0QmVhbiwgcmVzcG9uc2UucmVhZEVudGl0eShDb250YWN0QmVhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJlYW5QYXJhbU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldEVtYWlsKCJqZXJzZXlAZXhhbXBsZS5jb20iKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0UGhvbmUoIjEzNDUzOSIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oImN1c3RvbUJlYW5QYXJhbSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUJlYW5SZXNwb25zZVBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oImVtcHR5QmVhblJlc3BvbnNlIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyhjb250YWN0QmVhbiwgcmVzcG9uc2UucmVhZEVudGl0eShDb250YWN0QmVhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QmVhblJlc3BvbnNlTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigiZW1wdHlCZWFuUmVzcG9uc2UiLCBudWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygicmV0dXJuIHZhbHVlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkQmVhblJlc3BvbnNlUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQ29udGFjdEJlYW4oKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0TmFtZSgiSmVyc2V5Iik7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldEVtYWlsKCJqZXJzZXlAZXhhbXBsZS5jb20iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigidmFsaWRCZWFuUmVzcG9uc2UiLCBjb250YWN0QmVhbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRhY3RCZWFuLCByZXNwb25zZS5yZWFkRW50aXR5KENvbnRhY3RCZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRCZWFuUmVzcG9uc2VOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBDb250YWN0QmVhbigpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJ2YWxpZEJlYW5SZXNwb25zZSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygicmV0dXJuIHZhbHVlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkQmVhbldyYXBwZWRJblJlc3BvbnNlUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQ29udGFjdEJlYW4oKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0TmFtZSgiSmVyc2V5Iik7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldEVtYWlsKCJqZXJzZXlAZXhhbXBsZS5jb20iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigidmFsaWRCZWFuV3JhcHBlZEluUmVzcG9uc2UiLCBjb250YWN0QmVhbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRhY3RCZWFuLCByZXNwb25zZS5yZWFkRW50aXR5KENvbnRhY3RCZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRCZWFuV3JhcHBlZEluUmVzcG9uc2VOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBDb250YWN0QmVhbigpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJ2YWxpZEJlYW5XcmFwcGVkSW5SZXNwb25zZSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygicmV0dXJuIHZhbHVlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJlYW5SZXNwb25zZVBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldEVtYWlsKCJqZXJzZXlAZXhhbXBsZS5jb20iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigiY3VzdG9tQmVhblJlc3BvbnNlIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyhjb250YWN0QmVhbiwgcmVzcG9uc2UucmVhZEVudGl0eShDb250YWN0QmVhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJlYW5SZXNwb25zZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldEVtYWlsKCJqZXJzZXlAZXhhbXBsZS5jb20iKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0UGhvbmUoIjEzNDUzOSIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oImN1c3RvbUJlYW5SZXNwb25zZSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygicmV0dXJuIHZhbHVlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRDb250ZXh0VmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYmVhbnZhbGlkYXRpb24iKS5wYXRoKCJpbnZhbGlkQ29udGV4dCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzAiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZSB0ZXN0U3ViUmVzb3VyY2UoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIEZvcm0gZm9ybSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0YXJnZXQoImJlYW52YWxpZGF0aW9uIikKKyAgICAgICAgICAgICAgICAucGF0aCgic3ViIikKKyAgICAgICAgICAgICAgICAucGF0aChwYXRoKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KGZvcm0sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U3ViUmVzb3VyY2VQb3NpdGl2ZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTdWJSZXNvdXJjZShwYXRoLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTdWJSZXNvdXJjZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYm9vbGVhbiBvbWl0RW1haWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLmFzTWFwKCkucHV0KCJmaXJzdE5hbWUiLCBBcnJheXMuYXNMaXN0KCJKZXJzZXkiKSk7CisgICAgICAgIGZvcm0uYXNNYXAoKS5wdXQoImxhc3ROYW1lIiwgQXJyYXlzLmFzTGlzdCgiSkFYLVJTIikpOworICAgICAgICBpZiAoIW9taXRFbWFpbCkgeworICAgICAgICAgICAgZm9ybS5hc01hcCgpLnB1dCgiZW1haWwiLCBBcnJheXMuYXNMaXN0KCJqZXJzZXlAZXhhbXBsZS5jb20iKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBDb250YWN0QmVhbigpOworICAgICAgICBjb250YWN0QmVhbi5zZXROYW1lKCJKZXJzZXkgSkFYLVJTIik7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldEVtYWlsKCJqZXJzZXlAZXhhbXBsZS5jb20iKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RTdWJSZXNvdXJjZShwYXRoLCBmb3JtKTsKKworICAgICAgICBpZiAob21pdEVtYWlsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJlbWFpbCIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250YWN0QmVhbiwgcmVzcG9uc2UucmVhZEVudGl0eShDb250YWN0QmVhbi5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTdWJSZXNvdXJjZU5lZ2F0aXZlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5hc01hcCgpLnB1dCgiZm9vIiwgQXJyYXlzLmFzTGlzdCgiYmFyIikpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdFN1YlJlc291cmNlKHBhdGgsIGZvcm0pOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJmaXJzdE5hbWUiKSk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygibGFzdE5hbWUiKSk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiZW1haWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VWYWxpZFJlc291cmNlQ29udGV4dFBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTdWJSZXNvdXJjZVBvc2l0aXZlKCJ2YWxpZFJlc291cmNlQ29udGV4dEluc3RhbmNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VOdWxsUmVzb3VyY2VDb250ZXh0UG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN1YlJlc291cmNlUG9zaXRpdmUoIm51bGxSZXNvdXJjZUNvbnRleHRJbnN0YW5jZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlTnVsbFJlc291cmNlQ29udGV4dENsYXNzUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN1YlJlc291cmNlUG9zaXRpdmUoIm51bGxSZXNvdXJjZUNvbnRleHRDbGFzcyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlVmFsaWRSZXNvdXJjZUNvbnRleHROZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0U3ViUmVzb3VyY2VOZWdhdGl2ZSgidmFsaWRSZXNvdXJjZUNvbnRleHRJbnN0YW5jZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlTnVsbFJlc291cmNlQ29udGV4dE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTdWJSZXNvdXJjZU5lZ2F0aXZlKCJudWxsUmVzb3VyY2VDb250ZXh0SW5zdGFuY2UiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUVtcHR5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5hc01hcCgpLnB1dCgiZmlyc3ROYW1lIiwgQXJyYXlzLmFzTGlzdCgiIikpOworICAgICAgICBmb3JtLmFzTWFwKCkucHV0KCJsYXN0TmFtZSIsIEFycmF5cy5hc0xpc3QoIiIpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RTdWJSZXNvdXJjZSgibnVsbFJlc291cmNlQ29udGV4dEluc3RhbmNlIiwgZm9ybSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImF0IGxlYXN0IG9uZSBvZiB0aGUgbmFtZXMgaXMgZW1wdHkiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VQcm9wZXJ0eU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTdWJSZXNvdXJjZSgidmFsaWRSZXNvdXJjZUNvbnRleHRJbnN0YW5jZSIsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyb25nU3ViUmVzb3VyY2VOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYmVhbnZhbGlkYXRpb24iKQorICAgICAgICAgICAgICAgIC5wYXRoKCJzdWIvd3JvbmciKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoInJlc291cmNlQ29udGV4dCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0NvbnRhY3RCZWFuLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0NvbnRhY3RCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkMTNhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ29udGFjdEJlYW4uamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47CisKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5FbWFpbDsKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5Ob3RCbGFuazsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQE9uZUNvbnRhY3QKK3B1YmxpYyBjbGFzcyBDb250YWN0QmVhbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBARW1haWwocmVnZXhwID0gIlthLXpBLVowLTkuXyUtXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLDR9IikKKyAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsKKworICAgIHByaXZhdGUgU3RyaW5nIHBob25lOworCisgICAgQE5vdEJsYW5rCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIEBOb3ROdWxsKGdyb3VwcyA9IHtFeHRlbmRlZC5jbGFzc30pCisgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKSB7CisgICAgICAgIHJldHVybiBlbWFpbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChmaW5hbCBTdHJpbmcgZW1haWwpIHsKKyAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgIH0KKworICAgIEBQYXR0ZXJuKHJlZ2V4cCA9ICJbMC05XXszLDl9IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBob25lKCkgeworICAgICAgICByZXR1cm4gcGhvbmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGhvbmUoZmluYWwgU3RyaW5nIHBob25lKSB7CisgICAgICAgIHRoaXMucGhvbmUgPSBwaG9uZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbnRhY3RCZWFuKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gdGhhdCA9IChDb250YWN0QmVhbikgbzsKKworICAgICAgICBpZiAoZW1haWwgIT0gbnVsbCA/ICFlbWFpbC5lcXVhbHModGhhdC5lbWFpbCkgOiB0aGF0LmVtYWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSAhPSBudWxsID8gIW5hbWUuZXF1YWxzKHRoYXQubmFtZSkgOiB0aGF0Lm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChwaG9uZSAhPSBudWxsID8gIXBob25lLmVxdWFscyh0aGF0LnBob25lKSA6IHRoYXQucGhvbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IGVtYWlsICE9IG51bGwgPyBlbWFpbC5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAocGhvbmUgIT0gbnVsbCA/IHBob25lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAobmFtZSAhPSBudWxsID8gbmFtZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJDb250YWN0QmVhbnsiCisgICAgICAgICAgICAgICAgKyAiZW1haWw9JyIgKyBlbWFpbCArICdcJycKKyAgICAgICAgICAgICAgICArICIsIHBob25lPSciICsgcGhvbmUgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAiLCBuYW1lPSciICsgbmFtZSArICdcJycKKyAgICAgICAgICAgICAgICArICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0N1c3RvbUJlYW4uamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ3VzdG9tQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTk1MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0N1c3RvbUJlYW4uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAWG1sUm9vdEVsZW1lbnQKK0BDdXN0b21WYWxpZGF0aW9uCitwdWJsaWMgY2xhc3MgQ3VzdG9tQmVhbiB7CisKKyAgICBATm90TnVsbAorICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGUgPSB0cnVlOworCisgICAgcHVibGljIHZvaWQgc2V0UGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgQFhtbFRyYW5zaWVudAorICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGUoKSB7CisgICAgICAgIHJldHVybiB2YWxpZGF0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0ZShmaW5hbCBib29sZWFuIHZhbGlkYXRlKSB7CisgICAgICAgIHRoaXMudmFsaWRhdGUgPSB2YWxpZGF0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0N1c3RvbUNvbmZpZ1ZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0N1c3RvbUNvbmZpZ1ZhbGlkYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1YWVmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ3VzdG9tQ29uZmlnVmFsaWRhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uTWVzc2FnZUludGVycG9sYXRvcjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhcmFtZXRlck5hbWVQcm92aWRlcjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBhdGg7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5UcmF2ZXJzYWJsZVJlc29sdmVyOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkueG1sLk1veHlYbWxGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5CZWFuVmFsaWRhdGlvbk1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5NYXJzaGFsbGVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUNvbmZpZ1ZhbGlkYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAamF2YXgud3MucnMuUGF0aCgiY3VzdG9tY29uZmlndmFsaWRhdGlvbi97cGF0aDogLip9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUNvbmZpZ1Jlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgQFZhbGlkCisgICAgICAgIHB1YmxpYyBDdXN0b21CZWFuIHBvc3QoQFBhdGhQYXJhbSgicGF0aCIpIGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBDdXN0b21CZWFuIGJlYW5QYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFNpemUobWluID0gNSkgQEhlYWRlclBhcmFtKCJteUhlYWRlciIpIGZpbmFsIFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgICAgIGlmICgiIi5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgICAgICBiZWFuUGFyYW1ldGVyLnNldFBhdGgobnVsbCk7CisgICAgICAgICAgICAgICAgYmVhblBhcmFtZXRlci5zZXRWYWxpZGF0ZShmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJlYW5QYXJhbWV0ZXIuc2V0UGF0aChwYXRoKTsKKyAgICAgICAgICAgICAgICBiZWFuUGFyYW1ldGVyLnNldFZhbGlkYXRlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJlYW5QYXJhbWV0ZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEN1c3RvbUNvbmZpZ1Jlc291cmNlLmNsYXNzKTsKKworICAgICAgICAvLyBUdXJuIG9mZiBCViBpbiBNT1h5IG90aGVyd2lzZSB0aGUgZW50aXRpZXMgb24gc2VydmVyIHdvdWxkIGJlIHZhbGlkYXRlZCBhdCBpbmNvcnJlY3QgdGltZXMuCisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG1veHlYbWxGZWF0dXJlKCkpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbnRleHRSZXNvbHZlci5jbGFzcyk7CisKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5CVl9TRU5EX0VSUk9SX0lOX1JFU1BPTlNFLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgc3VwZXIuY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgQlYgaW4gTU9YeSBvdGhlcndpc2UgdGhlIGVudGl0aWVzIG9uIGNsaWVudCB3b3VsZCBiZSB2YWxpZGF0ZWQgYXMgd2VsbC4KKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG1veHlYbWxGZWF0dXJlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgTW94eVhtbEZlYXR1cmUgbW94eVhtbEZlYXR1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTW94eVhtbEZlYXR1cmUobmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkge3sKKyAgICAgICAgICAgICAgICAgICAgcHV0KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLkJFQU5fVkFMSURBVElPTl9NT0RFLCBCZWFuVmFsaWRhdGlvbk1vZGUuTk9ORSk7CisgICAgICAgICAgICAgICAgfX0sCisgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICBmYWxzZQorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjdXN0b21jb25maWd2YWxpZGF0aW9uIikKKyAgICAgICAgICAgICAgICAucGF0aCgib2siKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJteUhlYWRlciIsICIxMjM0NSIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgQ3VzdG9tQmVhbigpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib2siLCByZXNwb25zZS5yZWFkRW50aXR5KEN1c3RvbUJlYW4uY2xhc3MpLmdldFBhdGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyTmFtZVdpdGhJbnRlcnBvbGF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImN1c3RvbWNvbmZpZ3ZhbGlkYXRpb24iKQorICAgICAgICAgICAgICAgIC5wYXRoKCJvayIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIm15SGVhZGVyIiwgIjEyMzQiKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEN1c3RvbUJlYW4oKSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzIiKSk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiaGVhZGVyIikpOworICAgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmNvbnRhaW5zKCJzaXplIG11c3QgYmUgYmV0d2VlbiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJtZXNzYWdlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImN1c3RvbWNvbmZpZ3ZhbGlkYXRpb24vIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcigibXlIZWFkZXIiLCAiMTIzNDUiKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEN1c3RvbUJlYW4oKSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAvLyByZXR1cm4gdmFsdWUgcGFzc2VkIHZhbGlkYXRpb24gYmVjYXVzZSBvZiAiY29ycnVwdGVkIiB0cmF2ZXJzYWJsZXJlc29sdmVyCisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCByZXNwb25zZS5yZWFkRW50aXR5KEN1c3RvbUJlYW4uY2xhc3MpLmdldFBhdGgoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxWYWxpZGF0aW9uQ29uZmlnPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uQ29uZmlnIGNvbmZpZzsKKworICAgICAgICBwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db250ZXh0UmVzb2x2ZXIoKSB7CisgICAgICAgICAgICBjb25maWcgPSBuZXcgVmFsaWRhdGlvbkNvbmZpZygpOworCisgICAgICAgICAgICAvLyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBpcyBzZXQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIGNvbmZpZy5tZXNzYWdlSW50ZXJwb2xhdG9yKG5ldyBDdXN0b21NZXNzYWdlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgY29uZmlnLnBhcmFtZXRlck5hbWVQcm92aWRlcihuZXcgQ3VzdG9tUGFyYW1ldGVyTmFtZVByb3ZpZGVyKCkpOworICAgICAgICAgICAgY29uZmlnLnRyYXZlcnNhYmxlUmVzb2x2ZXIobmV3IEN1c3RvbVRyYXZlcnNhYmxlUmVzb2x2ZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbGlkYXRpb25Db25maWcgZ2V0Q29udGV4dChmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGlvbkNvbmZpZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpID8gY29uZmlnIDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbU1lc3NhZ2VJbnRlcnBvbGF0b3IgaW1wbGVtZW50cyBNZXNzYWdlSW50ZXJwb2xhdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShmaW5hbCBTdHJpbmcgbWVzc2FnZVRlbXBsYXRlLCBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiAibWVzc2FnZSI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBpbnRlcnBvbGF0ZShmaW5hbCBTdHJpbmcgbWVzc2FnZVRlbXBsYXRlLCBmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAibG9jYWxpemVkIG1lc3NhZ2UiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tUGFyYW1ldGVyTmFtZVByb3ZpZGVyIGltcGxlbWVudHMgUGFyYW1ldGVyTmFtZVByb3ZpZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlck5hbWVQcm92aWRlciBuYW1lUHJvdmlkZXI7CisKKyAgICAgICAgcHVibGljIEN1c3RvbVBhcmFtZXRlck5hbWVQcm92aWRlcigpIHsKKyAgICAgICAgICAgIG5hbWVQcm92aWRlciA9IFZhbGlkYXRpb24uYnlEZWZhdWx0UHJvdmlkZXIoKS5jb25maWd1cmUoKS5nZXREZWZhdWx0UGFyYW1ldGVyTmFtZVByb3ZpZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYXJhbWV0ZXJOYW1lcyhmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgcmV0dXJuIG5hbWVQcm92aWRlci5nZXRQYXJhbWV0ZXJOYW1lcyhjb25zdHJ1Y3Rvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYXJhbWV0ZXJOYW1lcyhmaW5hbCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBwb3N0ID0gQ3VzdG9tQ29uZmlnUmVzb3VyY2UuY2xhc3MuZ2V0TWV0aG9kKCJwb3N0IiwgU3RyaW5nLmNsYXNzLCBDdXN0b21CZWFuLmNsYXNzLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5lcXVhbHMocG9zdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoInBhdGgiLCAiYmVhblBhcmFtZXRlciIsICJoZWFkZXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmFtZVByb3ZpZGVyLmdldFBhcmFtZXRlck5hbWVzKG1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21UcmF2ZXJzYWJsZVJlc29sdmVyIGltcGxlbWVudHMgVHJhdmVyc2FibGVSZXNvbHZlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKGZpbmFsIE9iamVjdCB0cmF2ZXJzYWJsZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGF0aC5Ob2RlIHRyYXZlcnNhYmxlUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHJvb3RCZWFuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGF0aCBwYXRoVG9UcmF2ZXJzYWJsZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGFibGUoZmluYWwgT2JqZWN0IHRyYXZlcnNhYmxlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGF0aC5Ob2RlIHRyYXZlcnNhYmxlUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiByb290QmVhblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudFR5cGUgZWxlbWVudFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ3VzdG9tVmFsaWRhdGlvbi5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9DdXN0b21WYWxpZGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhMmQyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ3VzdG9tVmFsaWRhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BOb3ROdWxsCitAQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IEN1c3RvbVZhbGlkYXRpb24uVmFsaWRhdG9yLmNsYXNzKQorcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9tVmFsaWRhdGlvbiB7CisKKyAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgImNsaWVudCBzaG91bGQgbmV2ZXIgc2VlIHRoaXMiOworCisgICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OworCisgICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8Q3VzdG9tVmFsaWRhdGlvbiwgQ3VzdG9tQmVhbj4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIEN1c3RvbVZhbGlkYXRpb24gY29uc3RyYWludEFubm90YXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIEN1c3RvbUJlYW4gYmVhbiwgZmluYWwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gIWJlYW4uaXNWYWxpZGF0ZSgpIC0gdG8gbWFrZSBzdXJlIHRoaXMgdmFsaWRhdGlvbiBwYXNzZXMgZm9yIEN1c3RvbUNvbmZpZ1ZhbGlkYXRpb25UZXN0I3Rlc3RUcmF2ZXJzYWJsZVJlc29sdmVyCisgICAgICAgICAgICAvLyAoVHJhdmVyc2FibGVSZXNvbHZlciBpcyBub3QgaW52b2tlZCBmb3IgRWxlbWVudFR5cGUuVFlQRSBhbnltb3JlKS4KKyAgICAgICAgICAgIHJldHVybiAhYmVhbi5pc1ZhbGlkYXRlKCkgfHwgdXJpSW5mby5nZXRQYXRoUGFyYW1ldGVycygpLmdldEZpcnN0KCJwYXRoIikuZXF1YWxzKGJlYW4uZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vRW50aXR5SW5oZXJpdGFuY2VWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9FbnRpdHlJbmhlcml0YW5jZVZhbGlkYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwNTM3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vRW50aXR5SW5oZXJpdGFuY2VWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWF4OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWluOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmhpYmVybmF0ZS52YWxpZGF0b3IuY29uc3RyYWludHMuTm90Qmxhbms7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdHMgdG8gZW5zdXJlIHRoYXQgdmFsaWRhdGlvbiBjb25zdHJhaW50cyBvbiBhIHN1cGVyY2xhc3MgYXJlIHZhbGlkYXRlZCBhcyB3ZWxsLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRW50aXR5SW5oZXJpdGFuY2VWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgICAgIHB1YmxpYyBFbnRpdHkgcG9zdChAVmFsaWQgZmluYWwgRW50aXR5IGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJzdHJhY3RFbnRpdHkgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7CisKKyAgICAgICAgcHVibGljIEFic3RyYWN0RW50aXR5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFic3RyYWN0RW50aXR5KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgQE5vdEJsYW5rCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEFic3RyYWN0RW50aXR5IHRoYXQgPSAoQWJzdHJhY3RFbnRpdHkpIG87CisKKyAgICAgICAgICAgIGlmICghdGV4dC5lcXVhbHModGhhdC50ZXh0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXh0Lmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVudGl0eSBleHRlbmRzIEFic3RyYWN0RW50aXR5IHsKKworICAgICAgICBwcml2YXRlIEludGVnZXIgbnVtYmVyOworCisgICAgICAgIHB1YmxpYyBFbnRpdHkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRW50aXR5KGZpbmFsIFN0cmluZyB0ZXh0LCBmaW5hbCBJbnRlZ2VyIG51bWJlcikgeworICAgICAgICAgICAgc3VwZXIodGV4dCk7CisgICAgICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBNaW4oMTIpCisgICAgICAgIEBNYXgoMTQpCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGdldE51bWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXIoZmluYWwgSW50ZWdlciBudW1iZXIpIHsKKyAgICAgICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3VwZXIuZXF1YWxzKG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbzsKKworICAgICAgICAgICAgaWYgKCFudW1iZXIuZXF1YWxzKGVudGl0eS5udW1iZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IHN1cGVyLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG51bWJlci5oYXNoQ29kZSgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEVudGl0eSBlbnRpdHkgPSBuZXcgRW50aXR5KCJmb28iLCAxMyk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoamF2YXgud3MucnMuY2xpZW50LkVudGl0eS5qc29uKGVudGl0eSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoRW50aXR5LmNsYXNzKSwgaXMoZW50aXR5KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5SW5oZXJpdGFuY2VCbGFua1RleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChqYXZheC53cy5ycy5jbGllbnQuRW50aXR5Lmpzb24obmV3IEVudGl0eSgiIiwgMTMpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5SW5oZXJpdGFuY2VJbnZhbGlkTnVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoamF2YXgud3MucnMuY2xpZW50LkVudGl0eS5qc29uKG5ldyBFbnRpdHkoImZvbyIsIDIzKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDQwMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vRXh0ZW5kZWQuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vRXh0ZW5kZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjlmYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9FeHRlbmRlZC5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vRmllbGRQcm9wZXJ0eVZhbGlkYXRpb24uamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vRmllbGRQcm9wZXJ0eVZhbGlkYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWJjNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9GaWVsZFByb3BlcnR5VmFsaWRhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gRmllbGRQcm9wZXJ0eVZhbGlkYXRpb24uVmFsaWRhdG9yLmNsYXNzKQorcHVibGljIEBpbnRlcmZhY2UgRmllbGRQcm9wZXJ0eVZhbGlkYXRpb24geworCisgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJvbmUgb3IgbW9yZSBmaWVsZHMgYXJlIG5vdCB2YWxpZCI7CisKKyAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307CisKKyAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKKworICAgIFN0cmluZ1tdIGVsZW1lbnRzKCkgZGVmYXVsdCB7fTsKKworICAgIHB1YmxpYyBjbGFzcyBWYWxpZGF0b3IgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yPEZpZWxkUHJvcGVydHlWYWxpZGF0aW9uLCBGaWVsZFByb3BlcnR5VmFsaWRhdGlvblJlc291cmNlLlN1YlJlc291cmNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcHJvcGVydGllczsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBGaWVsZFByb3BlcnR5VmFsaWRhdGlvbiBhbm5vdGF0aW9uKSB7CisgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBBcnJheXMuYXNMaXN0KGFubm90YXRpb24uZWxlbWVudHMoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChmaW5hbCBGaWVsZFByb3BlcnR5VmFsaWRhdGlvblJlc291cmNlLlN1YlJlc291cmNlIGJlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29uc3RyYWludFZhbGlkYXRvckNvbnRleHQpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcHJvcGVydHkgOiBwcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCJmaWVsZEFuZENsYXNzIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAmPSBiZWFuLmZpZWxkQW5kQ2xhc3MgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwcm9wZXJ0eUFuZENsYXNzIi5lcXVhbHMocHJvcGVydHkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAmPSBiZWFuLmdldFByb3BlcnR5QW5kQ2xhc3MoKSAhPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInByb3BlcnR5R2V0dGVyQW5kQ2xhc3MiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IGJlYW4uZ2V0UHJvcGVydHlHZXR0ZXJBbmRDbGFzcygpICE9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9GaWVsZFByb3BlcnR5VmFsaWRhdGlvblJlc291cmNlLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0ZpZWxkUHJvcGVydHlWYWxpZGF0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNjODk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9GaWVsZFByb3BlcnR5VmFsaWRhdGlvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiZmllbGRQcm9wZXJ0eVZhbGlkYXRpb25SZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgRmllbGRQcm9wZXJ0eVZhbGlkYXRpb25SZXNvdXJjZSB7CisKKyAgICBAUGF0aCgidmFsaWQiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSB2YWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiKTsKKyAgICB9CisKKyAgICBAUGF0aCgiaW52YWxpZFByb3BlcnR5R2V0dGVyQW5kQ2xhc3NOdWxsIikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2UgaW52YWxpZFByb3BlcnR5R2V0dGVyQW5kQ2xhc3NOdWxsKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsIG51bGwpOworICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkUHJvcGVydHlHZXR0ZXJBbmRDbGFzc0xvbmciKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBpbnZhbGlkUHJvcGVydHlHZXR0ZXJBbmRDbGFzc0xvbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgInZhbGlkLXZhbGlkIik7CisgICAgfQorCisgICAgQFBhdGgoImludmFsaWRQcm9wZXJ0eUFuZENsYXNzTnVsbCIpCisgICAgcHVibGljIFN1YlJlc291cmNlIGludmFsaWRQcm9wZXJ0eUFuZENsYXNzTnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCBudWxsLCAidmFsaWQiKTsKKyAgICB9CisKKyAgICBAUGF0aCgiaW52YWxpZEZpZWxkQW5kQ2xhc3NOdWxsIikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2UgaW52YWxpZEZpZWxkQW5kQ2xhc3NOdWxsKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsIG51bGwsICJ2YWxpZCIsICJ2YWxpZCIpOworICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkUHJvcGVydHlHZXR0ZXJOdWxsIikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2UgaW52YWxpZFByb3BlcnR5R2V0dGVyTnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgidmFsaWQiLCAidmFsaWQiLCBudWxsLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiKTsKKyAgICB9CisKKyAgICBAUGF0aCgiaW52YWxpZFByb3BlcnR5R2V0dGVyTG9uZyIpCisgICAgcHVibGljIFN1YlJlc291cmNlIGludmFsaWRQcm9wZXJ0eUdldHRlckxvbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoInZhbGlkIiwgInZhbGlkIiwgInZhbGlkLXZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIik7CisgICAgfQorCisgICAgQFBhdGgoImludmFsaWRQcm9wZXJ0eU51bGwiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBpbnZhbGlkUHJvcGVydHlOdWxsKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCJ2YWxpZCIsIG51bGwsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIpOworICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkRmllbGROdWxsIikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2UgaW52YWxpZEZpZWxkTnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZShudWxsLCAidmFsaWQiLCAidmFsaWQiLCBudWxsLCAidmFsaWQiLCAidmFsaWQiKTsKKyAgICB9CisKKyAgICBARmllbGRQcm9wZXJ0eVZhbGlkYXRpb24oZWxlbWVudHMgPSB7ImZpZWxkQW5kQ2xhc3MiLCAicHJvcGVydHlBbmRDbGFzcyIsICJwcm9wZXJ0eUdldHRlckFuZENsYXNzIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgQFNpemUobWluID0gNSkKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkOworCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIEBTaXplKG1pbiA9IDUpCisgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eTsKKworICAgICAgICBATm90TnVsbAorICAgICAgICBAU2l6ZShtaW4gPSA1KQorICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlHZXR0ZXI7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkQW5kQ2xhc3M7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5QW5kQ2xhc3M7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5R2V0dGVyQW5kQ2xhc3M7CisKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlKGZpbmFsIFN0cmluZyBmaWVsZCwgZmluYWwgU3RyaW5nIHByb3BlcnR5LCBmaW5hbCBTdHJpbmcgcHJvcGVydHlBbmRHZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRBbmRDbGFzcywgZmluYWwgU3RyaW5nIHByb3BlcnR5QW5kQ2xhc3MsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUdldHRlckFuZENsYXNzKSB7CisgICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgICAgICAgICB0aGlzLnByb3BlcnR5R2V0dGVyID0gcHJvcGVydHlBbmRHZXR0ZXI7CisgICAgICAgICAgICB0aGlzLmZpZWxkQW5kQ2xhc3MgPSBmaWVsZEFuZENsYXNzOworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eUFuZENsYXNzID0gcHJvcGVydHlBbmRDbGFzczsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHlHZXR0ZXJBbmRDbGFzcyA9IHByb3BlcnR5R2V0dGVyQW5kQ2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgICAgICB9CisKKyAgICAgICAgQFNpemUobWF4ID0gNSkKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUdldHRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUdldHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlBbmRDbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUFuZENsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQFNpemUobWF4ID0gNSkKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUdldHRlckFuZENsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5R2V0dGVyQW5kQ2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kKCkgeworICAgICAgICAgICAgcmV0dXJuICJvayI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0ZpZWxkUHJvcGVydHlWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9GaWVsZFByb3BlcnR5VmFsaWRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzUwNzY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9GaWVsZFByb3BlcnR5VmFsaWRhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZFByb3BlcnR5VmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRmllbGRQcm9wZXJ0eVZhbGlkYXRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInZhbGlkIiwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUHJvcGVydHlHZXR0ZXJBbmRDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImludmFsaWRQcm9wZXJ0eUdldHRlckFuZENsYXNzTnVsbCIsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByb3BlcnR5R2V0dGVyQW5kQ2xhc3NMb25nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJpbnZhbGlkUHJvcGVydHlHZXR0ZXJBbmRDbGFzc0xvbmciLCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQcm9wZXJ0eUFuZENsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW52YWxpZFByb3BlcnR5QW5kQ2xhc3NOdWxsIiwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRmllbGRBbmRDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImludmFsaWRGaWVsZEFuZENsYXNzTnVsbCIsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByb3BlcnR5R2V0dGVyTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW52YWxpZFByb3BlcnR5R2V0dGVyTnVsbCIsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByb3BlcnR5R2V0dGVyTG9uZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW52YWxpZFByb3BlcnR5R2V0dGVyTG9uZyIsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByb3BlcnR5TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW52YWxpZFByb3BlcnR5TnVsbCIsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZpZWxkTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW52YWxpZEZpZWxkTnVsbCIsIDQwMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBpbnQgc3RhdHVzKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJmaWVsZFByb3BlcnR5VmFsaWRhdGlvblJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucGF0aChwYXRoKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyhzdGF0dXMpKTsKKworICAgICAgICBpZiAoc3RhdHVzID09IDIwMCkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIm9rIikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Jbmhlcml0YW5jZVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0luaGVyaXRhbmNlVmFsaWRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZhMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Jbmhlcml0YW5jZVZhbGlkYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW47CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEluaGVyaXRhbmNlVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlc291cmNlTnVtYmVySW50ZXJmYWNlPFQgZXh0ZW5kcyBOdW1iZXI+IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBATWluKDApCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIHB1YmxpYyBUIHBvc3QoQE5vdE51bGwgQE1heCgxMDApIGZpbmFsIFQgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlc291cmNlU3RyaW5nSW50ZXJmYWNlIHsKKworICAgICAgICBATWluKC01MCkKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KEBNYXgoNTApIGZpbmFsIFN0cmluZyB2YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VOdW1iZXJTdHJpbmcgaW1wbGVtZW50cyBSZXNvdXJjZU51bWJlckludGVyZmFjZTxJbnRlZ2VyPiwgUmVzb3VyY2VTdHJpbmdJbnRlcmZhY2UgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW50ZWdlciBwb3N0KGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzdHJpbmciKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9zdWIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViQ2xhc3NSZXNvdXJjZU51bWJlclN0cmluZyBleHRlbmRzIFJlc291cmNlTnVtYmVyU3RyaW5nIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEludGVnZXIgcG9zdChmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlTnVtYmVyU3RyaW5nLmNsYXNzLCBTdWJDbGFzc1Jlc291cmNlTnVtYmVyU3RyaW5nLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU51bWJlclBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDc1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTnVtYmVySW5wdXROZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgxNTAsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVTdHJpbmdQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgic3RyaW5nIiwgIjI1IiwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVN0cmluZ0lucHV0TmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInN0cmluZyIsICIxNTAiLCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTnVtYmVyU3ViQ2xhc3NQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgic3ViIiwgNzUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOdW1iZXJJbnB1dFN1YkNsYXNzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInN1YiIsIDE1MCwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVN0cmluZ1N1YkNsYXNzUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInN1Yi9zdHJpbmciLCAiMjUiLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlU3RyaW5nSW5wdXRTdWJDbGFzc05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJzdWIvc3RyaW5nIiwgIjE1MCIsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOdW1iZXJSZXNwb25zZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KC0xNTAsIDUwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVTdHJpbmdSZXNwb25zZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJzdHJpbmciLCAiLTE1MCIsIDUwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOdW1iZXJSZXNwb25zZVN1YkNsYXNzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInN1YiIsIC0xNTAsIDUwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVTdHJpbmdSZXNwb25zZVN1YkNsYXNzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInN1Yi9zdHJpbmciLCAiLTE1MCIsIDUwMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgaW50IHJlc3BvbnNlU3RhdHVzKSB7CisgICAgICAgIF90ZXN0KCIiLCB2YWx1ZSwgcmVzcG9uc2VTdGF0dXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgT2JqZWN0IHZhbHVlLCBmaW5hbCBpbnQgcmVzcG9uc2VTdGF0dXMpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQodmFsdWUpKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyByZXNwb25zZS4iLCByZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyhyZXNwb25zZVN0YXR1cykpOworCisgICAgICAgIGlmIChyZXNwb25zZVN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIkludmFsaWQgZW50aXR5LiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkodmFsdWUuZ2V0Q2xhc3MoKSksIGVxdWFsVG8odmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vTXVsdGlwbGVQYXJhbUNvbnN0cmFpbnQuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vTXVsdGlwbGVQYXJhbUNvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdhZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9NdWx0aXBsZVBhcmFtQ29uc3RyYWludC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHt9KQorQFBhcmFtQ29uc3RyYWludAorQFNpemUobWF4ID0gMTEpCitwdWJsaWMgQGludGVyZmFjZSBNdWx0aXBsZVBhcmFtQ29uc3RyYWludCB7CisKKyAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgImludmFsaWQgcGFyYW1ldGVyIjsKKworICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Ob25FbXB0eU5hbWVzLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL05vbkVtcHR5TmFtZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjI5ZTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Ob25FbXB0eU5hbWVzLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvcjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7IE5vbkVtcHR5TmFtZXMuVmFsaWRhdG9yLmNsYXNzIH0pCitwdWJsaWMgQGludGVyZmFjZSBOb25FbXB0eU5hbWVzIHsKKworICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAie29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbi5Ob25FbXB0eU5hbWVzLm1lc3NhZ2V9IjsKKworICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OworCisgICAgcHVibGljIGNsYXNzIFZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8Tm9uRW1wdHlOYW1lcywgQmFzaWNTdWJSZXNvdXJjZT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIE5vbkVtcHR5TmFtZXMgbm9uUmVjdXJzaXZlKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChmaW5hbCBCYXNpY1N1YlJlc291cmNlIHJlc291cmNlLCBmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQocmVzb3VyY2UuZ2V0Rmlyc3ROYW1lKCkpICYmIGlzVmFsaWQocmVzb3VyY2UuZ2V0TGFzdE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgLy8gQE5vdE51bGwgY2hlY2tzIG51bGwgdmFsdWUKKyAgICAgICAgICAgIHJldHVybiBuYW1lID09IG51bGwgfHwgISIiLmVxdWFscyhuYW1lLnRyaW0oKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL09uZUNvbnRhY3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vT25lQ29udGFjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTdjYjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL09uZUNvbnRhY3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BOb3ROdWxsCitAQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IE9uZUNvbnRhY3QuVmFsaWRhdG9yLmNsYXNzKQorcHVibGljIEBpbnRlcmZhY2UgT25lQ29udGFjdCB7CisKKyAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIm5vbmUgb3IgbW9yZSB0aGFuIG9uZSBjb250YWN0IjsKKworICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OworCisgICAgcHVibGljIGNsYXNzIFZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8T25lQ29udGFjdCwgQ29udGFjdEJlYW4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBPbmVDb250YWN0IG5vblJlY3Vyc2l2ZSkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4sIGZpbmFsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoY29udGFjdEJlYW4uZ2V0RW1haWwoKSA9PSBudWxsICYmIGNvbnRhY3RCZWFuLmdldFBob25lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAhKGNvbnRhY3RCZWFuLmdldEVtYWlsKCkgIT0gbnVsbCAmJiBjb250YWN0QmVhbi5nZXRQaG9uZSgpICE9IG51bGwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9QYXJhbUNvbnN0cmFpbnQuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vUGFyYW1Db25zdHJhaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMjYyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vUGFyYW1Db25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5QYXR0ZXJuOworCisvKioKKyAqIFZhbGlkOiBbYS16QS1aXStQYXJhbQorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSB7fSkKK0BOb3ROdWxsCitAUGF0dGVybihyZWdleHAgPSAiXlthLXpBLVpdK1BhcmFtJCIpCitwdWJsaWMgQGludGVyZmFjZSBQYXJhbUNvbnN0cmFpbnQgeworCisgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJpbnZhbGlkIHBhcmFtZXRlciI7CisKKyAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307CisKKyAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vUHJvZ3JhbW1hdGljVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vUHJvZ3JhbW1hdGljVmFsaWRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjMwODEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Qcm9ncmFtbWF0aWNWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEJlYW4gVmFsaWRhdGlvbiB0ZXN0cyBmb3IgcHJvZ3JhbW1hdGljYWxseSBjcmVhdGVkIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFByb2dyYW1tYXRpY1ZhbGlkYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBTZXQ8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoImluc3RhbmNlIik7CisgICAgICAgIHJlc291cmNlQnVpbGRlcgorICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoIlBPU1QiKQorICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkobmV3IFZhbGlkYXRpb25JbmZsZWN0b3IoKSk7CisgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworCisgICAgICAgIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoImNsYXNzIik7CisgICAgICAgIHJlc291cmNlQnVpbGRlcgorICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoIlBPU1QiKQorICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkoVmFsaWRhdGlvbkluZmxlY3Rvci5jbGFzcyk7CisgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJtZXRob2RJbnN0YW5jZUNsYXNzIik7CisgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIKKyAgICAgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiUE9TVCIpCisgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkobmV3IFZhbGlkYXRpb25JbmZsZWN0b3IoKSwgVmFsaWRhdGlvbkluZmxlY3Rvci5jbGFzcy5nZXRNZXRob2QoImdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyUmVxdWVzdENvbnRleHQuY2xhc3MpKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJtZXRob2RDbGFzc0NsYXNzIik7CisgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIKKyAgICAgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiUE9TVCIpCisgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkoVmFsaWRhdGlvbkluZmxlY3Rvci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uSW5mbGVjdG9yLmNsYXNzLmdldE1ldGhvZCgiZ2V0IiwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQuY2xhc3MpKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJtZXRob2RJbnN0YW5jZUludGVyZmFjZSIpOworICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyCisgICAgICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoIlBPU1QiKQorICAgICAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KG5ldyBWYWxpZGF0aW9uSW5mbGVjdG9yKCksIEluZmxlY3Rvci5jbGFzcy5nZXRNZXRob2QoImFwcGx5IiwgT2JqZWN0LmNsYXNzKSk7CisgICAgICAgICAgICByZXNvdXJjZXMuYWRkKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigibWV0aG9kQ2xhc3NJbnRlcmZhY2UiKTsKKyAgICAgICAgICAgIHJlc291cmNlQnVpbGRlcgorICAgICAgICAgICAgICAgICAgICAuYWRkTWV0aG9kKCJQT1NUIikKKyAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShWYWxpZGF0aW9uSW5mbGVjdG9yLmNsYXNzLCBJbmZsZWN0b3IuY2xhc3MuZ2V0TWV0aG9kKCJhcHBseSIsIE9iamVjdC5jbGFzcykpOworICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKS5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3Rvckluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJpbnN0YW5jZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInZhbHVlIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9ySW5zdGFuY2VOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiaW5zdGFuY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9yQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNsYXNzIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgidmFsdWUiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JDbGFzc05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjbGFzcyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JNZXRob2RJbnN0YW5jZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJtZXRob2RJbnN0YW5jZUNsYXNzIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgidmFsdWUiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JNZXRob2RJbnN0YW5jZUNsYXNzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIm1ldGhvZEluc3RhbmNlQ2xhc3MiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9yTWV0aG9kQ2xhc3NDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibWV0aG9kQ2xhc3NDbGFzcyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInZhbHVlIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9yTWV0aG9kQ2xhc3NDbGFzc05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJtZXRob2RDbGFzc0NsYXNzIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3Rvck1ldGhvZEluc3RhbmNlSW50ZXJmYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJtZXRob2RJbnN0YW5jZUludGVyZmFjZSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoInZhbHVlIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9yTWV0aG9kSW5zdGFuY2VJbnRlcmZhY2VOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibWV0aG9kSW5zdGFuY2VJbnRlcmZhY2UiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9yTWV0aG9kQ2xhc3NJbnRlcmZhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIm1ldGhvZENsYXNzSW50ZXJmYWNlIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgidmFsdWUiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JNZXRob2RDbGFzc0ludGVyZmFjZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJtZXRob2RDbGFzc0ludGVyZmFjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL1Byb3BlcnR5VmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vUHJvcGVydHlWYWxpZGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWZmNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL1Byb3BlcnR5VmFsaWRhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTWFwUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25GZWF0dXJlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgZW5hYmxpbmcvZGlzYWJsaW5nOiBhdXRvLWRpc2NvdmVyeSwgYmVhbiB2YWxpZGF0aW9uLCB2YWxpZGF0aW9uIGZlYXR1cmUuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydHlWYWxpZGF0aW9uVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmlzRW1wdHkoKSA/IG51bGwgOiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWxpZGF0aW9uRGVmYXVsdERpc2NvdmVyeUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoNTAwLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsaWRhdGlvbkRlZmF1bHREaXNjb3ZlcnlOb0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoNTAwLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbGlkYXRpb25EaXNjb3ZlcnlGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDUwMCwgbnVsbCwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWxpZGF0aW9uRGlzY292ZXJ5Tm9GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDUwMCwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsaWRhdGlvbk5vRGlzY292ZXJ5RmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg1MDAsIG51bGwsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWxpZGF0aW9uTm9EaXNjb3ZlcnlOb0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRXZlbiB0aG91Z2ggcHJvcGVydGllcyBhcmUgZGlzYWJsZWQgQlYgaXMgcmVnaXN0ZXJlZC4KKyAgICAgICAgX3Rlc3QoNTAwLCBudWxsLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkRlZmF1bHREaXNjb3ZlcnlGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDUwMCwgZmFsc2UsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25EZWZhdWx0RGlzY292ZXJ5Tm9GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDUwMCwgZmFsc2UsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uRGlzY292ZXJ5RmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg1MDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkRpc2NvdmVyeU5vRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg1MDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25Ob0Rpc2NvdmVyeUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoNTAwLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbk5vRGlzY292ZXJ5Tm9GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEV2ZW4gdGhvdWdoIHByb3BlcnRpZXMgYXJlIGRpc2FibGVkIEJWIGlzIHJlZ2lzdGVyZWQuCisgICAgICAgIF90ZXN0KDUwMCwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ZhbGlkYXRpb25EZWZhdWx0RGlzY292ZXJ5RmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgyMDQsIHRydWUsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vVmFsaWRhdGlvbkRlZmF1bHREaXNjb3ZlcnlOb0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoMjA0LCB0cnVlLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WYWxpZGF0aW9uRGlzY292ZXJ5RmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgyMDQsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ZhbGlkYXRpb25EaXNjb3ZlcnlOb0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoMjA0LCB0cnVlLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vVmFsaWRhdGlvbk5vRGlzY292ZXJ5RmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgyMDQsIHRydWUsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vVmFsaWRhdGlvbk5vRGlzY292ZXJ5Tm9GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDIwNCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChmaW5hbCBpbnQgcmVzcG9uc2VTdGF0dXMsIGZpbmFsIEJvb2xlYW4gZGlzYWJsZVZhbGlkYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJvb2xlYW4gZGlzYWJsZUF1dG9EaXNjb3ZlcnksIGZpbmFsIGJvb2xlYW4gcmVnaXN0ZXJGZWF0dXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGUoIi8iKTsKKworICAgICAgICBhc3NlcnRBcHBseShyZXNwb25zZVN0YXR1cywgaW5pdFJlc291cmNlQ29uZmlnKGRpc2FibGVWYWxpZGF0aW9uLCBkaXNhYmxlQXV0b0Rpc2NvdmVyeSwgcmVnaXN0ZXJGZWF0dXJlKSwgdXJpKTsKKworICAgICAgICBpZiAocmVzcG9uc2VTdGF0dXMgPT0gNTAwKSB7CisgICAgICAgICAgICAvLyB2YWxpZGF0aW9uIHdvcmtzIC0gZW52aXJvbm1lbnQgaXMgdmFsaWRhdGlvbiBmcmllbmRseSAtPiBsZXQncyB0cnkgdG8gZGlzYWJsZSBNRVRBLUlORi9zZXJ2aWNlcyBsb29rdXAKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gaW5pdFJlc291cmNlQ29uZmlnKGRpc2FibGVWYWxpZGF0aW9uLCBkaXNhYmxlQXV0b0Rpc2NvdmVyeSwgdHJ1ZSk7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUsIHRydWUpOworCisgICAgICAgICAgICBhc3NlcnRBcHBseSg1MDAsIHJlc291cmNlQ29uZmlnLCB1cmkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbmZpZyBpbml0UmVzb3VyY2VDb25maWcoZmluYWwgQm9vbGVhbiBkaXNhYmxlVmFsaWRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCb29sZWFuIGRpc2FibGVBdXRvRGlzY292ZXJ5LCBmaW5hbCBib29sZWFuIHJlZ2lzdGVyRmVhdHVyZSkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGlmIChyZWdpc3RlckZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFZhbGlkYXRpb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlzYWJsZUF1dG9EaXNjb3ZlcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUsIGRpc2FibGVBdXRvRGlzY292ZXJ5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlzYWJsZVZhbGlkYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5CVl9GRUFUVVJFX0RJU0FCTEUsIGRpc2FibGVWYWxpZGF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEFwcGx5KGludCByZXNwb25zZVN0YXR1cywgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcsIFVSSSB1cmkpCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0Q29udGV4dCA9IG5ldyBDb250YWluZXJSZXF1ZXN0KHVyaSwgdXJpLCAiUE9TVCIsIG51bGwsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KHJlcXVlc3RDb250ZXh0KS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2VTdGF0dXMsIGNvbnRhaW5lclJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkluZmxlY3Rvci5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9WYWxpZGF0aW9uSW5mbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3NzU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkluZmxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUmVhZGVyV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkluZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgU3RyaW5nPiB7CisKKyAgICBATm90TnVsbAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGdldChyZXF1ZXN0Q29udGV4dCk7CisgICAgfQorCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgU3RyaW5nIGdldChATm90TnVsbCBmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IFJlYWRlcldyaXRlci5yZWFkRnJvbUFzU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRFbnRpdHlTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgICAgICByZXR1cm4gZW50aXR5LmlzRW1wdHkoKSA/IG51bGwgOiBlbnRpdHk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiZXJyb3IiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL0Fub3RoZXJDb250YWN0QmVhbi5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL0Fub3RoZXJDb250YWN0QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MWI3OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vQW5vdGhlckNvbnRhY3RCZWFuLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uLnZhbGlkYXRlb25leGVjdXRpb247CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLkV4ZWN1dGFibGVUeXBlOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5WYWxpZGF0ZU9uRXhlY3V0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb24uRXh0ZW5kZWQ7CisKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5FbWFpbDsKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5Ob3RCbGFuazsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgQW5vdGhlckNvbnRhY3RCZWFuIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcGhvbmU7CisKKyAgICBATm90QmxhbmsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgQE5vdE51bGwoZ3JvdXBzID0ge0V4dGVuZGVkLmNsYXNzfSkKKyAgICBwcml2YXRlIFN0cmluZyBjaXR5OworCisgICAgcHVibGljIEFub3RoZXJDb250YWN0QmVhbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQW5vdGhlckNvbnRhY3RCZWFuKGZpbmFsIFN0cmluZyBlbWFpbCwgZmluYWwgU3RyaW5nIHBob25lLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGNpdHkpIHsKKyAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgICAgICB0aGlzLnBob25lID0gcGhvbmU7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7CisgICAgfQorCisgICAgQEVtYWlsKHJlZ2V4cCA9ICJbYS16QS1aMC05Ll8lLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Miw0fSIpCisgICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKyAgICAgICAgcmV0dXJuIGVtYWlsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKGZpbmFsIFN0cmluZyBlbWFpbCkgeworICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgfQorCisgICAgQFBhdHRlcm4ocmVnZXhwID0gIlswLTldezMsOX0iKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIFN0cmluZyBnZXRQaG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIHBob25lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBob25lKGZpbmFsIFN0cmluZyBwaG9uZSkgeworICAgICAgICB0aGlzLnBob25lID0gcGhvbmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBBbm90aGVyQ29udGFjdEJlYW4pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBbm90aGVyQ29udGFjdEJlYW4gdGhhdCA9IChBbm90aGVyQ29udGFjdEJlYW4pIG87CisKKyAgICAgICAgaWYgKGVtYWlsICE9IG51bGwgPyAhZW1haWwuZXF1YWxzKHRoYXQuZW1haWwpIDogdGhhdC5lbWFpbCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCA/ICFuYW1lLmVxdWFscyh0aGF0Lm5hbWUpIDogdGhhdC5uYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGhvbmUgIT0gbnVsbCA/ICFwaG9uZS5lcXVhbHModGhhdC5waG9uZSkgOiB0aGF0LnBob25lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBlbWFpbCAhPSBudWxsID8gZW1haWwuaGFzaENvZGUoKSA6IDA7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHBob25lICE9IG51bGwgPyBwaG9uZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG5hbWUgIT0gbnVsbCA/IG5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiQW5vdGhlckNvbnRhY3RCZWFueyIKKyAgICAgICAgICAgICAgICArICJlbWFpbD0nIiArIGVtYWlsICsgJ1wnJworICAgICAgICAgICAgICAgICsgIiwgcGhvbmU9JyIgKyBwaG9uZSArICdcJycKKyAgICAgICAgICAgICAgICArICIsIG5hbWU9JyIgKyBuYW1lICsgJ1wnJworICAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uQWJzdHJhY3RUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbkFic3RyYWN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZmI2NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbkFic3RyYWN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbi52YWxpZGF0ZW9uZXhlY3V0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuUnVuU2VwYXJhdGVseTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRlT25FeGVjdXRpb25BYnN0cmFjdFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVJbnB1dEZhaWxWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQiLCAxNSwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZFZhbGlkYXRlSW5wdXRQYXNzVmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2giLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVJbnB1dEZhaWxWYWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCIsIDE1LCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZU1pc3MiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVJbnB1dFBhc3NCaWdnZXJWYWxpZGF0ZUV4ZWN1dGFibGVNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZU1pc3MiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZFZhbGlkYXRlSW5wdXRQYXNzVmFsaWRhdGVFeGVjdXRhYmxlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVOb25lIiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZFZhbGlkYXRlSW5wdXRQYXNzQmlnZ2VyVmFsaWRhdGVFeGVjdXRhYmxlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVOb25lIiwgMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZVJlc3VsdFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVSZXN1bHRGYWlsVmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0IiwgLTE1LCA1MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVSZXN1bHRQYXNzVmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2giLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVSZXN1bHRGYWlsVmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2giLCAtMTUsIDUwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZVJlc3VsdFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZU1pc3MiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVSZXN1bHRQYXNzQmlnZ2VyVmFsaWRhdGVFeGVjdXRhYmxlTWlzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzIiwgLTE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVSZXN1bHRQYXNzVmFsaWRhdGVFeGVjdXRhYmxlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVOb25lIiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZFZhbGlkYXRlUmVzdWx0UGFzc0JpZ2dlclZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlTm9uZSIsIC0xNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoImRlZmF1bHQiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlSW5wdXRQYXNzVmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm1hdGNoIiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0RmFpbFZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJtYXRjaCIsIDE1LCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlSW5wdXRQYXNzVmFsaWRhdGVFeGVjdXRhYmxlTWlzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibWlzcyIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVJbnB1dFBhc3NCaWdnZXJWYWxpZGF0ZUV4ZWN1dGFibGVNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJtaXNzIiwgMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJub25lIiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0UGFzc0JpZ2dlclZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm5vbmUiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZVJlc3VsdFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJkZWZhdWx0IiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZVJlc3VsdFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibWF0Y2giLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFJ1blNlcGFyYXRlbHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVSZXN1bHRGYWlsVmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm1hdGNoIiwgLTE1LCA1MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlUmVzdWx0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm1pc3MiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFJ1blNlcGFyYXRlbHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVSZXN1bHRQYXNzQmlnZ2VyVmFsaWRhdGVFeGVjdXRhYmxlTWlzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibWlzcyIsIC0xNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZVJlc3VsdFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJub25lIiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBSdW5TZXBhcmF0ZWx5CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlUmVzdWx0UGFzc0JpZ2dlclZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm5vbmUiLCAtMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRWYWxpZGF0ZVBhc3NEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJtaXhlZC1kZWZhdWx0IiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZFZhbGlkYXRlSW5wdXRGYWlsRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibWl4ZWQtZGVmYXVsdCIsIDE1LCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkVmFsaWRhdGVSZXN1bHRGYWlsRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibWl4ZWQtZGVmYXVsdCIsIC0xNSwgNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZFZhbGlkYXRlUGFzc05vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLW5vbmUiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkVmFsaWRhdGVJbnB1dFBhc3NOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJtaXhlZC1ub25lIiwgMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRWYWxpZGF0ZVJlc3VsdFBhc3NOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJtaXhlZC1ub25lIiwgLTE1LCAyMDApOworICAgIH0KKworICAgIHZvaWQgX3Rlc3RPbk1ldGhvZChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgSW50ZWdlciB2YWx1ZSwgZmluYWwgaW50IHJldHVyblN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJvbi1tZXRob2QvIiArIHBhdGgsIHZhbHVlLCByZXR1cm5TdGF0dXMpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3RPblR5cGUoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIEludGVnZXIgdmFsdWUsIGZpbmFsIGludCByZXR1cm5TdGF0dXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgib24tdHlwZS0iICsgcGF0aCwgdmFsdWUsIHJldHVyblN0YXR1cyk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgSW50ZWdlciB2YWx1ZSwgZmluYWwgaW50IHJldHVyblN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KHBhdGgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS50ZXh0KHZhbHVlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVyblN0YXR1cywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGlmIChyZXR1cm5TdGF0dXMgPT0gMjAwKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSW50ZWdlci5jbGFzcykpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25CYXNpY1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uQmFzaWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwMDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uQmFzaWNUZXN0LmphdmEKQEAgLTAsMCArMSw0NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uLnZhbGlkYXRlb25leGVjdXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW47CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5FeGVjdXRhYmxlVHlwZTsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuVmFsaWRhdGVPbkV4ZWN1dGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuUnVuU2VwYXJhdGVseTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworLy8gQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBWYWxpZGF0ZU9uRXhlY3V0aW9uQmFzaWNUZXN0IGV4dGVuZHMgVmFsaWRhdGVPbkV4ZWN1dGlvbkFic3RyYWN0VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBPbiBNRVRIT0QuCisgICAgICovCisKKyAgICBAUGF0aCgib24tbWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc1Jlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCIpCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2giKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTKQorICAgICAgICBATWluKDApCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkNPTlNUUlVDVE9SUykKKyAgICAgICAgQE1pbigwKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2YWxpZGF0ZUV4ZWN1dGFibGVOb25lIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTm9uZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbiBUWVBFLgorICAgICAqLworCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGUgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLWRlZmF1bHQiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0IGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlIHsKKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1tYXRjaCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1hdGNoIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlIHsKKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1taXNzIikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzcyBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZSB7CisgICAgfQorCisgICAgQFBhdGgoIm9uLXR5cGUtbm9uZSIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNSVhFRC4KKyAgICAgKi8KKworICAgIEBQYXRoKCJtaXhlZC1kZWZhdWx0IikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkRGVmYXVsdCB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQE1pbigwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoQE1heCgxMCkgZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm1peGVkLW5vbmUiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZE5vbmUgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHRVRURVJTLgorICAgICAqLworCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNhbml0eSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2FuaXR5KCkgeworICAgICAgICAgICAgcmV0dXJuICJvayI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZ2V0dGVyLW9uLW1ldGhvZC1kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uTWV0aG9kRGVmYXVsdCBleHRlbmRzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgICAgICBATm90TnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJnZXR0ZXItb24tbWV0aG9kLW1pc3MiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25NZXRob2RNaXNzIGV4dGVuZHMgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWlzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImdldHRlci1vbi1tZXRob2QtbWF0Y2giKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25NZXRob2RNYXRjaCBleHRlbmRzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0ge0V4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUywgRXhlY3V0YWJsZVR5cGUuR0VUVEVSX01FVEhPRFN9KQorICAgICAgICBATm90TnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1hdGNoKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZ2V0dGVyLW9uLXR5cGUtZGVmYXVsdCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uVHlwZURlZmF1bHQgZXh0ZW5kcyBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZ2V0dGVyLW9uLXR5cGUtbWlzcyIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uVHlwZU1pc3MgZXh0ZW5kcyBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNaXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZ2V0dGVyLW9uLXR5cGUtbWF0Y2giKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSB7RXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTLCBFeGVjdXRhYmxlVHlwZS5HRVRURVJfTUVUSE9EU30pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGVPblR5cGVNYXRjaCBleHRlbmRzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBATm90TnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1hdGNoKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCRUFOUy4KKyAgICAgKi8KKworICAgIEBQYXRoKCJnZXR0ZXItb24tYmVhbnMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25CZWFucyB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFZhbGlkCisgICAgICAgIHB1YmxpYyBBbm90aGVyQ29udGFjdEJlYW4gcG9zdChAVmFsaWQgZmluYWwgQW5vdGhlckNvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiBiZWFuOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImludmFsaWRNYWlsIikKKyAgICAgICAgQFZhbGlkCisgICAgICAgIHB1YmxpYyBBbm90aGVyQ29udGFjdEJlYW4gaW52YWxpZE1haWwoQFZhbGlkIGZpbmFsIEFub3RoZXJDb250YWN0QmVhbiBiZWFuKSB7CisgICAgICAgICAgICBiZWFuLnNldEVtYWlsKCJhYiIpOworICAgICAgICAgICAgcmV0dXJuIGJlYW47CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiaW52YWxpZFBob25lIikKKyAgICAgICAgQFZhbGlkCisgICAgICAgIHB1YmxpYyBBbm90aGVyQ29udGFjdEJlYW4gaW52YWxpZFBob25lKEBWYWxpZCBmaW5hbCBBbm90aGVyQ29udGFjdEJlYW4gYmVhbikgeworICAgICAgICAgICAgYmVhbi5zZXRQaG9uZSgiMTIiKTsKKyAgICAgICAgICAgIHJldHVybiBiZWFuOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImdldHRlci1yZXNvdXJjZS1tZXRob2QiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlR2V0dGVyUmVzb3VyY2VNZXRob2QgeworCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ID0gMTsKKworICAgICAgICBAR0VUCisgICAgICAgIEBNYXgoMSkKKyAgICAgICAgcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm9uLXR5cGUtZ2V0dGVyLW51bGwiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoIm5vZ2V0dGVyIikKKyAgICAgICAgQEdFVAorICAgICAgICBATm90TnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRhTnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImdldHRlciIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROdWxsKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlRGVmYXVsdC5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaC5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU5vbmUuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWREZWZhdWx0LmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkTm9uZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGVPbk1ldGhvZERlZmF1bHQuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25NZXRob2RNaXNzLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uTWV0aG9kTWF0Y2guY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25UeXBlRGVmYXVsdC5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGVPblR5cGVNaXNzLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uVHlwZU1hdGNoLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uQmVhbnMuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVHZXR0ZXJSZXNvdXJjZU1ldGhvZC5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5CVl9ESVNBQkxFX1ZBTElEQVRFX09OX0VYRUNVVEFCTEVfT1ZFUlJJREVfQ0hFQ0ssIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlSW5wdXRGYWlsVmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgiZGVmYXVsdCIsIDE1LCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFJ1blNlcGFyYXRlbHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVSZXN1bHRGYWlsVmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgiZGVmYXVsdCIsIC0xNSwgNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0UGFzc0JpZ2dlclZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm1pc3MiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0UGFzc0JpZ2dlclZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm5vbmUiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZEdldHRlckRlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZ2V0dGVyLW9uLW1ldGhvZC1kZWZhdWx0Iik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5wYXRoKCJzYW5pdHkiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RHZXR0ZXJNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi1tZXRob2QtbWlzcyIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJzYW5pdHkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RHZXR0ZXJNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJnZXR0ZXItb24tbWV0aG9kLW1hdGNoIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5wYXRoKCJzYW5pdHkiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlR2V0dGVyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJnZXR0ZXItb24tdHlwZS1kZWZhdWx0Iik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5wYXRoKCJzYW5pdHkiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlR2V0dGVyTWlzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJnZXR0ZXItb24tdHlwZS1taXNzIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInNhbml0eSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0aW9uIHNob3VsZCBmYWlsIHdoZW4gZ2V0dGVyIChhbHNvIGEgcmVzb3VyY2UgbWV0aG9kKSBpcyBpbnZva2VkIGFuZCBub3Qgd2hlbiB0aGUgcmVzb3VyY2UgY2xhc3MgaXMgdmFsaWRhdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldHRlclJlc291cmNlTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1yZXNvdXJjZS1tZXRob2QiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNTAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlR2V0dGVyTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJvbi10eXBlLWdldHRlci1udWxsIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgibm9nZXR0ZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiZ2V0dGVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZUdldHRlck1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi10eXBlLW1hdGNoIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5wYXRoKCJzYW5pdHkiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbnNQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJnZXR0ZXItb24tYmVhbnMiKTsKKyAgICAgICAgZmluYWwgQW5vdGhlckNvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IEFub3RoZXJDb250YWN0QmVhbigiamVyc2V5QGV4YW1wbGUuY29tIiwgbnVsbCwgIkplcnNleSBKQVgtUlMiLCBudWxsKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkueG1sKGNvbnRhY3RCZWFuKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KEFub3RoZXJDb250YWN0QmVhbi5jbGFzcyksIGVxdWFsVG8oY29udGFjdEJlYW4pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuc1ZhbGlkYXRlR2V0dGVySW52YWxpZEVtYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi1iZWFucyIpOworICAgICAgICBmaW5hbCBBbm90aGVyQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQW5vdGhlckNvbnRhY3RCZWFuKCJqZXJzZXkiLCBudWxsLCAiSmVyc2V5IEpBWC1SUyIsIG51bGwpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS54bWwoY29udGFjdEJlYW4pKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5zVmFsaWRhdGVHZXR0ZXJJbnZhbGlkUGhvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZ2V0dGVyLW9uLWJlYW5zIik7CisgICAgICAgIGZpbmFsIEFub3RoZXJDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBBbm90aGVyQ29udGFjdEJlYW4oImplcnNleUBleGFtcGxlLmNvbSIsICIxMiIsICJKZXJzZXkgSkFYLVJTIiwgbnVsbCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LnhtbChjb250YWN0QmVhbikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShBbm90aGVyQ29udGFjdEJlYW4uY2xhc3MpLCBlcXVhbFRvKGNvbnRhY3RCZWFuKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbnNWYWxpZGF0ZUdldHRlckludmFsaWRSZXR1cm5NYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi1iZWFucyIpLnBhdGgoImludmFsaWRNYWlsIik7CisgICAgICAgIGZpbmFsIEFub3RoZXJDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBBbm90aGVyQ29udGFjdEJlYW4oImplcnNleUBleGFtcGxlLmNvbSIsIG51bGwsICJKZXJzZXkgSkFYLVJTIiwgbnVsbCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LnhtbChjb250YWN0QmVhbikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNTAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbnNWYWxpZGF0ZUdldHRlckludmFsaWRSZXR1cm5QaG9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJnZXR0ZXItb24tYmVhbnMiKS5wYXRoKCJpbnZhbGlkUGhvbmUiKTsKKyAgICAgICAgZmluYWwgQW5vdGhlckNvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IEFub3RoZXJDb250YWN0QmVhbigiamVyc2V5QGV4YW1wbGUuY29tIiwgbnVsbCwgIkplcnNleSBKQVgtUlMiLCBudWxsKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkueG1sKGNvbnRhY3RCZWFuKSk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldFBob25lKCIxMiIpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShBbm90aGVyQ29udGFjdEJlYW4uY2xhc3MpLCBlcXVhbFRvKGNvbnRhY3RCZWFuKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25Jbmhlcml0YW5jZUdlbmVyaWNzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25Jbmhlcml0YW5jZUdlbmVyaWNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MmJmZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbkluaGVyaXRhbmNlR2VuZXJpY3NUZXN0LmphdmEKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uLnZhbGlkYXRlb25leGVjdXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWF4OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWluOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5FeGVjdXRhYmxlVHlwZTsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuVmFsaWRhdGVPbkV4ZWN1dGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KKy8vIEBSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgVmFsaWRhdGVPbkV4ZWN1dGlvbkluaGVyaXRhbmNlR2VuZXJpY3NUZXN0IGV4dGVuZHMgVmFsaWRhdGVPbkV4ZWN1dGlvbkFic3RyYWN0VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBPbiBNRVRIT0QuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbnMgZnJvbSB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgY29uc2lkZXJlZCBkdXJpbmcgdmFsaWRhdGluZyBwaGFzZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIiwgIkphdmFEb2MifSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNWYWxpZGF0aW9uPFQgZXh0ZW5kcyBOdW1iZXI+IHsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoQE1heCgxMCkgZmluYWwgVCB2YWx1ZSk7CisKKyAgICAgICAgQE1pbigwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTKQorICAgICAgICBwdWJsaWMgVCB2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaChATWF4KDEwKSBmaW5hbCBUIHZhbHVlKTsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoQE1heCgxMCkgZmluYWwgVCB2YWx1ZSk7CisKKyAgICAgICAgQE1pbigwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICAgICAgcHVibGljIFQgdmFsaWRhdGVFeGVjdXRhYmxlTm9uZShATWF4KDEwKSBmaW5hbCBUIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcm9uZyBnZW5lcmljIHR5cGVzLiB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbnMgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGF0IGFsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIiwgIkphdmFEb2MifSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNDaGFyU2VxdWVuY2VWYWxpZGF0aW9uPFQgZXh0ZW5kcyBDaGFyU2VxdWVuY2U+IHsKKworICAgICAgICBATWluKDEwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBwdWJsaWMgVCB2YWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KEBNYXgoMCkgZmluYWwgVCB2YWx1ZSk7CisKKyAgICAgICAgQE1pbigxMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKEBNYXgoMCkgZmluYWwgVCB2YWx1ZSk7CisKKyAgICAgICAgQE1pbigxMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIFQgdmFsaWRhdGVFeGVjdXRhYmxlTWlzcyhATWF4KDApIGZpbmFsIFQgdmFsdWUpOworCisgICAgICAgIEBNaW4oMTApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoQE1heCgwKSBmaW5hbCBUIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc0pheFJzIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzVmFsaWRhdGlvbjxJbnRlZ2VyPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTKQorICAgICAgICBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICAgICAgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzKGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2YWxpZGF0ZUV4ZWN1dGFibGVOb25lIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICAgICAgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVOb25lKGZpbmFsIEludGVnZXIgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzQWJzdHJhY3RSZXNvdXJjZQorICAgICAgICAgICAgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNKYXhScywgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzQ2hhclNlcXVlbmNlVmFsaWRhdGlvbjxTdHJpbmc+IHsKKworICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaChmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzKGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIm9uLW1ldGhvZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNSZXNvdXJjZSBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc0Fic3RyYWN0UmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTWlzcyhmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVOb25lKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbiBUWVBFLgorICAgICAqLworCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFEb2MiKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZTxUIGV4dGVuZHMgTnVtYmVyPiB7CisKKyAgICAgICAgQE1pbigwKQorICAgICAgICBwdWJsaWMgVCB2YWxpZGF0ZUV4ZWN1dGFibGUoQE1heCgxMCkgZmluYWwgVCB2YWx1ZSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFEb2MiKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU9uVHlwZTxYIGV4dGVuZHMgQ2hhclNlcXVlbmNlPiB7CisKKyAgICAgICAgQE1pbigxMCkKKyAgICAgICAgcHVibGljIFggdmFsaWRhdGVFeGVjdXRhYmxlKEBNYXgoMCkgZmluYWwgWCB2YWx1ZSk7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0IGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlPEludGVnZXI+IHsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU9uVHlwZURlZmF1bHQgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VPblR5cGU8U3RyaW5nPiB7CisKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgU3RyaW5nIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGR1cmluZyB2YWxpZGF0aW5nIHBoYXNlLgorICAgICAqLworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHRBYnN0cmFjdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlRGVmYXVsdCB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLWRlZmF1bHQiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0UmVzb3VyY2UgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0QWJzdHJhY3RSZXNvdXJjZQorICAgICAgICAgICAgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VPblR5cGVEZWZhdWx0IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYW5vdGhlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBkdXJpbmcgdmFsaWRhdGluZyBwaGFzZS4KKyAgICAgKi8KKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1hdGNoIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlPEludGVnZXI+IHsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU9uVHlwZU1hdGNoIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlPFN0cmluZz4geworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSk7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTKQorICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2hBYnN0cmFjdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2ggeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1tYXRjaCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaFJlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2hBYnN0cmFjdFJlc291cmNlCisgICAgICAgICAgICBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU9uVHlwZU1hdGNoIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYW5vdGhlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBkdXJpbmcgdmFsaWRhdGluZyBwaGFzZS4KKyAgICAgKi8KKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3MgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGU8SW50ZWdlcj4geworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlTWlzcyBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU9uVHlwZTxTdHJpbmc+IHsKKworICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBTdHJpbmcgdmFsdWUpOworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzQWJzdHJhY3RSZXNvdXJjZSBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3MgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1taXNzIikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzc1Jlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzc0Fic3RyYWN0UmVzb3VyY2UKKyAgICAgICAgICAgIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlTWlzcyB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImFub3RoZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259IGFubm90YXRpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZHVyaW5nIHZhbGlkYXRpbmcgcGhhc2UuCisgICAgICovCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZSBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZTxJbnRlZ2VyPiB7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VPblR5cGVOb25lIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlPFN0cmluZz4geworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSk7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU5vbmVBYnN0cmFjdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLW5vbmUiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSB7RXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTLCBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFN9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZVJlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZUFic3RyYWN0UmVzb3VyY2UKKyAgICAgICAgICAgIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlTm9uZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImFub3RoZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1JWEVELgorICAgICAqLworCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWREZWZhdWx0PFQgZXh0ZW5kcyBOdW1iZXI+IHsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBUIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VNaXhlZERlZmF1bHQ8VCBleHRlbmRzIENoYXJTZXF1ZW5jZT4geworCisgICAgICAgIEBNaW4oMTApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgICAgICBwdWJsaWMgVCB2YWxpZGF0ZUV4ZWN1dGFibGUoQE1heCgwKSBmaW5hbCBUIHZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgibWl4ZWQtZGVmYXVsdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZERlZmF1bHRSZXNvdXJjZQorICAgICAgICAgICAgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZERlZmF1bHQ8SW50ZWdlcj4sIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU1peGVkRGVmYXVsdDxTdHJpbmc+IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImFub3RoZXIiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWROb25lPFQgZXh0ZW5kcyBOdW1iZXI+IHsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgICAgICBwdWJsaWMgVCB2YWxpZGF0ZUV4ZWN1dGFibGUoQE1heCgxMCkgZmluYWwgVCB2YWx1ZSk7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VNaXhlZE5vbmU8VCBleHRlbmRzIENoYXJTZXF1ZW5jZT4geworCisgICAgICAgIEBNaW4oMTApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDApIGZpbmFsIFQgdmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJtaXhlZC1ub25lIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkTm9uZVJlc291cmNlCisgICAgICAgICAgICBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkTm9uZTxJbnRlZ2VyPiwgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlTWl4ZWROb25lPFN0cmluZz4geworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYW5vdGhlciIpCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2hSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkRGVmYXVsdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkTm9uZVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX0RJU0FCTEVfVkFMSURBVEVfT05fRVhFQ1VUQUJMRV9PVkVSUklERV9DSEVDSywgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJkZWZhdWx0IiwgMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVSZXN1bHRQYXNzTm9WYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJkZWZhdWx0IiwgLTE1LCAyMDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uSW5oZXJpdGFuY2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbkluaGVyaXRhbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDZhNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbkluaGVyaXRhbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbi52YWxpZGF0ZW9uZXhlY3V0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1heDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1pbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuRXhlY3V0YWJsZVR5cGU7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLlZhbGlkYXRlT25FeGVjdXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworLy8gQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBWYWxpZGF0ZU9uRXhlY3V0aW9uSW5oZXJpdGFuY2VUZXN0IGV4dGVuZHMgVmFsaWRhdGVPbkV4ZWN1dGlvbkFic3RyYWN0VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBPbiBNRVRIT0QuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbnMgZnJvbSB0aGlzIGludGVyZmFjZSBzaG91bGQgYmUgY29uc2lkZXJlZCBkdXJpbmcgdmFsaWRhdGluZyBwaGFzZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIiwgIkphdmFEb2MifSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNWYWxpZGF0aW9uIHsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoQE1heCgxMCkgZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQE1pbigwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaChATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoQE1heCgxMCkgZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQE1pbigwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTm9uZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc0pheFJzIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzVmFsaWRhdGlvbiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTKQorICAgICAgICBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICAgICAgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzKGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2YWxpZGF0ZUV4ZWN1dGFibGVOb25lIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICAgICAgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVOb25lKGZpbmFsIEludGVnZXIgdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzQWJzdHJhY3RSZXNvdXJjZSBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc0pheFJzIHsKKworICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaChmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzKGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIm9uLW1ldGhvZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNSZXNvdXJjZSBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc0Fic3RyYWN0UmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTWlzcyhmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVOb25lKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9uIFRZUEUuCisgICAgICovCisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YURvYyIpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBATWluKDApCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHQgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGUgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259IGFubm90YXRpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZHVyaW5nIHZhbGlkYXRpbmcgcGhhc2UuCisgICAgICovCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTKQorICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlRGVmYXVsdEFic3RyYWN0UmVzb3VyY2UgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0IHsKKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm9uLXR5cGUtZGVmYXVsdCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkNPTlNUUlVDVE9SUykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHRSZXNvdXJjZSBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHRBYnN0cmFjdFJlc291cmNlIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGR1cmluZyB2YWxpZGF0aW5nIHBoYXNlLgorICAgICAqLworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2ggZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGUgeworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1hdGNoQWJzdHJhY3RSZXNvdXJjZSBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1hdGNoIHsKKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm9uLXR5cGUtbWF0Y2giKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2hSZXNvdXJjZSBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1hdGNoQWJzdHJhY3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBkdXJpbmcgdmFsaWRhdGluZyBwaGFzZS4KKyAgICAgKi8KKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3MgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGUgeworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzQWJzdHJhY3RSZXNvdXJjZSBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3MgeworCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1taXNzIikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzc1Jlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzc0Fic3RyYWN0UmVzb3VyY2UgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259IGFubm90YXRpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZHVyaW5nIHZhbGlkYXRpbmcgcGhhc2UuCisgICAgICovCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZSBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZSB7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU5vbmVBYnN0cmFjdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZSB7CisKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLW5vbmUiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSB7RXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTLCBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFN9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZVJlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZUFic3RyYWN0UmVzb3VyY2UgeworICAgIH0KKworICAgIC8qKgorICAgICAqIE1JWEVELgorICAgICAqLworCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWREZWZhdWx0IHsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgibWl4ZWQtZGVmYXVsdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZERlZmF1bHRSZXNvdXJjZSBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkRGVmYXVsdCB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkNPTlNUUlVDVE9SUykKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWROb25lIHsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoQE1heCgxMCkgZmluYWwgSW50ZWdlciB2YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIm1peGVkLW5vbmUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWROb25lUmVzb3VyY2UgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZE5vbmUgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkQ2xhc3NEZWZhdWx0IHsKKworICAgICAgICBATWluKDApCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgibWl4ZWQtY2xhc3MtZGVmYXVsdCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZENsYXNzRGVmYXVsdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWRDbGFzc0RlZmF1bHQgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZENsYXNzTm9uZSB7CisKKyAgICAgICAgQE1pbigwKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoQE1heCgxMCkgZmluYWwgSW50ZWdlciB2YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIm1peGVkLWNsYXNzLW5vbmUiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZENsYXNzTm9uZVJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWRDbGFzc05vbmUgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc1Jlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU5vbmVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2hSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWREZWZhdWx0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWROb25lUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWRDbGFzc05vbmVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZENsYXNzRGVmYXVsdFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX0RJU0FCTEVfVkFMSURBVEVfT05fRVhFQ1VUQUJMRV9PVkVSUklERV9DSEVDSywgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJkZWZhdWx0IiwgMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVSZXN1bHRQYXNzTm9WYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJkZWZhdWx0IiwgLTE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkQ2xhc3NWYWxpZGF0ZVBhc3NEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJtaXhlZC1jbGFzcy1kZWZhdWx0IiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZENsYXNzVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLWNsYXNzLWRlZmF1bHQiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZENsYXNzVmFsaWRhdGVSZXN1bHRQYXNzTm9WYWxpZGF0ZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLWNsYXNzLWRlZmF1bHQiLCAtMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRDbGFzc1ZhbGlkYXRlUGFzc05vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLWNsYXNzLW5vbmUiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkQ2xhc3NWYWxpZGF0ZUlucHV0UGFzc05vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLWNsYXNzLW5vbmUiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZENsYXNzVmFsaWRhdGVSZXN1bHRQYXNzTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibWl4ZWQtY2xhc3Mtbm9uZSIsIC0xNSwgMjAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbk92ZXJyaWRlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25PdmVycmlkZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzU0YzQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25PdmVycmlkZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb24udmFsaWRhdGVvbmV4ZWN1dGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5FeGVjdXRhYmxlVHlwZTsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuVmFsaWRhdGVPbkV4ZWN1dGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3Rpbmcgd2hldGhlciBhbiB7QGxpbmsgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9ufSBpcyByYWlzZWQgd2hlbiB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gaXMgcHJlc2VudCBvbgorICogb3ZlcnJpZGluZy9pbXBsZW1lbnRpbmcgbWV0aG9kIGFzIHdlbGwuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0ZU9uRXhlY3V0aW9uT3ZlcnJpZGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0aW9uIHsKKworICAgICAgICBATm90TnVsbAorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgICAgICBwdWJsaWMgU3RyaW5nIGludGVyZmFjZU1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRpb25CYXNlIHsKKworICAgICAgICBATm90TnVsbAorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGNsYXNzTWVzc2FnZSgpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRpb25SZXNvdXJjZSBleHRlbmRzIFZhbGlkYXRpb25CYXNlIGltcGxlbWVudHMgVmFsaWRhdGlvbiB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiaW50ZXJmYWNlIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGludGVyZmFjZU1lc3NhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gImtvIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNsYXNzIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNsYXNzTWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAia28iOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuV0FSTklORy5pbnRWYWx1ZSgpKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFZhbGlkYXRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGluZ0NoZWNrT25JbnRlcmZhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImludGVyZmFjZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRpbmdDaGVja09uQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImNsYXNzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQocGF0aCkucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBlcXVhbFRvKDUwMCkpOworCisgICAgICAgIGZpbmFsIExpc3Q8TG9nUmVjb3JkPiBsb2dnZWRSZWNvcmRzID0gZ2V0TG9nZ2VkUmVjb3JkcygpOworICAgICAgICBhc3NlcnRUaGF0KGxvZ2dlZFJlY29yZHMuc2l6ZSgpLCBlcXVhbFRvKDEpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChsb2dnZWRSZWNvcmRzLmdldCgwKS5nZXRUaHJvd24oKSwgaW5zdGFuY2VPZihWYWxpZGF0aW9uRXhjZXB0aW9uLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9PdmVycmlkZVdhZGxSZXNvdXJjZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvT3ZlcnJpZGVXYWRsUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzODI2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvT3ZlcnJpZGVXYWRsUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLndhZGw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIE92ZXJyaWRlV2FkbFJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgLy8gVGhlIGV4cGxpY2l0IEBQcm9kdWNlcyBkZWZpbml0aW9uIGltcHJvdmVzIHRoZSBjb21wYXRpYmlsaXR5IG9mIHRoZSB0ZXN0IGNhc2Ugd2l0aCBvdGhlciBjb25uZWN0b3JzLgorICAgIC8vIFVubGlrZSBIdHRwVXJsQ29ubmVjdG9yLCBvdGhlcnMgbWlnaHQgbm90IGJlIHNlbmRpbmcgZGVmYXVsdCBhY2NlcHRlZCBtZWRpYSB0eXBlcyAoKG5hbWVseSB0aGUgSmRrQ29ubmVjdG9yKQorICAgIC8vIGFuZCB0aGUgcmVzb3VyY2Ugd291bGQgbm90IGJlIG1hdGNoZWQuCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBAUGF0aCgiYXBwbGljYXRpb24ud2FkbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPdmVycmlkZVdhZGxBcHBsaWNhdGlvblJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiT1ZFUlJJREUiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhPdmVycmlkZVdhZGxBcHBsaWNhdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiL2FwcGxpY2F0aW9uLndhZGwiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIk9WRVJSSURFIiwgdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9SZXNvdXJjZUV4dGVuZGVkRmxhZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvUmVzb3VyY2VFeHRlbmRlZEZsYWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhNTkxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvUmVzb3VyY2VFeHRlbmRlZEZsYWdUZXN0LmphdmEKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci53YWRsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlNheEhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlNpbXBsZU5hbWVzcGFjZVJlc29sdmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkV4dGVuZGVkUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCB2ZXJpZmllcyBmdW5jdGlvbmFsaXR5IG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UjaXNFeHRlbmRlZCgpfSBhbmQgaXRzCisgKiBpbmZsdWVuY2Ugb24gV0FETC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUV4dGVuZGVkRmxhZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcywgQWxsRXh0ZW5kZWQuY2xhc3MsIExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiYWxsLWV4dGVuZGVkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsbEV4dGVuZGVkIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBFeHRlbmRlZFJlc291cmNlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYWxsRXh0ZW5kZWRHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBARXh0ZW5kZWRSZXNvdXJjZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGFsbEV4dGVuZGVkU3ViR2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJzdWItZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsb2NhdG9yIikKKyAgICAgICAgQEV4dGVuZGVkUmVzb3VyY2UKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlTG9jYXRvciBhbGxFeHRlbmRlZFN1YkxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlTG9jYXRvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZUxvY2F0b3IgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBFeHRlbmRlZFJlc291cmNlQ29udGV4dCBleHRlbmRlZFJlc291cmNlQ29udGV4dDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzb3VyY2VHZXQoKSB7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvciA9IHZhbGlkYXRlTW9kZWwoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnJvciA9PSBudWxsID8gIm9rIiA6IGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZXh0ZW5kZWQiKQorICAgICAgICBARXh0ZW5kZWRSZXNvdXJjZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc291cmNlRXh0ZW5kZWRHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImV4dGVuZGVkIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBFeHRlbmRlZFJlc291cmNlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzb3VyY2VFeHRlbmRlZFBvc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gImV4dGVuZGVkcG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidmlzaWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzb3VyY2VWaXNpYmxlUG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAidmlzaWJsZXBvc3QiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVNb2RlbCgpIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGV4dGVuZGVkTWV0aG9kcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGV4dGVuZGVkTWV0aG9kcy5wdXQoInJlc291cmNlRXh0ZW5kZWRHZXQiLCBmYWxzZSk7CisgICAgICAgICAgICBleHRlbmRlZE1ldGhvZHMucHV0KCJyZXNvdXJjZUV4dGVuZGVkUG9zdCIsIGZhbHNlKTsKKyAgICAgICAgICAgIGV4dGVuZGVkTWV0aG9kcy5wdXQoImFsbEV4dGVuZGVkR2V0IiwgZmFsc2UpOworICAgICAgICAgICAgZXh0ZW5kZWRNZXRob2RzLnB1dCgiYWxsRXh0ZW5kZWRTdWJHZXQiLCBmYWxzZSk7CisgICAgICAgICAgICBleHRlbmRlZE1ldGhvZHMucHV0KCJhbGxFeHRlbmRlZFN1YkxvY2F0b3IiLCBmYWxzZSk7CisKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IHZpc2libGVNZXRob2RzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgdmlzaWJsZU1ldGhvZHMucHV0KCJyZXNvdXJjZVZpc2libGVQb3N0IiwgZmFsc2UpOworICAgICAgICAgICAgdmlzaWJsZU1ldGhvZHMucHV0KCJyZXNvdXJjZUdldCIsIGZhbHNlKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsID0gZXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQuZ2V0UmVzb3VyY2VNb2RlbCgpOworICAgICAgICAgICAgZm9yIChSZXNvdXJjZSByb290UmVzb3VyY2UgOiByZXNvdXJjZU1vZGVsLmdldFJvb3RSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvciA9IGNoZWNrUmVzb3VyY2Uocm9vdFJlc291cmNlLCBleHRlbmRlZE1ldGhvZHMsIHZpc2libGVNZXRob2RzLCAiIik7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb29sZWFuPiBlbnRyeSA6IGV4dGVuZGVkTWV0aG9kcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCAmJiAhZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkV4dGVuZGVkIG1ldGhvZCAiICsgZW50cnkuZ2V0S2V5KCkgKyAiIHdhcyBub3QgZm91bmQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb29sZWFuPiBlbnRyeSA6IHZpc2libGVNZXRob2RzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsICYmICFlbnRyeS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiVmlzaWJsZSBtZXRob2QgIiArIGVudHJ5LmdldEtleSgpICsgIiB3YXMgbm90IGZvdW5kIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNoZWNrUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGV4dGVuZGVkTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBCb29sZWFuPiB2aXNpYmxlTWV0aG9kcywgU3RyaW5nIHByZWZpeCkgeworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJlZml4ICsgIlIgZXh0ZW5kZWQ9IiArIHJlc291cmNlLmlzRXh0ZW5kZWQoKSArICIgcmVzb3VyY2U6ICIgKyByZXNvdXJjZSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gYWxsRXh0ZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHJlc291cmNlLmdldEFsbE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIGlmICgiT1BUSU9OUyIuZXF1YWxzKHJlc291cmNlTWV0aG9kLmdldEh0dHBNZXRob2QoKSkgJiYgIXJlc291cmNlTWV0aG9kLmlzRXh0ZW5kZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk9QVElPTlMgbWV0aG9kICIgKyByZXNvdXJjZU1ldGhvZCArICIgaXMgbm90IGV4dGVuZGVkIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFyZXNvdXJjZU1ldGhvZC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsRXh0ZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSA9IHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChleHRlbmRlZE1ldGhvZHMuZ2V0KG1ldGhvZE5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRNZXRob2RzLnB1dChtZXRob2ROYW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvdXJjZU1ldGhvZC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWV0aG9kICIgKyBtZXRob2ROYW1lICsgIiBzaG91bGQgYmUgZXh0ZW5kZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlTWV0aG9kcy5nZXQobWV0aG9kTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB2aXNpYmxlTWV0aG9kcy5wdXQobWV0aG9kTmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWV0aG9kICIgKyBtZXRob2ROYW1lICsgIiBzaG91bGQgTk9UIGJlIGV4dGVuZGVkLiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHByZWZpeCArICIgICBNIGV4dGVuZGVkPSIgKyByZXNvdXJjZU1ldGhvZC5pc0V4dGVuZGVkKCkgKyAiIG1ldGhvZDogIiArIG1ldGhvZE5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKFJlc291cmNlIGNoaWxkIDogcmVzb3VyY2UuZ2V0Q2hpbGRSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvciA9IGNoZWNrUmVzb3VyY2UoY2hpbGQsIGV4dGVuZGVkTWV0aG9kcywgdmlzaWJsZU1ldGhvZHMsICIgICAgICIpOworICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhbGxFeHRlbmRlZCAhPSByZXNvdXJjZS5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlJlc291cmNlICIgKyByZXNvdXJjZSArICJSZXNvdXJjZS5leHRlbmRlZCA9ICIgKyByZXNvdXJjZS5pc0V4dGVuZGVkKCkgKyAiIGFuZCBhbGxFeHRlbmRlZD0iCisgICAgICAgICAgICAgICAgICAgICAgICArIGFsbEV4dGVuZGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHJlc291cmNlIG1ldGhvZCB3aGljaCBnb2VzIHRyb3VnaCB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsfQorICAgICAqIGFuZCBjaGVja3Mgd2hldGhlciB7QGNvZGUgZXh0ZW5kZWR9IGZsYWcgaXMgY29ycmVjdGx5IGRlZmluZWQgb24gcmVzb3VyY2VzIGFuZCBtZXRob2RzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTW9kZWwoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvayIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZnVsbCB3YWRsIHdpdGggYWxsICJleHRlbmRlZCIgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0YWlsZWRXYWRsKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBTQVhFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2FwcGxpY2F0aW9uLndhZGwiKS5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEZpbGUgdG1wRmlsZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoRmlsZS5jbGFzcyk7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgRG9jdW1lbnQgZCA9IGIucGFyc2UodG1wRmlsZSk7CisgICAgICAgIHByaW50U291cmNlKG5ldyBET01Tb3VyY2UoZCkpOworICAgICAgICBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworCisgICAgICAgIC8vIGNoZWNrIGJhc2UgVVJJCisgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXMvQGJhc2UiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIGNoZWNrIHRvdGFsIG51bWJlciBvZiByZXNvdXJjZXMgaXMgOAorICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiOCIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nYWxsLWV4dGVuZGVkJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSdyZXNvdXJjZSddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nYXBwbGljYXRpb24ud2FkbCddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisKKyAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoImplcnNleSIsICJodHRwOi8vamVyc2V5LmphdmEubmV0LyIpKTsKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vamVyc2V5OmV4dGVuZGVkKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMzEiLCB2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGxpbWl0ZWQgd2FkbCB3aXRoIG9ubHkgdXNlciByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpbWl0ZWRXYWRsKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBTQVhFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2FwcGxpY2F0aW9uLndhZGwiKS5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBGaWxlIHRtcEZpbGUgPSByZXNwb25zZS5yZWFkRW50aXR5KEZpbGUuY2xhc3MpOworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgIGlmICghU2F4SGVscGVyLmlzWGRrRG9jdW1lbnRCdWlsZGVyRmFjdG9yeShiZikpIHsKKyAgICAgICAgICAgIGJmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIERvY3VtZW50QnVpbGRlciBiID0gYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIERvY3VtZW50IGQgPSBiLnBhcnNlKHRtcEZpbGUpOworICAgICAgICBwcmludFNvdXJjZShuZXcgRE9NU291cmNlKGQpKTsKKyAgICAgICAgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKworICAgICAgICAvLyBjaGVjayBiYXNlIFVSSQorICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi93YWRsOmFwcGxpY2F0aW9uL3dhZGw6cmVzb3VyY2VzL0BiYXNlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICAvLyBjaGVjayB0b3RhbCBudW1iZXIgb2YgcmVzb3VyY2VzIGlzIDgKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCB2YWwpOworCisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J2FsbC1leHRlbmRlZCddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMCIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ncmVzb3VyY2UnXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworCisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J2FwcGxpY2F0aW9uLndhZGwnXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAiLCB2YWwpOworCisgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJqZXJzZXkiLCAiaHR0cDovL2plcnNleS5qYXZhLm5ldC8iKSk7CisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL2plcnNleTpleHRlbmRlZCkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAiLCB2YWwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFNvdXJjZShTb3VyY2Ugc291cmNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICAgICAgUHJvcGVydGllcyBvcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgb3Byb3BzLnB1dChPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7CisgICAgICAgICAgICBvcHJvcHMucHV0KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7CisgICAgICAgICAgICBvcHJvcHMucHV0KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7CisgICAgICAgICAgICB0cmFucy5zZXRPdXRwdXRQcm9wZXJ0aWVzKG9wcm9wcyk7CisgICAgICAgICAgICB0cmFucy50cmFuc2Zvcm0oc291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KFN5c3RlbS5vdXQpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvV2FkbEJlYW5QYXJhbVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvV2FkbEJlYW5QYXJhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmRmODdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9XYWRsQmVhblBhcmFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIud2FkbDsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuQ29va2llUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5TaW1wbGVOYW1lc3BhY2VSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkRpZmY7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkVsZW1lbnROYW1lQW5kVGV4dFF1YWxpZmllcjsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuU2ltcGxlTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MQXNzZXJ0OworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgV0FETCBmb3IgYSB7QGxpbmsgQmVhblBhcmFtfSBhbm5vdGF0ZWQgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciBpcyBnZW5lcmF0ZWQgcHJvcGVybHkuCisgKiA8cC8+CisgKiBUaGUgdGVzdHMgb2YgdGhpcyBjbGFzcyBwZXJmb3JtIGEgY29tcGFyaXNvbiBvZgorICogPHByZT48dWw+CisgKiAgICAgPGxpPmEgV0FETCBvZiBhIHJlZmVyZW5jZSByZXNvdXJjZSB0aGF0IGhhcyB7QGNvZGUgKlBhcmFtfSBhbm5vdGF0ZWQgY2xhc3MgZmllbGRzIG9yIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXJzPC9saT4KKyAqICAgICA8bGk+d2l0aCBhIHJlc291cmNlIGNvbmZpZ3VyZWQgd2l0aCB7QGxpbmsgQmVhblBhcmFtfSBhbm5vdGF0ZWQgcGFyYW1ldGVycyB3aGVyZSBzb21lIG9mIHRoZSByZWZlcmVuY2UgcmVzb3VyY2UgcGFyYW1ldGVycworICogICAgICAgICAgYXJlIGFnZ3JlZ2F0ZWQgaW4gdGhlIGNsYXNzIHRoYXQgaXMgdXNlZCBhcyBhIGJlYW4gcGFyYW08L2xpPgorICogPC91bD48L3ByZT4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBXYWRsQmVhblBhcmFtVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBFbGVtZW50TmFtZUFuZFRleHRRdWFsaWZpZXIgZWxlbWVudFF1YWxpZmllciA9IG5ldyBFbGVtZW50TmFtZUFuZFRleHRRdWFsaWZpZXIoKSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciB7QGNvZGUgPHBhcmFtID8/PyAvPn0gbm9kZXMsIHRoZSBjb21wYXJpc29uIGlzIGJhc2VkIG9uIG1hdGNoaW5nIHtAY29kZSBuYW1lfSBhdHRyaWJ1dGVzIHdoaWxlIGlnbm9yaW5nCisgICAgICAgICAqIHRoZWlyIG9yZGVyLiBGb3IgYW55IG90aGVyIG5vZGVzLCBzdHJpY3QgY29tcGFyaXNvbiAoaW5jbHVkaW5nIG9yZGVyaW5nKSBpcyBtYWRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udHJvbCBUaGUgcmVmZXJlbmNlIGVsZW1lbnQgdG8gY29tcGFyZSB0aGUge0Bjb2RlIHRlc3R9IHdpdGguCisgICAgICAgICAqIEBwYXJhbSB0ZXN0IFRoZSB0ZXN0IGVsZW1lbnQgdG8gY29tcGFyZSBhZ2FpbnN0IHtAY29kZSBjb250cm9sfS4KKyAgICAgICAgICogQHJldHVybiBXaGV0aGVyIGdpdmVuIG5vZGVzIHF1YWxpZnkgZm9yIGNvbXBhcmlzb24uCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcXVhbGlmeUZvckNvbXBhcmlzb24oZmluYWwgRWxlbWVudCBjb250cm9sLCBmaW5hbCBFbGVtZW50IHRlc3QpIHsKKyAgICAgICAgICAgIGlmICh0ZXN0ICE9IG51bGwgJiYgISJwYXJhbSIuZXF1YWxzKHRlc3QuZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucXVhbGlmeUZvckNvbXBhcmlzb24oY29udHJvbCwgdGVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShjb250cm9sICE9IG51bGwgJiYgdGVzdCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVxdWFsc05hbWVzcGFjZShjb250cm9sLCB0ZXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXROb25OYW1lc3BhY2VkTm9kZU5hbWUoY29udHJvbCkuZXF1YWxzKGdldE5vbk5hbWVzcGFjZWROb2RlTmFtZSh0ZXN0KSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbnRyb2wuaGFzQXR0cmlidXRlKCJuYW1lIikgJiYgdGVzdC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSkgeworICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmdldEF0dHJpYnV0ZSgibmFtZSIpLmVxdWFscyh0ZXN0LmdldEF0dHJpYnV0ZSgibmFtZSIpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZWZlcmVuY2VSZXNvdXJjZUJlYW5QYXJhbS5jbGFzcywgVGVzdFJlc291cmNlQmVhblBhcmFtLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RSZXNvdXJjZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuUGFyYW0uY2xhc3MsIFRlc3RSZXNvdXJjZUZpZWxkQmVhblBhcmFtLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBub2RlQXNTdHJpbmcoZmluYWwgT2JqZWN0IHJlc291cmNlTm9kZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZSgoTm9kZSkgcmVzb3VyY2VOb2RlKSwgbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpKTsKKyAgICAgICAgcmV0dXJuIHdyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgY2xhc3Mgd2l0aCB7QGNvZGUgKlBhcmFtfSBhbm5vdGF0ZWQgZmllbGRzIGlmIHVzZWQgYXMgYSB7QGNvZGUgQmVhblBhcmFtfSBhbm5vdGF0ZWQgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlcgorICAgICAqIHJlc3VsdHMgaW4gYSBjb3JyZWN0bHkgZ2VuZXJhdGVkIFdBREwuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJbiBjYXNlIG9mIGFueSBwcm9ibGVtLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5QYXJhbUZ1bGxCZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RCZWFuUGFyYW1Db25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbigid2FkbEJlYW5QYXJhbVRlc3QiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIGNsYXNzIHdpdGgge0Bjb2RlICpQYXJhbX0gYW5ub3RhdGVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgaWYgdXNlZCBhcyBhIHtAY29kZSBCZWFuUGFyYW19IGFubm90YXRlZCByZXNvdXJjZQorICAgICAqIG1ldGhvZCBwYXJhbWV0ZXIgcmVzdWx0cyBpbiBhIGNvcnJlY3RseSBnZW5lcmF0ZWQgV0FETC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIEluIGNhc2Ugb2YgYW55IHByb2JsZW0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhblBhcmFtQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEJlYW5QYXJhbUNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuKCJ3YWRsQmVhblBhcmFtQ29uc3RydWN0b3JJbml0aWFsaXplZFRlc3QiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIGNsYXNzIHdpdGgge0Bjb2RlICpQYXJhbX0gYW5ub3RhdGVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMgaWYgdXNlZCBhcyBhIHtAY29kZSBCZWFuUGFyYW19IGFubm90YXRlZCByZXNvdXJjZQorICAgICAqIGNsYXNzIGZpZWxkIHBhcmFtZXRlciByZXN1bHRzIGluIGEgY29ycmVjdGx5IGdlbmVyYXRlZCBXQURMLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSW4gY2FzZSBvZiBhbnkgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuUGFyYW1GaWVsZEJlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEJlYW5QYXJhbUNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuKCJ3YWRsQmVhblBhcmFtRmllbGRUZXN0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RCZWFuUGFyYW1Db25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbihTdHJpbmcgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2FwcGxpY2F0aW9uLndhZGwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBXYWRsUmVzb3VyY2VUZXN0LmV4dHJhY3RXYWRsQXNEb2N1bWVudChyZXNwb25zZSk7CisgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgZmluYWwgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIgbnNDb250ZXh0ID0gbmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIik7CisgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobnNDb250ZXh0KTsKKworICAgICAgICBmaW5hbCBEaWZmIGRpZmYgPSBYTUxVbml0LmNvbXBhcmVYTUwoCisgICAgICAgICAgICAgICAgbm9kZUFzU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2FkbEJlYW5QYXJhbVJlZmVyZW5jZSddL3dhZGw6cmVzb3VyY2UiLCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aENvbnN0YW50cy5OT0RFKSksCisgICAgICAgICAgICAgICAgbm9kZUFzU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nIiArIHJlc291cmNlICsgIiddL3dhZGw6cmVzb3VyY2UiLCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aENvbnN0YW50cy5OT0RFKSkKKyAgICAgICAgKTsKKyAgICAgICAgWE1MVW5pdC5zZXRYcGF0aE5hbWVzcGFjZUNvbnRleHQoCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZU5hbWVzcGFjZUNvbnRleHQoSW1tdXRhYmxlTWFwLm9mKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpKTsKKyAgICAgICAgZGlmZi5vdmVycmlkZUVsZW1lbnRRdWFsaWZpZXIoZWxlbWVudFF1YWxpZmllcik7CisgICAgICAgIFhNTEFzc2VydC5hc3NlcnRYTUxFcXVhbChkaWZmLCB0cnVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgid2FkbEJlYW5QYXJhbVJlZmVyZW5jZSIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVmZXJlbmNlUmVzb3VyY2VCZWFuUGFyYW0geworCisgICAgICAgIEBRdWVyeVBhcmFtKCJjbGFzc0ZpZWxkUXVlcnlQYXJhbSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzRmllbGRRdWVyeVBhcmFtOworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBmb2xsb3dpbmcgZmllbGRzIG1ha2UgdGhpcyBjbGFzcyBjb21wYXRpYmxlIHdpdGggJ0Z1bGxCZWFuJywgLy8KKyAgICAgICAgLy8gJ0NvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuJyBhbmQgJ1NtYWxsQmVhbicgICAgICAgICAgICAgICAgIC8vCisgICAgICAgIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyUGFyYW07CisKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBtYXRyaXhQYXJhbTsKKworICAgICAgICBARW5jb2RlZAorICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBxdWVyeVBhcmFtOworCisgICAgICAgIEBDb29raWVQYXJhbSgiY29va2llIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29va2llOworCisgICAgICAgIEBGb3JtUGFyYW0oImZvcm0iKQorICAgICAgICBwcml2YXRlIFN0cmluZyBmb3JtUGFyYW07CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInNpbmdsZUJlYW4ve3BhdGh9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0QmVhblBhcmFtKC8qIHBhdGhQYXJhbSBpcyBhbHNvIGV4dHJhY3RlZCBmcm9tIEZ1bGxCZWFuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikgU3RyaW5nIHBhdGhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJtZXRob2RQYXJhbSIpIGludCBtZXRob2RQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgU3RyaW5nIGR1cGxpY2F0ZUhlYWRlclBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQYXRoKCJ3YWRsQmVhblBhcmFtVGVzdCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlQmVhblBhcmFtIHsKKworICAgICAgICBAUXVlcnlQYXJhbSgiY2xhc3NGaWVsZFF1ZXJ5UGFyYW0iKQorICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc0ZpZWxkUXVlcnlQYXJhbTsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic2luZ2xlQmVhbi97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCZWFuUGFyYW0oQEJlYW5QYXJhbSBXYWRsRnVsbEJlYW4gYmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBCZWFuUGFyYW0gV2FkbFNtYWxsQmVhbiB3YWRsU21hbGxCZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oIm1ldGhvZFBhcmFtIikgaW50IG1ldGhvZFBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQYXRoKCJ3YWRsQmVhblBhcmFtQ29uc3RydWN0b3JJbml0aWFsaXplZFRlc3QiKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZUNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuUGFyYW0geworCisgICAgICAgIEBRdWVyeVBhcmFtKCJjbGFzc0ZpZWxkUXVlcnlQYXJhbSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzRmllbGRRdWVyeVBhcmFtOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzaW5nbGVCZWFuL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEJlYW5QYXJhbShAQmVhblBhcmFtIFdhZGxDb25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbiBiZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJlYW5QYXJhbSBXYWRsU21hbGxCZWFuIHdhZGxTbWFsbEJlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgibWV0aG9kUGFyYW0iKSBpbnQgbWV0aG9kUGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoIndhZGxCZWFuUGFyYW1GaWVsZFRlc3QiKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZUZpZWxkQmVhblBhcmFtIHsKKworICAgICAgICBAUXVlcnlQYXJhbSgiY2xhc3NGaWVsZFF1ZXJ5UGFyYW0iKQorICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc0ZpZWxkUXVlcnlQYXJhbTsKKworICAgICAgICBAQmVhblBhcmFtCisgICAgICAgIHByaXZhdGUgV2FkbENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuIGJlYW47CisKKyAgICAgICAgQEJlYW5QYXJhbQorICAgICAgICBwcml2YXRlIFdhZGxTbWFsbEJlYW4gd2FkbFNtYWxsQmVhbjsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic2luZ2xlQmVhbi97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCZWFuUGFyYW0oQFF1ZXJ5UGFyYW0oIm1ldGhvZFBhcmFtIikgaW50IG1ldGhvZFBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgdW5rbm93biBhbm5vdGF0aW9uIGlzIHRvIHZlcmlmeSB0aGF0IGEgdXNhZ2Ugb2YgYW4gdW5rbm93biBhbm5vdGF0aW9uIGluIGEge0BsaW5rIEJlYW5QYXJhbX0gYW5ub3RhdGVkCisgICAgICogY2xhc3MgZG9lcyBub3QgY2F1c2UgYSBmYWlsdXJlIGR1cmluZyBXQURMIGdlbmVyYXRpb24uCisgICAgICovCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuUEFSQU1FVEVSLCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLkZJRUxEfSkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBEb2N1bWVudGVkCisgICAgQGludGVyZmFjZSBXYWRsVW5rbm93bkFubm90YXRpb24geworCisgICAgICAgIFN0cmluZyB2YWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbFNtYWxsQmVhbiB7CisKKyAgICAgICAgQEhlYWRlclBhcmFtKCJoZWFkZXIiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJQYXJhbTsKKworICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFBhcmFtOworCisgICAgICAgIHB1YmxpYyBXYWRsU21hbGxCZWFuKFdhZGxGdWxsQmVhbiBiZWFuKSB7CisgICAgICAgICAgICBoZWFkZXJQYXJhbSA9IGJlYW4uZ2V0SGVhZGVyUGFyYW0oKTsKKyAgICAgICAgICAgIHBhdGhQYXJhbSA9IGJlYW4uZ2V0UGF0aFBhcmFtKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGxFbmNvZGVkQmVhbiB7CisKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBtYXRyaXhQYXJhbTsKKworICAgICAgICBARW5jb2RlZAorICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBxdWVyeVBhcmFtOworCisgICAgICAgIHB1YmxpYyBXYWRsRW5jb2RlZEJlYW4oU3RyaW5nIG1hdHJpeFBhcmFtLCBTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5tYXRyaXhQYXJhbSA9IG1hdHJpeFBhcmFtOworICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsRnVsbEJlYW4geworCisgICAgICAgIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyUGFyYW07CisKKyAgICAgICAgQFBhdGhQYXJhbSgicGF0aCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGhQYXJhbTsKKworICAgICAgICBATWF0cml4UGFyYW0oIm1hdHJpeCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1hdHJpeFBhcmFtOworCisgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5UGFyYW07CisKKyAgICAgICAgQENvb2tpZVBhcmFtKCJjb29raWUiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBjb29raWU7CisKKyAgICAgICAgQEZvcm1QYXJhbSgiZm9ybSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZvcm1QYXJhbTsKKworICAgICAgICBAV2FkbFVua25vd25Bbm5vdGF0aW9uKCJ1bmtub3duIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdW5rbm93bkFubm90YXRpb25QYXJhbTsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIFJlcXVlc3QgcmVxdWVzdDsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGVSZXF1ZXN0TnVsbDsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb29raWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb29raWUoU3RyaW5nIGNvb2tpZSkgeworICAgICAgICAgICAgdGhpcy5jb29raWUgPSBjb29raWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1QYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmb3JtUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JtUGFyYW0oU3RyaW5nIGZvcm1QYXJhbSkgeworICAgICAgICAgICAgdGhpcy5mb3JtUGFyYW0gPSBmb3JtUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlclBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIGhlYWRlclBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyUGFyYW0oU3RyaW5nIGhlYWRlclBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLmhlYWRlclBhcmFtID0gaGVhZGVyUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1hdHJpeFBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hdHJpeFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWF0cml4UGFyYW0oU3RyaW5nIG1hdHJpeFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoUGFyYW0oU3RyaW5nIHBhdGhQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5wYXRoUGFyYW0gPSBwYXRoUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5UGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5UGFyYW0oU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGVSZXF1ZXN0TnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZVJlcXVlc3ROdWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T3ZlcnJpZGVSZXF1ZXN0TnVsbChib29sZWFuIG92ZXJyaWRlUmVxdWVzdE51bGwpIHsKKyAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVSZXF1ZXN0TnVsbCA9IG92ZXJyaWRlUmVxdWVzdE51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVua25vd25Bbm5vdGF0aW9uUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gdW5rbm93bkFubm90YXRpb25QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVua25vd25Bbm5vdGF0aW9uUGFyYW0oU3RyaW5nIHVua25vd25Bbm5vdGF0aW9uUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMudW5rbm93bkFubm90YXRpb25QYXJhbSA9IHVua25vd25Bbm5vdGF0aW9uUGFyYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGxDb25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbiB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyUGFyYW07CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGhQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWF0cml4UGFyYW07CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5UGFyYW07CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvb2tpZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybVBhcmFtOworICAgICAgICBwcml2YXRlIFN0cmluZyB1bmtub3duQW5ub3RhdGlvblBhcmFtOworICAgICAgICBwcml2YXRlIFJlcXVlc3QgcmVxdWVzdDsKKworICAgICAgICBwdWJsaWMgV2FkbENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuKEBDb29raWVQYXJhbSgiY29va2llIikgU3RyaW5nIGNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJmb3JtIikgU3RyaW5nIGZvcm1QYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImhlYWRlciIpIFN0cmluZyBoZWFkZXJQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oIm1hdHJpeCIpIFN0cmluZyBtYXRyaXhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKSBTdHJpbmcgcXVlcnlQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikgU3RyaW5nIHBhdGhQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAV2FkbFVua25vd25Bbm5vdGF0aW9uKCJ1bmtub3duIikgU3RyaW5nIHVua25vd25Bbm5vdGF0aW9uUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICB0aGlzLmNvb2tpZSA9IGNvb2tpZTsKKyAgICAgICAgICAgIHRoaXMuZm9ybVBhcmFtID0gZm9ybVBhcmFtOworICAgICAgICAgICAgdGhpcy5oZWFkZXJQYXJhbSA9IGhlYWRlclBhcmFtOworICAgICAgICAgICAgdGhpcy5tYXRyaXhQYXJhbSA9IG1hdHJpeFBhcmFtOworICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICAgICAgICAgIHRoaXMucGF0aFBhcmFtID0gcGF0aFBhcmFtOworICAgICAgICAgICAgdGhpcy51bmtub3duQW5ub3RhdGlvblBhcmFtID0gdW5rbm93bkFubm90YXRpb25QYXJhbTsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGVSZXF1ZXN0TnVsbDsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb29raWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb29raWUoU3RyaW5nIGNvb2tpZSkgeworICAgICAgICAgICAgdGhpcy5jb29raWUgPSBjb29raWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1QYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmb3JtUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JtUGFyYW0oU3RyaW5nIGZvcm1QYXJhbSkgeworICAgICAgICAgICAgdGhpcy5mb3JtUGFyYW0gPSBmb3JtUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlclBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIGhlYWRlclBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyUGFyYW0oU3RyaW5nIGhlYWRlclBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLmhlYWRlclBhcmFtID0gaGVhZGVyUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1hdHJpeFBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hdHJpeFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWF0cml4UGFyYW0oU3RyaW5nIG1hdHJpeFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoUGFyYW0oU3RyaW5nIHBhdGhQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5wYXRoUGFyYW0gPSBwYXRoUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5UGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5UGFyYW0oU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGVSZXF1ZXN0TnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZVJlcXVlc3ROdWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T3ZlcnJpZGVSZXF1ZXN0TnVsbChib29sZWFuIG92ZXJyaWRlUmVxdWVzdE51bGwpIHsKKyAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVSZXF1ZXN0TnVsbCA9IG92ZXJyaWRlUmVxdWVzdE51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVua25vd25Bbm5vdGF0aW9uUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gdW5rbm93bkFubm90YXRpb25QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVua25vd25Bbm5vdGF0aW9uUGFyYW0oU3RyaW5nIHVua25vd25Bbm5vdGF0aW9uUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMudW5rbm93bkFubm90YXRpb25QYXJhbSA9IHVua25vd25Bbm5vdGF0aW9uUGFyYW07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci93YWRsL1dhZGxFbXB0eU1lZGlhVHlwZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvV2FkbEVtcHR5TWVkaWFUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWMyMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci93YWRsL1dhZGxFbXB0eU1lZGlhVHlwZVRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIud2FkbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzLCB0aGF0IEplcnNleSByZXR1cm5zIHdpbGRjYXJkIG1lZGlhVHlwZSBpbiBjYXNlIG5vIHJlc3BvbnNlIHJlcHJlc2VudGF0aW9uIHdhcyBzcGVjaWZpZWQuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgV2FkbEVtcHR5TWVkaWFUeXBlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbEVtcHR5TWVkaWFUeXBlVGVzdFJlc291cmNlIHsKKyAgICAgICAgQFBhdGgoImdldEVtcHR5IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuICJObyBAUHJvZHVjZXMgYW5ub3RhdGlvbiI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZ2V0VGV4dCIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuICJQcm9kdWNlcyB0ZXh0L3BsYWluIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoV2FkbEVtcHR5TWVkaWFUeXBlVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZSgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpOworICAgICAgICBTdHJpbmcgd2FkbCA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcih3YWRsKSk7CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKGlzKTsKKworICAgICAgICBYUGF0aCB4cGF0aCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgIFN0cmluZyB2YWwgPSB4cGF0aC5ldmFsdWF0ZSgiLy9tZXRob2RbQGlkPSdnZXRFbXB0eSddL3Jlc3BvbnNlL3JlcHJlc2VudGF0aW9uL0BtZWRpYVR5cGUiLCBkb2N1bWVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiKi8qIiwgdmFsKTsKKworICAgICAgICB2YWwgPSB4cGF0aC5ldmFsdWF0ZSgiLy9tZXRob2RbQGlkPSdnZXRUZXh0J10vcmVzcG9uc2UvcmVwcmVzZW50YXRpb24vQG1lZGlhVHlwZSIsIGRvY3VtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgdmFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci93YWRsL1dhZGxSZXNvdXJjZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvV2FkbFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMjExNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci93YWRsL1dhZGxSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci53YWRsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkluaGVyaXRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTWFwUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuU2F4SGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmNvbmZpZy5XYWRsR2VuZXJhdG9yQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmNvbmZpZy5XYWRsR2VuZXJhdG9yRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuV2FkbEdlbmVyYXRvckltcGw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuV2FkbFV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkRpZmY7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LkVsZW1lbnRRdWFsaWZpZXI7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlNpbXBsZU5hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTEFzc2VydDsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuZXhhbXBsZXMuUmVjdXJzaXZlRWxlbWVudE5hbWVBbmRUZXh0UXVhbGlmaWVyOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworCitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLk1ldGhvZDsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUGFyYW07CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlcXVlc3Q7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZXM7CisKKy8qKgorICogV0FETCB1c2UgY2FzZSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmMgSGFkbGV5CisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoeworICAgICAgICBXYWRsUmVzb3VyY2VUZXN0LldhZGwxVGVzdC5jbGFzcywKKyAgICAgICAgV2FkbFJlc291cmNlVGVzdC5XYWRsMlRlc3QuY2xhc3MsCisgICAgICAgIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDNUZXN0LmNsYXNzLAorICAgICAgICBXYWRsUmVzb3VyY2VUZXN0LldhZGw0VGVzdC5jbGFzcywKKyAgICAgICAgV2FkbFJlc291cmNlVGVzdC5XYWRsNVRlc3QuY2xhc3MsCisgICAgICAgIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDZUZXN0LmNsYXNzLAorICAgICAgICBXYWRsUmVzb3VyY2VUZXN0LldhZGw3VGVzdC5jbGFzcywKKyAgICAgICAgV2FkbFJlc291cmNlVGVzdC5XYWRsOFRlc3QuY2xhc3MsCisgICAgICAgIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDlUZXN0LmNsYXNzLAorICAgICAgICBXYWRsUmVzb3VyY2VUZXN0LldhZGwxMFRlc3QuY2xhc3MsCisgICAgICAgIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDExVGVzdC5jbGFzcywKK30pCitwdWJsaWMgY2xhc3MgV2FkbFJlc291cmNlVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0cyBXQURMIGFzIHtAbGluayBEb2N1bWVudH0gZnJvbSBnaXZlbiB7QGxpbmsgUmVzcG9uc2V9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXNwb25zZSB0byBleHRyYWN0IHtAY29kZSBEb2N1bWVudH0gZnJvbS4KKyAgICAgKiBAcmV0dXJuIFRoZSBleHRyYWN0ZWQge0Bjb2RlIERvY3VtZW50fS4KKyAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gSW4gY2FzZSBvZiBwYXJzZXIgY29uZmlndXJhdGlvbiBpc3N1ZXMuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgcGFyc2luZyBpc3N1ZXMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgSU8gZXJyb3IuCisgICAgICovCisgICAgc3RhdGljIERvY3VtZW50IGV4dHJhY3RXYWRsQXNEb2N1bWVudChmaW5hbCBSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBGaWxlIHRtcEZpbGUgPSByZXNwb25zZS5yZWFkRW50aXR5KEZpbGUuY2xhc3MpOworICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgIGlmICghU2F4SGVscGVyLmlzWGRrRG9jdW1lbnRCdWlsZGVyRmFjdG9yeShiZikpIHsKKyAgICAgICAgICAgIGJmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlciBiID0gYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBiLnBhcnNlKHRtcEZpbGUpOworICAgICAgICBXYWRsNVRlc3QucHJpbnRTb3VyY2UobmV3IERPTVNvdXJjZShkKSk7CisgICAgICAgIHJldHVybiBkOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBub2RlQXNTdHJpbmcoZmluYWwgT2JqZWN0IHJlc291cmNlTm9kZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZSgoTm9kZSkgcmVzb3VyY2VOb2RlKSwgbmV3IFN0cmVhbVJlc3VsdCh3cml0ZXIpKTsKKyAgICAgICAgcmV0dXJuIHdyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbDdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSb290UmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJvb3QiKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSb290UmVzb3VyY2UgeworCisgICAgICAgICAgICBAUGF0aCgie3RlbXBsYXRlfSIpCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZ2V0cm9vdCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFRlbXBsYXRlSW5TdWJSZXNvdXJjZU1ldGhvZCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicm9vdC9mb28iKS5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5vcHRpb25zKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFRlbXBsYXRlSW5TdWJSZXNvdXJjZU1ldGhvZDIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJvb3QiKS5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5vcHRpb25zKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGw1VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhXaWRnZXRzUmVzb3VyY2UuY2xhc3MsIEV4dHJhUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImZvbyIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXh0cmFSZXNvdXJjZSB7CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIndpZGdldHMiKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdpZGdldHNSZXNvdXJjZSB7CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFdpZGdldHMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBQT1NUCisgICAgICAgICAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi94bWwifSkKKyAgICAgICAgICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVdpZGdldChmaW5hbCBTdHJpbmcgYmFyLCBATWF0cml4UGFyYW0oInRlc3QiKSBmaW5hbCBTdHJpbmcgdGVzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBiYXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBQVVQKKyAgICAgICAgICAgIEBQYXRoKCJ7aWR9IikKKyAgICAgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVdpZGdldChmaW5hbCBTdHJpbmcgYmFyLCBAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIGludCBpZCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBAUGF0aCgie2lkfSIpCisgICAgICAgICAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiJ9KQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRXaWRnZXQoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBpbnQgaWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQERFTEVURQorICAgICAgICAgICAgQFBhdGgoIntpZH0iKQorICAgICAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlV2lkZ2V0KEBQYXRoUGFyYW0oImlkIikgZmluYWwgaW50IGlkKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBQYXRoKCJ7aWR9L3ZlcmJvc2UiKQorICAgICAgICAgICAgcHVibGljIEV4dHJhUmVzb3VyY2UgZ2V0VmVyYm9zZShAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIGludCBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXh0cmFSZXNvdXJjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVXYWRsKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoV2lkZ2V0c1Jlc291cmNlLmNsYXNzLCBFeHRyYVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuV0FETF9GRUFUVVJFX0RJU0FCTEUsIHRydWUpOworCisgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyk7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KG5ldyBDb250YWluZXJSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKCIvIiksIFVSSS5jcmVhdGUoIi9hcHBsaWNhdGlvbi53YWRsIiksCisgICAgICAgICAgICAgICAgICAgICJHRVQiLCBudWxsLCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpKS5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgY29udGFpbmVyUmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZVdhZGwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhXaWRnZXRzUmVzb3VyY2UuY2xhc3MsIEV4dHJhUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRSwgZmFsc2UpOworCisgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyk7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KG5ldyBDb250YWluZXJSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKCIvIiksIFVSSS5jcmVhdGUoIi9hcHBsaWNhdGlvbi53YWRsIiksCisgICAgICAgICAgICAgICAgICAgICJHRVQiLCBudWxsLCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpKS5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgY29udGFpbmVyUmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50U291cmNlKGZpbmFsIFNvdXJjZSBzb3VyY2UpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBUcmFuc2Zvcm1lciB0cmFucyA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBvcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIG9wcm9wcy5wdXQoT3V0cHV0S2V5cy5PTUlUX1hNTF9ERUNMQVJBVElPTiwgInllcyIpOworICAgICAgICAgICAgICAgIG9wcm9wcy5wdXQoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKKyAgICAgICAgICAgICAgICBvcHJvcHMucHV0KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7CisgICAgICAgICAgICAgICAgdHJhbnMuc2V0T3V0cHV0UHJvcGVydGllcyhvcHJvcHMpOworICAgICAgICAgICAgICAgIHRyYW5zLnRyYW5zZm9ybShzb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0WG1sU2NoZW1hTmFtZXNwYWNlUHJlZml4KGZpbmFsIE5vZGUgZWxlbWVudE5vZGUpIHsKKyAgICAgICAgICAgIGZpbmFsIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudE5vZGUuZ2V0QXR0cmlidXRlcygpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIE5vZGUgaXRlbSA9IGF0dHJpYnV0ZXMuaXRlbShpKTsKKyAgICAgICAgICAgICAgICBpZiAoWE1MQ29uc3RhbnRzLlczQ19YTUxfU0NIRU1BX05TX1VSSS5lcXVhbHMoaXRlbS5nZXROb2RlVmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gInhzIjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IFdBREwgZ2VuZXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiB1bmV4cGVjdGVkIHRlc3QgZmFpbHVyZS4KKyAgICAgICAgICovCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXYWRsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBGaWxlIHRtcEZpbGUgPSB0YXJnZXQoImFwcGxpY2F0aW9uLndhZGwiKS5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KEZpbGUuY2xhc3MpOworCisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICBiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgICAgIGlmICghU2F4SGVscGVyLmlzWGRrRG9jdW1lbnRCdWlsZGVyRmFjdG9yeShiZikpIHsKKyAgICAgICAgICAgICAgICBiZi5zZXRYSW5jbHVkZUF3YXJlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlciBiID0gYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudCBkID0gYi5wYXJzZSh0bXBGaWxlKTsKKyAgICAgICAgICAgIHByaW50U291cmNlKG5ldyBET01Tb3VyY2UoZCkpOworICAgICAgICAgICAgZmluYWwgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisgICAgICAgICAgICAvLyBjaGVjayBiYXNlIFVSSQorICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBjaGVjayB0b3RhbCBudW1iZXIgb2YgcmVzb3VyY2VzIGlzIDQKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2UpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiNiIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBvbmx5IG9uY2UgcmVzb3VyY2Ugd2l0aCBmb3Ige2lkfQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfSddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgb25seSBvbmNlIHJlc291cmNlIHdpdGggZm9yIHtpZH0vdmVyYm9zZQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfS92ZXJib3NlJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBvbmx5IG9uY2UgcmVzb3VyY2Ugd2l0aCBmb3Igd2lkZ2V0cworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cyddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgMyBtZXRob2RzIGZvciB7aWR9CisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10vd2FkbDptZXRob2QpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiNiIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayAyIG1ldGhvZHMgZm9yIHdpZGdldHMKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMnXS93YWRsOm1ldGhvZCkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI1IiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIDEgbWF0cml4IHBhcmFtIG9uIHJlc291cmNlCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd3aWRnZXRzJ10vd2FkbDpwYXJhbVtAbmFtZT0ndGVzdCddKSIsIGQsCisgICAgICAgICAgICAgICAgICAgIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgdHlwZSBvZiB7aWR9IGlzIGludAorICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IGdldFhtbFNjaGVtYU5hbWVzcGFjZVByZWZpeCgKKyAgICAgICAgICAgICAgICAgICAgKE5vZGUpIHhwLmV2YWx1YXRlKCIvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3tpZH0nXS93YWRsOnBhcmFtW0BuYW1lPSdpZCddIiwgZCwgWFBhdGhDb25zdGFudHMuTk9ERSkpOworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfSddL3dhZGw6cGFyYW1bQG5hbWU9J2lkJ10vQHR5cGUiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgKHByZWZpeCA9PSBudWxsID8gIiIgOiBwcmVmaXggKyAiOiIpICsgImludCIpOworICAgICAgICAgICAgLy8gY2hlY2sgbnVtYmVyIG9mIG91dHB1dCByZXByZXNlbnRhdGlvbnMgaXMgdHdvCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd3aWRnZXRzJ10vd2FkbDptZXRob2RbQG5hbWU9J0dFVCddL3dhZGw6cmVzcG9uc2Uvd2FkbCIKKyAgICAgICAgICAgICAgICAgICAgKyAiOnJlcHJlc2VudGF0aW9uKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgbnVtYmVyIG9mIG91dHB1dCByZXByZXNlbnRhdGlvbnMgaXMgb25lCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd3aWRnZXRzJ10vd2FkbDptZXRob2RbQG5hbWU9J1BPU1QnXS93YWRsOnJlcXVlc3Qvd2FkbCIKKyAgICAgICAgICAgICAgICAgICAgKyAiOnJlcHJlc2VudGF0aW9uKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgdHlwZSBvZiB7aWR9L3ZlcmJvc2UgaXMgaW50CisgICAgICAgICAgICBwcmVmaXggPSBnZXRYbWxTY2hlbWFOYW1lc3BhY2VQcmVmaXgoCisgICAgICAgICAgICAgICAgICAgIChOb2RlKSB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9L3ZlcmJvc2UnXS93YWRsOnBhcmFtW0BuYW1lPSdpZCddIiwgZCwgWFBhdGhDb25zdGFudHMuTk9ERSkpOworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfS92ZXJib3NlJ10vd2FkbDpwYXJhbVtAbmFtZT0naWQnXS9AdHlwZSIsIGQsCisgICAgICAgICAgICAgICAgICAgIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCAocHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IikgKyAiaW50Iik7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TGFzdE1vZGlmaWVkR0VUKCkgeworICAgICAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiL2FwcGxpY2F0aW9uLndhZGwiKTsKKworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IHRhcmdldC5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlcnMoKS5jb250YWluc0tleSgiTGFzdC1tb2RpZmllZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RMYXN0TW9kaWZpZWRPUFRJT05TKCkgeworICAgICAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiL3dpZGdldHMvMy92ZXJib3NlIik7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSB0YXJnZXQucXVlcnlQYXJhbShXYWRsVXRpbHMuREVUQUlMRURfV0FETF9RVUVSWV9QQVJBTSwgInRydWUiKS5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKQorICAgICAgICAgICAgICAgICAgICAub3B0aW9ucygpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoci5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoIkxhc3QtbW9kaWZpZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uc1Jlc291cmNlV2FkbCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyB0ZXN0IFdpZGdldHNSZXNvdXJjZQorICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi93aWRnZXRzIikucXVlcnlQYXJhbShXYWRsVXRpbHMuREVUQUlMRURfV0FETF9RVUVSWV9QQVJBTSwgInRydWUiKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkub3B0aW9ucygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgRmlsZSB0bXBGaWxlID0gcmVzcG9uc2UucmVhZEVudGl0eShGaWxlLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIGJmLnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworICAgICAgICAgICAgICAgIGJmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIERvY3VtZW50IGQgPSBiLnBhcnNlKHRtcEZpbGUpOworICAgICAgICAgICAgcHJpbnRTb3VyY2UobmV3IERPTVNvdXJjZShkKSk7CisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgYmFzZSBVUkkKKyAgICAgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXMvQGJhc2UiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gY2hlY2sgdG90YWwgbnVtYmVyIG9mIHJlc291cmNlcyBpcyAzIChubyBFeHRyYVJlc291cmNlIGRldGFpbHMgaW5jbHVkZWQpCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgb25seSBvbmNlIHJlc291cmNlIHdpdGggZm9yIHtpZH0KKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3tpZH0nXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIG9ubHkgb25jZSByZXNvdXJjZSB3aXRoIGZvciB7aWR9L3ZlcmJvc2UKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3tpZH0vdmVyYm9zZSddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgb25seSBvbmNlIHJlc291cmNlIHdpdGggZm9yIHdpZGdldHMKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMnXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIDMgbWV0aG9kcyBmb3Ige2lkfQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfSddL3dhZGw6bWV0aG9kKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjYiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgMiBtZXRob2RzIGZvciB3aWRnZXRzCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd3aWRnZXRzJ10vd2FkbDptZXRob2QpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiNSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayB0eXBlIG9mIHtpZH0gaXMgaW50CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gZ2V0WG1sU2NoZW1hTmFtZXNwYWNlUHJlZml4KAorICAgICAgICAgICAgICAgICAgICAoTm9kZSkgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfSddL3dhZGw6cGFyYW1bQG5hbWU9J2lkJ10iLCBkLCBYUGF0aENvbnN0YW50cy5OT0RFKSk7CisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10vd2FkbDpwYXJhbVtAbmFtZT0naWQnXS9AdHlwZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCAocHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IikgKyAiaW50Iik7CisgICAgICAgICAgICAvLyBjaGVjayBudW1iZXIgb2Ygb3V0cHV0IHJlcHJlc2VudGF0aW9ucyBpcyB0d28KKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMnXS93YWRsOm1ldGhvZFtAbmFtZT0nR0VUJ10vd2FkbDpyZXNwb25zZS93YWRsIgorICAgICAgICAgICAgICAgICAgICArICI6cmVwcmVzZW50YXRpb24pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBudW1iZXIgb2Ygb3V0cHV0IHJlcHJlc2VudGF0aW9ucyBpcyBvbmUKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMnXS93YWRsOm1ldGhvZFtAbmFtZT0nUE9TVCddL3dhZGw6cmVxdWVzdC93YWRsIgorICAgICAgICAgICAgICAgICAgICArICI6cmVwcmVzZW50YXRpb24pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisKKyAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCIvZm9vIikucXVlcnlQYXJhbShXYWRsVXRpbHMuREVUQUlMRURfV0FETF9RVUVSWV9QQVJBTSwgInRydWUiKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkub3B0aW9ucygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgdG1wRmlsZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoRmlsZS5jbGFzcyk7CisgICAgICAgICAgICBiID0gYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgICAgICBkID0gYi5wYXJzZSh0bXBGaWxlKTsKKyAgICAgICAgICAgIHByaW50U291cmNlKG5ldyBET01Tb3VyY2UoZCkpOworICAgICAgICAgICAgLy8gY2hlY2sgYmFzZSBVUkkKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBjaGVjayB0b3RhbCBudW1iZXIgb2YgcmVzb3VyY2VzIGlzIDEgKG5vIEV4dHJhUmVzb3VyY2UgZGV0YWlscyBpbmNsdWRlZCkKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2UpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBvbmx5IG9uY2UgcmVzb3VyY2Ugd2l0aCBwYXRoIGZvbworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nZm9vJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayAxIG1ldGhvZHMgZm9yIGZvbworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nZm9vJ10vd2FkbDptZXRob2QpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiNCIsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uc0xvY2F0b3JXYWRsKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8gdGVzdCBXaWRnZXRzUmVzb3VyY2UKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgdG1wRmlsZSA9IHRhcmdldCgiL3dpZGdldHMvMy92ZXJib3NlIikucXVlcnlQYXJhbShXYWRsVXRpbHMuREVUQUlMRURfV0FETF9RVUVSWV9QQVJBTSwgInRydWUiKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkub3B0aW9ucyhGaWxlLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIGJmLnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworICAgICAgICAgICAgICAgIGJmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBiLnBhcnNlKHRtcEZpbGUpOworICAgICAgICAgICAgcHJpbnRTb3VyY2UobmV3IERPTVNvdXJjZShkKSk7CisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIGJhc2UgVVJJCisgICAgICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi93YWRsOmFwcGxpY2F0aW9uL3dhZGw6cmVzb3VyY2VzL0BiYXNlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIGdldEJhc2VVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIHRvdGFsIG51bWJlciBvZiByZXNvdXJjZXMgaXMgMSAobm8gRXh0cmFSZXNvdXJjZSBkZXRhaWxzIGluY2x1ZGVkKQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgIjEiKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIG9ubHkgb25jZSByZXNvdXJjZSB3aXRoIHBhdGgKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMvMy92ZXJib3NlJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsICIxIik7CisgICAgICAgICAgICAvLyBjaGVjayAxIG1ldGhvZHMKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMvMy92ZXJib3NlJ10vd2FkbDptZXRob2QpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiNCIsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uc1N1YlJlc291cmNlV2FkbCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyB0ZXN0IFdpZGdldHNSZXNvdXJjZQorICAgICAgICAgICAgZmluYWwgRmlsZSB0bXBGaWxlID0gdGFyZ2V0KCIvd2lkZ2V0cy8zIikucXVlcnlQYXJhbShXYWRsVXRpbHMuREVUQUlMRURfV0FETF9RVUVSWV9QQVJBTSwgInRydWUiKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkub3B0aW9ucyhGaWxlLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIGJmLnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworICAgICAgICAgICAgICAgIGJmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBiLnBhcnNlKHRtcEZpbGUpOworICAgICAgICAgICAgcHJpbnRTb3VyY2UobmV3IERPTVNvdXJjZShkKSk7CisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXMvQGJhc2UiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gY2hlY2sgdG90YWwgbnVtYmVyIG9mIHJlc291cmNlcyBpcyAxCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgb25seSBvbmUgcmVzb3VyY2Ugd2l0aCBmb3Ige2lkfQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cy8zJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayAzIG1ldGhvZHMKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMvMyddL3dhZGw6bWV0aG9kKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjYiLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVdhZGxHZW5lcmF0b3JDb25maWcgZXh0ZW5kcyBXYWRsR2VuZXJhdG9yQ29uZmlnIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb24+IGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9yKE15V2FkbEdlbmVyYXRvci5jbGFzcykuZGVzY3JpcHRpb25zKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlXYWRsR2VuZXJhdG9yIGV4dGVuZHMgV2FkbEdlbmVyYXRvckltcGwgeworCisgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX1JFU09VUkNFU19CQVNFX1VSSSA9ICJodHRwOi8vbXlCYXNlVXJpIjsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNvdXJjZXMgY3JlYXRlUmVzb3VyY2VzKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzID0gc3VwZXIuY3JlYXRlUmVzb3VyY2VzKCk7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5zZXRCYXNlKENVU1RPTV9SRVNPVVJDRVNfQkFTRV9VUkkpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0V2FkbEdlbmVyYXRvckRlbGVnYXRlKGZpbmFsIFdhZGxHZW5lcmF0b3IgZGVsZWdhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IG92ZXJyaWRpbmcgV0FETCdzIC9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvQGJhc2UgYXR0cmlidXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHVuZXhwZWN0ZWQgdGVzdCBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVdhZGxSZXNvdXJjZXNCYXNlVXJpKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhXaWRnZXRzUmVzb3VyY2UuY2xhc3MsIEV4dHJhUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5XQURMX0dFTkVSQVRPUl9DT05GSUcsIE15V2FkbEdlbmVyYXRvckNvbmZpZy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyk7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KG5ldyBDb250YWluZXJSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKCIvIiksIFVSSS5jcmVhdGUoIi9hcHBsaWNhdGlvbi53YWRsIiksCisgICAgICAgICAgICAgICAgICAgICJHRVQiLCBudWxsLCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpKS5nZXQoKTsKKworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgICAgICBpZiAoIVNheEhlbHBlci5pc1hka0RvY3VtZW50QnVpbGRlckZhY3RvcnkoYmYpKSB7CisgICAgICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgYiA9IGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworCisgICAgICAgICAgICAoKEJ5dGVBcnJheUlucHV0U3RyZWFtKSBjb250YWluZXJSZXNwb25zZS5nZXRFbnRpdHkoKSkucmVzZXQoKTsKKworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGIucGFyc2UoKElucHV0U3RyZWFtKSBjb250YWluZXJSZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgICAgICBwcmludFNvdXJjZShuZXcgRE9NU291cmNlKGQpKTsKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworICAgICAgICAgICAgLy8gY2hlY2sgYmFzZSBVUkkKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXMvQGJhc2UiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgTXlXYWRsR2VuZXJhdG9yQ29uZmlnLk15V2FkbEdlbmVyYXRvci5DVVNUT01fUkVTT1VSQ0VTX0JBU0VfVVJJKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJlbXB0eXByb2R1Y2VzIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eVByb2R1Y2VzVGVzdFJlc291cmNlIHsKKworICAgICAgICAgICAgQFBVVAorICAgICAgICAgICAgQFByb2R1Y2VzKHt9KQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIHB1dChmaW5hbCBTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQFBPU1QKKyAgICAgICAgICAgIEBQYXRoKCIvc3ViIikKKyAgICAgICAgICAgIEBQcm9kdWNlcyh7fSkKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0KGZpbmFsIFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5UHJvZHVjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKEVtcHR5UHJvZHVjZXNUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRSwgZmFsc2UpOworCisgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyk7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KG5ldyBDb250YWluZXJSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKCIvIiksIFVSSS5jcmVhdGUoIi9hcHBsaWNhdGlvbi53YWRsIiksCisgICAgICAgICAgICAgICAgICAgICJHRVQiLCBudWxsLCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpKS5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgY29udGFpbmVyUmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICAoKEJ5dGVBcnJheUlucHV0U3RyZWFtKSBjb250YWluZXJSZXNwb25zZS5nZXRFbnRpdHkoKSkucmVzZXQoKTsKKworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgICAgICBpZiAoIVNheEhlbHBlci5pc1hka0RvY3VtZW50QnVpbGRlckZhY3RvcnkoYmYpKSB7CisgICAgICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgYiA9IGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGIucGFyc2UoKElucHV0U3RyZWFtKSBjb250YWluZXJSZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgICAgICBwcmludFNvdXJjZShuZXcgRE9NU291cmNlKGQpKTsKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworCisgICAgICAgICAgICBmaW5hbCBOb2RlTGlzdCByZXNwb25zZUVsZW1lbnRzID0gKE5vZGVMaXN0KSB4cC5ldmFsdWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgIi93YWRsOmFwcGxpY2F0aW9uL3dhZGw6cmVzb3VyY2VzW0BwYXRoIT0nYXBwbGljYXRpb24ud2FkbCddLy93YWRsOm1ldGhvZC93YWRsOnJlc3BvbnNlIiwgZCwKKyAgICAgICAgICAgICAgICAgICAgWFBhdGhDb25zdGFudHMuTk9ERVNFVCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzcG9uc2VFbGVtZW50cy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTm9kZSBpdGVtID0gcmVzcG9uc2VFbGVtZW50cy5pdGVtKGkpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGl0ZW0uZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaXRlbS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsMVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJyb290IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290UmVzb3VyY2UgeworCisgICAgICAgICAgICBAUGF0aCgibG9jIikKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U3ViKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQFBhdGgoInN3aXRjaCIpCisgICAgICAgICAgICBAUE9TVAorICAgICAgICAgICAgcHVibGljIHZvaWQgc3dpdGNoTWV0aG9kKEBDb250ZXh0IGZpbmFsIFdhZGxBcHBsaWNhdGlvbkNvbnRleHQgd2FkbEFwcGxpY2F0aW9uQ29udGV4dCkgeworICAgICAgICAgICAgICAgIHdhZGxBcHBsaWNhdGlvbkNvbnRleHQuc2V0V2FkbEdlbmVyYXRpb25FbmFibGVkKCF3YWRsQXBwbGljYXRpb25Db250ZXh0LmlzV2FkbEdlbmVyYXRpb25FbmFibGVkKCkpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICAgICAgQFBhdGgoImxvYyIpCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFN1YigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGhlbGxvKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQgISI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgaGVsbG9TdWIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCAhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmUoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF90ZXN0UmVjdXJzaXZlV2FkbCgicm9vdC9sb2MiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIG15dGVzdCgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyb290L3Rlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmUyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfdGVzdFJlY3Vyc2l2ZVdhZGwoInJvb3QvbG9jL2xvYyIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UmVjdXJzaXZlV2FkbChmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBleHRyYWN0V2FkbEFzRG9jdW1lbnQodGFyZ2V0KHBhdGgpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLm9wdGlvbnMoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIG9ubHkgb25lIHJlc291cmNlIHdpdGggZm9yICdyb290L2xvYycKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9JyIgKyBwYXRoICsgIiddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCAiMSIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGwyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UxLmNsYXNzLCBSb290UmVzb3VyY2UyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJyb290MSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdFJlc291cmNlMSB7CisKKyAgICAgICAgICAgIEBQYXRoKCJsb2MiKQorICAgICAgICAgICAgcHVibGljIFdhZGwxVGVzdC5TdWJSZXNvdXJjZSBnZXRTdWIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXYWRsMVRlc3QuU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJyb290MiIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdFJlc291cmNlMiB7CisKKyAgICAgICAgICAgIEBQYXRoKCJsb2MiKQorICAgICAgICAgICAgcHVibGljIFdhZGwxVGVzdC5TdWJSZXNvdXJjZSBnZXRTdWIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXYWRsMVRlc3QuU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmUyKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudCBkID0gZXh0cmFjdFdhZGxBc0RvY3VtZW50KHRhcmdldCgiL2FwcGxpY2F0aW9uLndhZGwiKQorICAgICAgICAgICAgICAgICAgICAucXVlcnlQYXJhbShXYWRsVXRpbHMuREVUQUlMRURfV0FETF9RVUVSWV9QQVJBTSwgInRydWUiKS5yZXF1ZXN0KCkuZ2V0KCkpOworCisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXMvQGJhc2UiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gY2hlY2sgb25seSBvbmUgcmVzb3VyY2Ugd2l0aCBmb3IgJ3Jvb3QvbG9jJworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nbG9jJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiNCIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBmb3IgbWV0aG9kIHdpdGggaWQgb2YgaGVsbG8KKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J2xvYyddL3dhZGw6bWV0aG9kW0BpZD0naGVsbG8nXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbDNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEZvcm1SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZm9ybSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9ybVJlc291cmNlIHsKKworICAgICAgICAgICAgQFBPU1QKKyAgICAgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoCisgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImEiKSBmaW5hbCBTdHJpbmcgYSwKKyAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiYiIpIGZpbmFsIFN0cmluZyBiLAorICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJjIikgZmluYWwgSmF4YkJlYW4gYywKKyAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiYyIpIGZpbmFsIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGNkYywKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRm9ybSBmb3JtKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtUGFyYW0oKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBleHRyYWN0V2FkbEFzRG9jdW1lbnQodGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoKSk7CisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RQYXRoID0gIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nZm9ybSddL3dhZGw6bWV0aG9kW0BuYW1lPSdQT1NUJ10vd2FkbDpyZXF1ZXN0IjsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXByZXNlbnRhdGlvblBhdGggPSByZXF1ZXN0UGF0aCArICIvd2FkbDpyZXByZXNlbnRhdGlvbiI7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIG51bWJlciBvZiByZXF1ZXN0IHBhcmFtcyBpcyB6ZXJvCisgICAgICAgICAgICBpbnQgY291bnQgPSAoKERvdWJsZSkgeHAuZXZhbHVhdGUoImNvdW50KCIgKyByZXF1ZXN0UGF0aCArICIvd2FkbDpwYXJhbSkiLCBkLCBYUGF0aENvbnN0YW50cy5OVU1CRVIpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvdW50KTsKKworICAgICAgICAgICAgLy8gY2hlY2sgbnVtYmVyIG9mIHJlcXVlc3QgcmVwcmVzZW50YXRpb25zIGlzIG9uZQorICAgICAgICAgICAgY291bnQgPSAoKERvdWJsZSkgeHAuZXZhbHVhdGUoImNvdW50KCIgKyByZXByZXNlbnRhdGlvblBhdGggKyAiKSIsIGQsIFhQYXRoQ29uc3RhbnRzLk5VTUJFUikpLmludFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY291bnQpOworCisgICAgICAgICAgICAvLyBjaGVjayBudW1iZXIgb2YgcmVxdWVzdCByZXByZXNlbnRhdGlvbiBwYXJhbXMgaXMgdGhyZWUKKyAgICAgICAgICAgIGNvdW50ID0gKChEb3VibGUpIHhwLmV2YWx1YXRlKCJjb3VudCgiICsgcmVwcmVzZW50YXRpb25QYXRoICsgIi93YWRsOnBhcmFtKSIsIGQsIFhQYXRoQ29uc3RhbnRzLk5VTUJFUikpLmludFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgY291bnQpOworCisgICAgICAgICAgICAvLyBjaGVjayB0aGUgc3R5bGUgb2YgdGhlIHJlcXVlc3QgcmVwcmVzZW50YXRpb24gcGFyYW0gaXMgJ3F1ZXJ5JworICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKHJlcHJlc2VudGF0aW9uUGF0aCArICIvd2FkbDpwYXJhbVtAbmFtZT0nYSddL0BzdHlsZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInF1ZXJ5IiwgdmFsKTsKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKHJlcHJlc2VudGF0aW9uUGF0aCArICIvd2FkbDpwYXJhbVtAbmFtZT0nYiddL0BzdHlsZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInF1ZXJ5IiwgdmFsKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsNFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRmllbGRQYXJhbVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJmaWVsZFBhcmFtL3twcH0iKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpZWxkUGFyYW1SZXNvdXJjZSB7CisKKyAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiaHAiKQorICAgICAgICAgICAgU3RyaW5nIGhwOworICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJtcCIpCisgICAgICAgICAgICBTdHJpbmcgbXA7CisgICAgICAgICAgICBAUGF0aFBhcmFtKCJwcCIpCisgICAgICAgICAgICBTdHJpbmcgcHA7CisKKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHE7CisKKyAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJxIikKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFEoZmluYWwgU3RyaW5nIHEpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnEgPSBxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB0aGVzZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIFdBREwKKyAgICAgICAgICAgIEBDb250ZXh0CisgICAgICAgICAgICBVcmlJbmZvIHVyaUluZm87CisgICAgICAgICAgICBATmFtZWQoImZha2VQYXJhbSIpCisgICAgICAgICAgICBTdHJpbmcgZmFrZVBhcmFtOworCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRQYXJhbSgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSAiZmllbGRQYXJhbSI7CisgICAgICAgICAgICBfdGVzdEZpZWxkQW5kU2V0dGVyUGFyYW0odGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoKSwgcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIF90ZXN0RmllbGRBbmRTZXR0ZXJQYXJhbShmaW5hbCBSZXNwb25zZSByZXNwb25zZSwgZmluYWwgU3RyaW5nIHBhdGgpCisgICAgICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBleHRyYWN0V2FkbEFzRG9jdW1lbnQocmVzcG9uc2UpOworICAgICAgICAgICAgZmluYWwgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZVBhdGggPSBTdHJpbmcuZm9ybWF0KCIvL3dhZGw6cmVzb3VyY2VbQHBhdGg9JyVzL3twcH0nXSIsIHBhdGgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZFBhdGggPSByZXNvdXJjZVBhdGggKyAiL3dhZGw6bWV0aG9kW0BuYW1lPSdHRVQnXSI7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIG51bWJlciBvZiByZXNvdXJjZSBtZXRob2RzIGlzIG9uZQorICAgICAgICAgICAgZmluYWwgaW50IG1ldGhvZENvdW50ID0gKChEb3VibGUpIHhwLmV2YWx1YXRlKCJjb3VudCgiICsgbWV0aG9kUGF0aCArICIpIiwgZCwgWFBhdGhDb25zdGFudHMuTlVNQkVSKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIG1ldGhvZHMgb24gcGF0aCAnIiArIG1ldGhvZFBhdGggKyAiJyIsIG1ldGhvZENvdW50LCBlcXVhbFRvKDEpKTsKKworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbVN0eWxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIHBhcmFtU3R5bGVzLnB1dCgibXAiLCAibWF0cml4Iik7CisgICAgICAgICAgICBwYXJhbVN0eWxlcy5wdXQoInBwIiwgInRlbXBsYXRlIik7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBudW1iZXIgb2YgcmVzb3VyY2UgcGFyYW1zCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXJhbXNDb3VudFhQYXRoID0gU3RyaW5nLmZvcm1hdCgiY291bnQoJXMvd2FkbDpwYXJhbSkiLCByZXNvdXJjZVBhdGgpOworICAgICAgICAgICAgZmluYWwgaW50IHJlc291cmNlUGFyYW1zQ291bnQgPSAoKERvdWJsZSkgeHAuZXZhbHVhdGUocmVzb3VyY2VQYXJhbXNDb3VudFhQYXRoLCBkLCBYUGF0aENvbnN0YW50cy5OVU1CRVIpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiTnVtYmVyIG9mIHJlc291cmNlIHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0Y2guIiwgcmVzb3VyY2VQYXJhbXNDb3VudCwgZXF1YWxUbygyKSk7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBwYXJhbSA6IHBhcmFtU3R5bGVzLmVudHJ5U2V0KCkpIHsKKworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwTmFtZSA9IHBhcmFtLmdldEtleSgpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwU3R5bGUgPSBwYXJhbS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhcmFtWFBhdGggPSBTdHJpbmcuZm9ybWF0KCIlcy93YWRsOnBhcmFtW0BuYW1lPSclcyddIiwgcmVzb3VyY2VQYXRoLCBwTmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBudW1iZXIgb2YgcGFyYW1zIGlzIG9uZQorICAgICAgICAgICAgICAgIGZpbmFsIGludCBwYyA9ICgoRG91YmxlKSB4cC5ldmFsdWF0ZSgiY291bnQoIiArIHBhcmFtWFBhdGggKyAiKSIsIGQsIFhQYXRoQ29uc3RhbnRzLk5VTUJFUikpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCgiTnVtYmVyIG9mICIgKyBwU3R5bGUgKyAiIHBhcmFtZXRlcnMgJyIgKyBwTmFtZSArICInIGRvZXMgbm90IG1hdGNoLiIsIHBjLCBlcXVhbFRvKDEpKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBzdHlsZSBvZiB0aGUgcGFyYW0KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3R5bGUgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZShwYXJhbVhQYXRoICsgIi9Ac3R5bGUiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoIlBhcmFtZXRlciAnIiArIHBOYW1lICsgIicgc3R5bGUgZG9lcyBub3QgbWF0Y2guIiwgcFN0eWxlLCBlcXVhbFRvKHN0eWxlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcmFtU3R5bGVzLmNsZWFyKCk7CisgICAgICAgICAgICBwYXJhbVN0eWxlcy5wdXQoImhwIiwgImhlYWRlciIpOworICAgICAgICAgICAgcGFyYW1TdHlsZXMucHV0KCJxIiwgInF1ZXJ5Iik7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBudW1iZXIgb2YgcmVxdWVzdCBwYXJhbXMKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0UGFyYW1zQ291bnRYUGF0aCA9IFN0cmluZy5mb3JtYXQoImNvdW50KCVzL3dhZGw6cmVxdWVzdC93YWRsOnBhcmFtKSIsIG1ldGhvZFBhdGgpOworICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RQYXJhbXNDb3VudCA9ICgoRG91YmxlKSB4cC5ldmFsdWF0ZShyZXF1ZXN0UGFyYW1zQ291bnRYUGF0aCwgZCwgWFBhdGhDb25zdGFudHMuTlVNQkVSKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIk51bWJlciBvZiByZXF1ZXN0IHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0Y2guIiwgcmVxdWVzdFBhcmFtc0NvdW50LCBlcXVhbFRvKDIpKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IHBhcmFtIDogcGFyYW1TdHlsZXMuZW50cnlTZXQoKSkgeworCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBOYW1lID0gcGFyYW0uZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBTdHlsZSA9IHBhcmFtLmdldFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1YUGF0aCA9IFN0cmluZy5mb3JtYXQoIiVzL3dhZGw6cmVxdWVzdC93YWRsOnBhcmFtW0BuYW1lPSclcyddIiwgbWV0aG9kUGF0aCwgcE5hbWUpOworCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIHBhcmFtcyBpcyBvbmUKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGMgPSAoKERvdWJsZSkgeHAuZXZhbHVhdGUoImNvdW50KCIgKyBwYXJhbVhQYXRoICsgIikiLCBkLCBYUGF0aENvbnN0YW50cy5OVU1CRVIpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoIk51bWJlciBvZiAiICsgcFN0eWxlICsgIiBwYXJhbWV0ZXJzICciICsgcE5hbWUgKyAiJyBkb2VzIG5vdCBtYXRjaC4iLCBwYywgZXF1YWxUbygxKSk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGUgc3R5bGUgb2YgdGhlIHBhcmFtCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0eWxlID0gKFN0cmluZykgeHAuZXZhbHVhdGUocGFyYW1YUGF0aCArICIvQHN0eWxlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KCJQYXJhbWV0ZXIgJyIgKyBwTmFtZSArICInIHN0eWxlIGRvZXMgbm90IG1hdGNoLiIsIHBTdHlsZSwgZXF1YWxUbyhzdHlsZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgT1BUSU9OUyBtZXRob2Qgb24gYSByZXNvdXJjZSBtZXRob2QgYW5ub3RhdGVkIHdpdGggQFBhdGggYW5kIGNvbnRhaW5pbmcgYSBsZWFkaW5nICcvJy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGw2VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBQYXRoKCJ3YWRsNnRlc3QiKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFBhdGgoImZvbzEiKQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBmb28xKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZm9vMSI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQYXRoKCIvZm9vMiIpCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGZvbzIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28yIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFBhdGgoImZvbzMvIikKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZm9vMygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbzMiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBAUGF0aCgiL2ZvbzQvIikKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZm9vNCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbzQiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aFBhdGhBbmRMZWFkaW5nU2xhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gcGF0aHMgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAiZm9vIiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAiL2ZvbyIgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgImZvbyIgKyBpICsgJy8nLAorICAgICAgICAgICAgICAgICAgICAgICAgIi9mb28iICsgaSArICcvJworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwYXRoIDogcGF0aHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIndhZGw2dGVzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGgocGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgiYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9wdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZG9jdW1lbnQgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgcmVzdWx0aW5nIGRvY3VtZW50IGNvbnRhaW5zIGEgbWV0aG9kIGVsZW1lbnQgd2l0aCBpZD0iZm9vWCIKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShkb2N1bWVudC5yZXBsYWNlQWxsKCJcbiIsICIgIikubWF0Y2hlcygiLio8bWV0aG9kW14+XStpZD1cImZvbyIgKyBpICsgIlwiW14+XSo+LioiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsOFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBLmNsYXNzLCBSZXNvdXJjZUIuY2xhc3MsIFJlc291cmNlU3BlY2lmaWMuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInthfSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VBIHsKKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiYSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgie2J9IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUIgeworCisgICAgICAgICAgICBAUE9TVAorICAgICAgICAgICAgcHVibGljIFN0cmluZyBwb3N0QihmaW5hbCBTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTcGVjaWZpYyB7CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQYXRoKCJ7dGVtcGxhdGVBfSIpCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBsYXRlQSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gInRlbXBsYXRlLWEiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAUE9TVAorICAgICAgICAgICAgQFBhdGgoInt0ZW1wbGF0ZUJ9IikKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdFRlbXBsYXRlQihmaW5hbCBTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJ0ZW1wbGF0ZS1iIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIEBJZ25vcmUoIkpFUlNFWS0xNjcwOiBXQURMIE9wdGlvbnMgaW52b2tlZCBvbiByZXNvdXJjZXMgd2l0aCBzYW1lIHRlbXBsYXRlIHJldHVybnMgb25seSBtZXRob2RzIGZyb20gb25lIG9mIHRoZW0uIikKKyAgICAgICAgLy8gVE9ETzogZml4CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RXYWRsRm9yQW1iaWd1b3VzUmVzb3VyY2VUZW1wbGF0ZXMoKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJmb28iKS5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5vcHRpb25zKCk7CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudCBkID0gZXh0cmFjdFdhZGxBc0RvY3VtZW50KHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworCisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZS93YWRsOm1ldGhvZFtAbmFtZT0nR0VUJ10vQGlkIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0QSIsIHJlc3VsdCk7CisKKyAgICAgICAgICAgIHJlc3VsdCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvL3dhZGw6cmVzb3VyY2Uvd2FkbDptZXRob2RbQG5hbWU9J1BPU1QnXS9AaWQiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0QiIsIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBASWdub3JlKCJKRVJTRVktMTY3MDogV0FETCBPcHRpb25zIGludm9rZWQgb24gcmVzb3VyY2VzIHdpdGggc2FtZSB0ZW1wbGF0ZSByZXR1cm5zIG9ubHkgbWV0aG9kcyBmcm9tIG9uZSBvZiB0aGVtLiIpCisgICAgICAgIC8vIFRPRE86IGZpeAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0V2FkbEZvckFtYmlndW91c0NoaWxkUmVzb3VyY2VUZW1wbGF0ZXMoKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9iYXIiKS5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5vcHRpb25zKCk7CisKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBleHRyYWN0V2FkbEFzRG9jdW1lbnQocmVzcG9uc2UpOworICAgICAgICAgICAgZmluYWwgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlL3dhZGw6bWV0aG9kW0BuYW1lPSdHRVQnXS9AaWQiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRUZW1wbGF0ZUEiLCByZXN1bHQpOworCisgICAgICAgICAgICByZXN1bHQgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlL3dhZGw6bWV0aG9kW0BuYW1lPSdQT1NUJ10vQGlkIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicG9zdFRlbXBsYXRlQiIsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB1c2FnZSBvZiBwcm9wZXJ0eSB7QGxpbmsgU2VydmVyUHJvcGVydGllcyNNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFfS4gV2FkbCBpcyByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkgZXZlcnkKKyAgICAgKiB0aW1lIGFuZCBjYW4gYmUgdHVybmVkIG9mZiBvbmx5IHZpYSB7QGxpbmsgU2VydmVyUHJvcGVydGllcyNXQURMX0ZFQVRVUkVfRElTQUJMRX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsOVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAUGF0aCgid2FkbDl0ZXN0IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZm9vKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8vIGNsYXNzIFJlc291cmNlCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUsIHRydWUpOworCisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0V2FkbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hcHBsaWNhdGlvbi53YWRsIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuaGFzRW50aXR5KCksIGlzKHRydWUpKTsKKyAgICAgICAgfQorCisgICAgfSAvLyBjbGFzcyBXYWRsOVRlc3QKKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYm9vbGVhbiBnZXR0ZXJzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgd2l0aCAiaXMiIHByZWZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGwxMFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAUGF0aCgid2FkbDEwdGVzdCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBmb28oQFF1ZXJ5UGFyYW0oInEiKSBmaW5hbCBCb29sZWFuIHEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IC8vIGNsYXNzIFJlc291cmNlCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RXYWRsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2FwcGxpY2F0aW9uLndhZGwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5oYXNFbnRpdHkoKSwgaXModHJ1ZSkpOworCisgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgcmVzcG9uc2UucmVhZEVudGl0eShjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuQXBwbGljYXRpb24uY2xhc3MpIC8vIHdhZGwKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlcygpLmdldCgwKS5nZXRSZXNvdXJjZSgpLmdldCgwKSAvLyByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kT3JSZXNvdXJjZSgpLmdldCgwKTsgLy8gbWV0aG9kCisgICAgICAgICAgICBmaW5hbCBQYXJhbSBwYXJhbSA9IG1ldGhvZC5nZXRSZXF1ZXN0KCkuZ2V0UGFyYW0oKS5nZXQoMCk7IC8vIHBhcmFtCisKKyAgICAgICAgICAgIC8vIG5vdCBpbnRlcmVzdGVkIGluIHJldHVybmVkIHZhbHVlLCBvbmx5IHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHBhcmFtLmlzUmVxdWlyZWQoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChwYXJhbS5pc1JlcGVhdGluZygpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIH0KKworICAgIH0gLy8gY2xhc3MgV2FkbDEwVGVzdAorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciB1bmtub3duIGFubm90YXRpb24gYWZmZWN0cyBhIFdBREwgY29ycmVjdG5lc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsMTFUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuUEFSQU1FVEVSLCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLlRZUEV9KQorICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgICAgICBASW5oZXJpdGVkCisgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVua25vd25Bbm5vdGF0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJhbm5vdGF0ZWQiKQorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgICBAVW5rbm93bkFubm90YXRpb24KKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0ZWQgeworCisgICAgICAgICAgICBAUGF0aCgic3VicmVzb3VyY2UiKQorICAgICAgICAgICAgQFBPU1QKKyAgICAgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgICAgICAgICBAVW5rbm93bkFubm90YXRpb24KKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHkgbXlNZXRob2QxKEBVbmtub3duQW5ub3RhdGlvbiBmaW5hbCBFbnRpdHkgZW50aXR5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQFBhdGgoInN1YnJlc291cmNlIikKKyAgICAgICAgICAgIEBQT1NUCisgICAgICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgICAgICBwdWJsaWMgRW50aXR5IG15TWV0aG9kMihAVW5rbm93bkFubm90YXRpb24gZmluYWwgRW50aXR5IGVudGl0eSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJub3QtYW5ub3RhdGVkIikKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQbGFpbiB7CisKKyAgICAgICAgICAgIEBQYXRoKCJzdWJyZXNvdXJjZSIpCisgICAgICAgICAgICBAUE9TVAorICAgICAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHkgbXlNZXRob2QxKGZpbmFsIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAUGF0aCgic3VicmVzb3VyY2UiKQorICAgICAgICAgICAgQFBPU1QKKyAgICAgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHkgbXlNZXRob2QyKGZpbmFsIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQW5ub3RhdGVkLmNsYXNzLCBQbGFpbi5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0V2FkbElzQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmhhc0VudGl0eSgpLCBpcyh0cnVlKSk7CisKKyAgICAgICAgICAgIGZpbmFsIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLkFwcGxpY2F0aW9uLmNsYXNzKTsKKworICAgICAgICAgICAgLy8gImFubm90YXRlZC9zdWJyZXNvdXJjZSIKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc291cmNlID0KKyAgICAgICAgICAgICAgICAgICAgKFJlc291cmNlKSBhcHBsaWNhdGlvbi5nZXRSZXNvdXJjZXMoKS5nZXQoMCkuZ2V0UmVzb3VyY2UoKS5nZXQoMCkuZ2V0TWV0aG9kT3JSZXNvdXJjZSgpLmdldCgwKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdE1ldGhvZENvbnRhaW5zUlIocmVzb3VyY2UsICJteU1ldGhvZDEiLCAwKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXRNZXRob2RDb250YWluc1JSKHJlc291cmNlLCAibXlNZXRob2QyIiwgMSk7CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VGhhdE1ldGhvZENvbnRhaW5zUlIoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBpbnQgbWV0aG9kSW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSByZXNvdXJjZS5nZXRNZXRob2RPclJlc291cmNlKCkuZ2V0KG1ldGhvZEluZGV4KTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChtZXRob2QuZ2V0SWQoKSwgZXF1YWxUbyhtZXRob2ROYW1lKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlcXVlc3QgcmVxdWVzdCA9IG1ldGhvZC5nZXRSZXF1ZXN0KCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNwb25zZT4gcmVzcG9uc2UgPSBtZXRob2QuZ2V0UmVzcG9uc2UoKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmlzRW1wdHkoKSwgaXMoZmFsc2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RXYWRsSXNTYW1lRm9yQW5ub3RhdGVkQW5kTm90KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZG9jdW1lbnQgPSBleHRyYWN0V2FkbEFzRG9jdW1lbnQocmVzcG9uc2UpOworCisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICBmaW5hbCBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlciBuc0NvbnRleHQgPSBuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobnNDb250ZXh0KTsKKworICAgICAgICAgICAgZmluYWwgRGlmZiBkaWZmID0gWE1MVW5pdC5jb21wYXJlWE1MKAorICAgICAgICAgICAgICAgICAgICBub2RlQXNTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nYW5ub3RhdGVkJ10vd2FkbDpyZXNvdXJjZSIsIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGhDb25zdGFudHMuTk9ERSkpLAorICAgICAgICAgICAgICAgICAgICBub2RlQXNTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nbm90LWFubm90YXRlZCddL3dhZGw6cmVzb3VyY2UiLCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoQ29uc3RhbnRzLk5PREUpKQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIFhNTFVuaXQuc2V0WHBhdGhOYW1lc3BhY2VDb250ZXh0KAorICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlTmFtZXNwYWNlQ29udGV4dChJbW11dGFibGVNYXAub2YoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSkpOworICAgICAgICAgICAgZmluYWwgRWxlbWVudFF1YWxpZmllciBlbGVtZW50UXVhbGlmaWVyID0gbmV3IFJlY3Vyc2l2ZUVsZW1lbnROYW1lQW5kVGV4dFF1YWxpZmllcigpOworICAgICAgICAgICAgZGlmZi5vdmVycmlkZUVsZW1lbnRRdWFsaWZpZXIoZWxlbWVudFF1YWxpZmllcik7CisgICAgICAgICAgICBYTUxBc3NlcnQuYXNzZXJ0WE1MRXF1YWwoZGlmZiwgdHJ1ZSk7CisKKyAgICAgICAgfQorCisgICAgfSAvLyBjbGFzcyBXYWRsMTFUZXN0CisKKworICAgIEBYbWxSb290RWxlbWVudChuYW1lID0gImpheGJCZWFuIikKKyAgICBwdWJsaWMgY2xhc3MgSmF4YkJlYW4geworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIEpheGJCZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpheGJCZWFuKFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSmF4YkJlYW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICgoSmF4YkJlYW4pIG8pLnZhbHVlLmVxdWFscyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJKQVhCQ2xhc3M6ICIgKyB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL0N1c3RvbVZpZXdhYmxlQ29udGV4dC9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL0N1c3RvbVZpZXdhYmxlQ29udGV4dC9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvQ3VzdG9tVmlld2FibGVDb250ZXh0L2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXIgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxMjI3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLkFic3RyYWN0RGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cFRlc3QkVXNlbGVzc01lc3NhZ2VQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODEyMjdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuQWJzdHJhY3REaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwVGVzdCRVc2VsZXNzTWVzc2FnZVByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2RkNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uSW5mb1Rlc3QkRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZUltcGwKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL1ZhbGlkYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvVmFsaWRhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NDBlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL1ZhbGlkYXRpb25NZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTcgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uLk5vbkVtcHR5TmFtZXMubWVzc2FnZT1hdCBsZWFzdCBvbmUgb2YgdGhlIG5hbWVzIGlzIGVtcHR5CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9CZWFuVmFsaWRhdGlvbkVycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0JlYW5WYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9CZWFuVmFsaWRhdGlvbkVycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXguYWJjIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXguYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9pbmRleC5hYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS5hYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL3JlbGF0aXZlLmFiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvcmVsYXRpdmUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvcmVsYXRpdmUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9hYnNvbHV0ZS5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvYWJzb2x1dGUuYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvYWJzb2x1dGUuYWJjCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvYWJzb2x1dGUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvYWJzb2x1dGUudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9hYnNvbHV0ZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9yZWxhdGl2ZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9yZWxhdGl2ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL3JlbGF0aXZlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UvYWJzb2x1dGUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UvYWJzb2x1dGUudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVTdWJSZXNvdXJjZS9hYnNvbHV0ZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVN1YlJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVN1YlJlc291cmNlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVTdWJSZXNvdXJjZS9yZWxhdGl2ZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVTdWJSZXNvdXJjZS9yZWxhdGl2ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVN1YlJlc291cmNlL3JlbGF0aXZlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeGNlcHRpb25WaWV3UHJvY2Vzc29yVGVzdC80MDQudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeGNlcHRpb25WaWV3UHJvY2Vzc29yVGVzdC80MDQudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0LzQwNC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QvV2ViQXBwRXhjZXB0aW9uTWFwcGVyLzQwNi50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0L1dlYkFwcEV4Y2VwdGlvbk1hcHBlci80MDYudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0L1dlYkFwcEV4Y2VwdGlvbk1hcHBlci80MDYudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdE5vUHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXROb1Byb2R1Y2VzVGVtcGxhdGUvaW5kZXguYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXROb1Byb2R1Y2VzVGVtcGxhdGUvaW5kZXguYWJjCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXROb1Byb2R1Y2VzVGVtcGxhdGUvaW5kZXguZGVmIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0Tm9Qcm9kdWNlc1RlbXBsYXRlL2luZGV4LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0Tm9Qcm9kdWNlc1RlbXBsYXRlL2luZGV4LmRlZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzL2Fic29sdXRlLmFiYyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcy9hYnNvbHV0ZS5hYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcy9hYnNvbHV0ZS5hYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcy9pbmRleC5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MvaW5kZXguYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MvaW5kZXguYWJjCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MvcmVsYXRpdmUuYWJjIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzL3JlbGF0aXZlLmFiYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzL3JlbGF0aXZlLmFiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VHdvR2V0UHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUd29HZXRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmFiYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VHdvR2V0UHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5hYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFR3b0dldFByb2R1Y2VzVGVtcGxhdGUvaW5kZXguZGVmIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VHdvR2V0UHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFR3b0dldFByb2R1Y2VzVGVtcGxhdGUvaW5kZXguZGVmCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRXaWxkY2FyZFByb2R1Y2VzVGVtcGxhdGUvaW5kZXguYWJjIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0V2lsZGNhcmRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmFiYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0V2lsZGNhcmRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmFiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0V2lsZGNhcmRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmRlZiBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFdpbGRjYXJkUHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFdpbGRjYXJkUHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5kZWYKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL2luZGV4LmFiYyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL2luZGV4LmFiYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXguYWJjCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvcmVsYXRpdmUuYWJjIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvcmVsYXRpdmUuYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS5hYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL3JlbGF0aXZlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvcmVsYXRpdmUudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL3JlbGF0aXZlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlLmFiYyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUuYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlLmFiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3JlbGF0aXZlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9yZWxhdGl2ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9yZWxhdGl2ZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlL2Fic29sdXRlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlL2Fic29sdXRlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UvYWJzb2x1dGUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UvcmVsYXRpdmUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UvcmVsYXRpdmUudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZS9yZWxhdGl2ZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGUub3ZlcnJpZGUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZS5vdmVycmlkZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGUub3ZlcnJpZGUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlQmFzZS5pbmhlcml0LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGVCYXNlLmluaGVyaXQudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlQmFzZS5pbmhlcml0LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZUJhc2Uuc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlQmFzZS5zaG93LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZUJhc2Uuc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGUub3ZlcnJpZGUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZS5vdmVycmlkZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGUub3ZlcnJpZGUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlQmFzZS5pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlQmFzZS5pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGVCYXNlLmluZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZUJhc2UuaW5oZXJpdC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlQmFzZS5pbmhlcml0LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZUJhc2UuaW5oZXJpdC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGUuc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlLnNob3cudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlLnNob3cudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlLmluZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlLmluZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlLnNob3cudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlLnNob3cudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGUuaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZS5pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGUuaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS5pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS5pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0V2l0aEdldFRlbXBsYXRlLmluZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS5zdWIudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS5zdWIudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlLnN1Yi50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVByb2dyYW1tYXRpY1Rlc3QvSGFuZGxlci9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVQcm9ncmFtbWF0aWNUZXN0L0hhbmRsZXIvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVQcm9ncmFtbWF0aWNUZXN0L0hhbmRsZXIvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0Fub3RoZXJJbXBsaWNpdEdldFJlc291cmNlL2dldC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0Fub3RoZXJJbXBsaWNpdEdldFJlc291cmNlL2dldC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvQW5vdGhlckltcGxpY2l0R2V0UmVzb3VyY2UvZ2V0LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9Bbm90aGVySW1wbGljaXRHZXRSZXNvdXJjZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0Fub3RoZXJJbXBsaWNpdEdldFJlc291cmNlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9Bbm90aGVySW1wbGljaXRHZXRSZXNvdXJjZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRSZXNvdXJjZS9nZXQudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFJlc291cmNlL2dldC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRSZXNvdXJjZS9nZXQudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0UmVzb3VyY2UvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFJlc291cmNlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFJlc291cmNlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFNpbmdsZXRvblJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRTaW5nbGV0b25SZXNvdXJjZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRTaW5nbGV0b25SZXNvdXJjZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRTdWJTdWJSZXNvdXJjZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0U3ViU3ViUmVzb3VyY2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0U3ViU3ViUmVzb3VyY2UvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0Vmlld1dpdGhSZXNvdXJjZUZpbHRlclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0Vmlld1dpdGhSZXNvdXJjZUZpbHRlclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRWaWV3V2l0aFJlc291cmNlRmlsdGVyVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL292ZXJyaWRlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9vdmVycmlkZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9vdmVycmlkZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2UvaW5oZXJpdC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGVCYXNlL2luaGVyaXQudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGVCYXNlL2luaGVyaXQudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGVCYXNlL292ZXJyaWRlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2Uvb3ZlcnJpZGUudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGVCYXNlL292ZXJyaWRlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlQmFzZS9zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2Uvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2Uvc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9vdmVycmlkZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvb3ZlcnJpZGUudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvb3ZlcnJpZGUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGVCYXNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZUJhc2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGVCYXNlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlQmFzZS9pbmhlcml0LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZUJhc2UvaW5oZXJpdC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZUJhc2UvaW5oZXJpdC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZUJhc2Uvb3ZlcnJpZGUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlQmFzZS9vdmVycmlkZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZUJhc2Uvb3ZlcnJpZGUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC9GcmVlbWFya2VyUmVzb3VyY2UuZnRsIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0L0ZyZWVtYXJrZXJSZXNvdXJjZS5mdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4Njg5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC9GcmVlbWFya2VyUmVzb3VyY2UuZnRsCkBAIC0wLDAgKzEgQEAKK01vZGVsOiR7dXNlcn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9NdmNFbmNvZGluZ1Rlc3QvTXVzdGFjaGVSZXNvdXJjZS5tdXN0YWNoZSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC9NdXN0YWNoZVJlc291cmNlLm11c3RhY2hlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZDhmYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9NdmNFbmNvZGluZ1Rlc3QvTXVzdGFjaGVSZXNvdXJjZS5tdXN0YWNoZQpAQCAtMCwwICsxIEBACitNb2RlbDp7e3VzZXJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1Jlc29sdmluZ0NsYXNzVmlld1Byb2Nlc3NvclRlc3QvUmVzb2x2aW5nQ2xhc3Mvc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1Jlc29sdmluZ0NsYXNzVmlld1Byb2Nlc3NvclRlc3QvUmVzb2x2aW5nQ2xhc3Mvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvUmVzb2x2aW5nQ2xhc3NWaWV3UHJvY2Vzc29yVGVzdC9SZXNvbHZpbmdDbGFzcy9zaG93LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvQXNWaWV3YWJsZVJlc291cmNlL2dldEFzSFRNTCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9Bc1ZpZXdhYmxlUmVzb3VyY2UvZ2V0QXNIVE1MCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvQXNWaWV3YWJsZVJlc291cmNlL2dldEFzSFRNTApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L0FzVmlld2FibGVSZXNvdXJjZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9Bc1ZpZXdhYmxlUmVzb3VyY2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9Bc1ZpZXdhYmxlUmVzb3VyY2UvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9UZW1wbGF0ZUFubm90YXRlZFJlc291cmNlL2dldEFzSFRNTCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9UZW1wbGF0ZUFubm90YXRlZFJlc291cmNlL2dldEFzSFRNTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2UvZ2V0QXNIVE1MCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9UZW1wbGF0ZUFubm90YXRlZFJlc291cmNlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2VNZXRob2QvZ2V0QXNIVE1MIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2VNZXRob2QvZ2V0QXNIVE1MCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZU1ldGhvZC9nZXRBc0hUTUwKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9UZW1wbGF0ZUFubm90YXRlZFJlc291cmNlTWV0aG9kL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2VNZXRob2QvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9UZW1wbGF0ZUFubm90YXRlZFJlc291cmNlTWV0aG9kL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUvc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlL3Nob3cudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC9SZXNvdXJjZS9pbmRleC5mY3QgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9zcGkvQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QvUmVzb3VyY2UvaW5kZXguZmN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9zcGkvQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QvUmVzb3VyY2UvaW5kZXguZmN0CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtdGVzdG5nL3BvbS54bWwgYi90ZXN0cy9lMmUtdGVzdG5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhODJiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS10ZXN0bmcvcG9tLnhtbApAQCAtMCwwICsxLDk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZTJlLXRlc3RuZzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1lMmUtdGVzdG5nPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBFMkUgKFRlc3RORykgdGVzdHM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Zm9ya0NvdW50PjE8L2ZvcmtDb3VudD4KKyAgICAgICAgICAgICAgICAgICAgPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+CisgICAgICAgICAgICAgICAgICAgIDxlbmFibGVBc3NlcnRpb25zPmZhbHNlPC9lbmFibGVBc3NlcnRpb25zPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc3VyZWZpcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdXJlZmlyZS10ZXN0bmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE3PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy50ZXN0bmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50ZXN0bmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIEphQ29DbyBsaXN0ZW5lciBiZWNhdXNlIGl0J3Mgbm90IHdvcmtpbmcgd2l0aCA8Zm9ya01vZGU+YWx3YXlzPC9mb3JrPiAoPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+IHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9qaXJhLnNvbmFyc291cmNlLmNvbS9icm93c2UvU09OQVJKQVZBLTcyOCAoaHR0cHM6Ly9naXRodWIuY29tL1NvbmFyU291cmNlL3NvbmFyLWphdmEvcHVsbC8zMjQpIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcyBjb21iaW5lLnNlbGY9Im92ZXJyaWRlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQWJzdHJhY3RQYXJhbGxlbFRlc3QuamF2YSBiL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQWJzdHJhY3RQYXJhbGxlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNkOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9BYnN0cmFjdFBhcmFsbGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdE5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy50ZXN0bmcuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBCYXNlIGZvciBUZXN0TkcgcGFyYWxsZWwgdGVzdHMuIENvbnRhaW5zIG9uZSBzaW5nbGV0b24gcmVzb3VyY2Ugd2l0aCBHRVQgbWV0aG9kIHJldHVybmluZyBpbmNyZW1lbnRhbCBzZXF1ZW5jZSBvZiBpbnRlZ2Vycy4KKyAqIEV4dGVuc2lvbnMgaGFzIHRvIGltcGxlbWVudCB7QGxpbmsgI3Rlc3RWYWx1ZShJbnRlZ2VyKX0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BUZXN0KHRocmVhZFBvb2xTaXplID0gNSwgaW52b2NhdGlvbkNvdW50ID0gMTMpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYXJhbGxlbFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0TmcgeworCisgICAgQFBhdGgoIi8iKQorICAgIEBTaW5nbGV0b24KKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBhaSA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIGludCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gYWkuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAvLyBGaW5kIGZpcnN0IGF2YWlsYWJsZSBwb3J0LgorICAgICAgICBmb3JjZVNldChUZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVCwgIjAiKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldFN0YXR1cygpLCAyMDApOworICAgICAgICB0ZXN0VmFsdWUocmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdGVzdFZhbHVlKGZpbmFsIEludGVnZXIgYWN0dWFsKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQmVmb3JlQ2xhc3NQYXJhbGxlbFRlc3QuamF2YSBiL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQmVmb3JlQ2xhc3NQYXJhbGxlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmEwMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9CZWZvcmVDbGFzc1BhcmFsbGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuQ29udGFpbmVyUGVyQ2xhc3NUZXN0TmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0TmdTdHJhdGVneTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSdW5zIGEgc2V0IG9mIHRlc3RzIChpbiBwYXJhbGxlbCkgYWdhaW5zdCBzaW5nbGUgdGVzdCBjb250YWluZXIgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBCZWZvcmVDbGFzc1BhcmFsbGVsVGVzdCBleHRlbmRzIEFic3RyYWN0UGFyYWxsZWxUZXN0IHsKKworICAgIHByaXZhdGUgQ29uY3VycmVudE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHZhbHVlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdE5nU3RyYXRlZ3kgY29uZmlndXJlU3RyYXRlZ3koKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGFpbmVyUGVyQ2xhc3NUZXN0TmdTdHJhdGVneSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlc3RWYWx1ZShmaW5hbCBJbnRlZ2VyIGFjdHVhbCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHZhbHVlcy5wdXRJZkFic2VudChhY3R1YWwsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBhc3NlcnRUaGF0KFN0cmluZy5mb3JtYXQoIlZhbHVlICVkIGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgYnkgY2xpZW50IGluIHRocmVhZCAlcy4iLCBhY3R1YWwsIG5hbWUpLAorICAgICAgICAgICAgICAgIG5hbWUsIG51bGxWYWx1ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtdGVzdG5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0JlZm9yZU1ldGhvZFBhcmFsbGVsVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9CZWZvcmVNZXRob2RQYXJhbGxlbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTBkMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9CZWZvcmVNZXRob2RQYXJhbGxlbFRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuQ29udGFpbmVyUGVyTWV0aG9kVGVzdE5nU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdE5nU3RyYXRlZ3k7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyTWV0aG9kOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJ1bnMgYSBzZXQgb2YgdGVzdHMgKGluIHBhcmFsbGVsKSBlYWNoIGFnYWluc3Qgc2VwYXJhdGUgdGVzdCBjb250YWluZXIgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBCZWZvcmVNZXRob2RQYXJhbGxlbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFBhcmFsbGVsVGVzdCB7CisKKyAgICBAQmVmb3JlTWV0aG9kCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXJNZXRob2QKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0TmdTdHJhdGVneSBjb25maWd1cmVTdHJhdGVneSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb250YWluZXJQZXJNZXRob2RUZXN0TmdTdHJhdGVneSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlc3RWYWx1ZShmaW5hbCBJbnRlZ2VyIGFjdHVhbCkgeworICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbCwgaXMoMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQ29udGFpbmVyUGVyQ2xhc3NUZXN0LmphdmEgYi90ZXN0cy9lMmUtdGVzdG5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0NvbnRhaW5lclBlckNsYXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjJlYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtdGVzdG5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0NvbnRhaW5lclBlckNsYXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3ROZzsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoYXQgY29udGFpbmVyIGlzIGNyZWF0ZWQgb25seSBvbmNlIHBlciBjbGFzcyBhbmQgZWFjaCB0ZXN0IG1ldGhvZCBzZW5kcyByZXF1ZXN0IHRvIHRoZSBzYW1lIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENvbnRhaW5lclBlckNsYXNzVGVzdCBleHRlbmRzIEplcnNleVRlc3ROZy5Db250YWluZXJQZXJDbGFzc1Rlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIEBTaW5nbGV0b24KKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgaW50IGkgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIGludCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QocHJpb3JpdHkgPSAxKQorICAgIHB1YmxpYyB2b2lkIGZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoMSk7CisgICAgfQorCisgICAgQFRlc3QocHJpb3JpdHkgPSAyKQorICAgIHB1YmxpYyB2b2lkIHNlY29uZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KDIpOworICAgIH0KKworICAgIEBUZXN0KHByaW9yaXR5ID0gMykKKyAgICBwdWJsaWMgdm9pZCB0aGlyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KDMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KGZpbmFsIEludGVnZXIgZXhwZWN0ZWQpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldFN0YXR1cygpLCAyMDApOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKSwgZXhwZWN0ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQ29udGFpbmVyUGVyTWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9Db250YWluZXJQZXJNZXRob2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyOTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQ29udGFpbmVyUGVyTWV0aG9kVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3ROZzsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoYXQgbmV3IGNvbnRhaW5lciBpcyBjcmVhdGVkIGZvciBlYWNoIHRlc3QgbWV0aG9kLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUGVyTWV0aG9kVGVzdCBleHRlbmRzIEplcnNleVRlc3ROZy5Db250YWluZXJQZXJNZXRob2RUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBAU2luZ2xldG9uCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIGludCBpID0gMTsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0KHByaW9yaXR5ID0gMSkKKyAgICBwdWJsaWMgdm9pZCBmaXJzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KDEpOworICAgIH0KKworICAgIEBUZXN0KHByaW9yaXR5ID0gMikKKyAgICBwdWJsaWMgdm9pZCBzZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgxKTsKKyAgICB9CisKKyAgICBAVGVzdChwcmlvcml0eSA9IDMpCisgICAgcHVibGljIHZvaWQgdGhpcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChmaW5hbCBJbnRlZ2VyIGV4cGVjdGVkKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRTdGF0dXMoKSwgMjAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLnJlYWRFbnRpdHkoSW50ZWdlci5jbGFzcyksIGV4cGVjdGVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvUkVBRE1FIGIvdGVzdHMvZTJlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzI0NTZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL1JFQURNRQpAQCAtMCwwICsxLDIwIEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworRW5kLXRvLWVuZCB0ZXN0cyBtb2R1bGUKKz09PT09PT09PT09PT09PT09PT09PT09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3BvbS54bWwgYi90ZXN0cy9lMmUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkzNDZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3BvbS54bWwKQEAgLTAsMCArMSwyMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lMmU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtZTJlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBFMkUgdGVzdHM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZvcmtDb3VudD4xPC9mb3JrQ291bnQ+CisgICAgICAgICAgICAgICAgICAgIDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlQXNzZXJ0aW9ucz5mYWxzZTwvZW5hYmxlQXNzZXJ0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1mcmVlbWFya2VyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1tdXN0YWNoZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWpldHRpc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZW50aXR5LWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1hcGFjaGUtY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktamV0dHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1qZGstY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2lnbmF0dXJlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDItY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2d1YXZhLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD54bWx1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD54ZGs8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBkbyBub3QgdXNlIHNlY3VyaXR5IG1hbmFnZXIgZm9yIHhkayAtLT4KKyAgICAgICAgICAgICAgICA8c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZSAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9BYm9ydGluZ0ZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9BYm9ydGluZ0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTFjMjRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Fib3J0aW5nRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogSkVSU0VZLTIzNDUgUmVwcm9kdWNlci4KKyAqIDxwLz4KKyAqIElmIGFuIGludmFsaWQgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIgaXMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIEh0dHBVcmxDb25uZWN0b3IgaXMgdXNlZCwKKyAqIGR1cmluZyBwcm9jZXNzaW5nIGluIHRoZSBDb25uZWN0b3IgYW4gRXhjZXB0aW9uIGlzIHRocm93biAoSHR0cFVybENvbm5lY3Rpb24gY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBBdXRoZW50aWNhdGVIZWFkZXIgY2xhc3MKKyAqIHdoaWNoIHRyaWVzIHRvIHBhcnNlIHRoZSBoZWFkZXIgdmFsdWUgZHVyaW5nIGNvbnN0cnVjdGlvbi4gSWYgYSBzY2hlbWUgaXMgbWlzc2luZyAoaGVhZGVyIHZhbHVlIGlzIG9uZSB3b3JkKSwKKyAqIHRoZSBjb25zdHJ1Y3RvciB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICogPHAvPgorICogVGhpcyBjYW5ub3QgYmUgImZpeGVkIiBpbiBKZXJzZXkuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQWJvcnRpbmdGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoQWJvcnRpbmdGaWx0ZXJUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUGF0aCgic2ltcGxlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHNpbXBsZVRlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugc2ltcGxlUmVzcG9uc2VUZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJkaXJlY3QiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkaXJlY3RSZXNwb25zZVRlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5VTkFVVEhPUklaRUQpLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsCisgICAgICAgICAgICAgICAgICAgICJvYXV0aF9wcm9ibGVtPXRva2VuX3JlamVjdGVkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJvcnRpbmdGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBidWlsZGVyID0gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5VTkFVVEhPUklaRUQpOworICAgICAgICAgICAgYnVpbGRlci5oZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAib2F1dGhfcHJvYmxlbT10b2tlbl9yZWplY3RlZCIpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKGJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFib3J0aW5nUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgYnVpbGRlciA9IFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuVU5BVVRIT1JJWkVEKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgIm9hdXRoX3Byb2JsZW09dG9rZW5fcmVqZWN0ZWQiKTsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChidWlsZGVyLmJ1aWxkKCkpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEZpbHRlckR5bmFtaWNCaW5kaW5nLmNsYXNzLCBTaW1wbGVUZXN0UmVzb3VyY2UuY2xhc3MsIExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gYWJvcnQgcmVzcG9uc2UgaW4gdGhlIGNvbnRhaW5lciByZXNwb25zZSBmaWx0ZXIuIEhvd2V2ZXIsIGl0J3MgdG9vIGxhdGUgYW5kIHByb2R1Y2VzIGFuIGVycm9yLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0aW5nUmVzcG9uc2VGaWx0ZXIoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlL3Jlc3BvbnNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJSZXNwb25zZSBzdGF0dXMgaXM6ICIgKyBzdGF0dXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzLCBSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLmdldFN0YXR1c0NvZGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ5IHRvIGFib3J0IHJlc3BvbnNlIGluIGEgY29udGFpbmVyIHJlcXVlc3QgZmlsdGVyLiBXaXRoIGFuIGludmFsaWQgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIgKGFjY29yZGluZyB0byBIVFRQIHNwZWNzKQorICAgICAqIGFuZCBIdHRwVXJsQ29ubmVjdG9yLCBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uLiBUaGlzIGlzIGFuIG9yaWdpbmFsIHNjZW5hcmlvIHJlcG9ydGVkIGJ5IGpyaDNrNSBvbiBqYXZhLm5ldAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRpbmdGaWx0ZXIoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJSZXNwb25zZSBzdGF0dXMgaXM6ICIgKyBzdGF0dXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvcmlnaW5hbCByZXByb3RlZCBzY2VuYXJpbyB3aXRoIGEgZGlmZmVyZW50IENvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYm9ydGluZ0ZpbHRlcldpdGhBcGFjaGVDb25uZWN0b3IoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjbGllbnRDb25maWcpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoIi9zaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXMoKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlJlc3BvbnNlIHN0YXR1cyBpczogIiArIHN0YXR1cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMsIFJlc3BvbnNlLlN0YXR1cy5VTkFVVEhPUklaRUQuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3Qgc2hvd3MsIHRoYXQgdGhlIGJlaGF2aW91ciBpcyBub3QgY2F1c2VkIGJ5IHRoZSB1c2Ugb2YgdGhlIGZpbHRlcnMsIGJ1dCBieSB0aGUgcmVzcG9uc2UgY29udGVudCBpdHNlbGYuCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3RSZXNwb25zZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUvZGlyZWN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJSZXNwb25zZSBzdGF0dXMgaXM6ICIgKyBzdGF0dXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIER5bmFtaWNhbGx5IGxhdW5jaCBzcGVjaWZpYyBmaWx0ZXJzIGZvciBzcGVjaWZpYyByZXNvdXJjZSBtZXRob2RzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXJEeW5hbWljQmluZGluZyBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoU2ltcGxlVGVzdFJlc291cmNlLmNsYXNzLmVxdWFscyhyZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXRob2ROYW1lID0gcmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLmNvbnRhaW5zKCJzaW1wbGVSZXNwb25zZVRlc3QiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEFib3J0aW5nUmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQWJvcnRpbmcgd2lsbCB0YWtlIHBsYWNlIGluIFJlc3BvbnNlRmlsdGVyLiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZS5jb250YWlucygic2ltcGxlVGVzdCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoQWJvcnRpbmdGaWx0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiQWJvcnRpbmcgd2lsbCB0YWtlIHBsYWNlIGluIFJlcXVlc3RGaWx0ZXIuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJlc3BvbnNlIHdpbGwgbm90IGJlIGFib3J0ZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0FjY2VwdE1lZGlhVHlwZVByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0FjY2VwdE1lZGlhVHlwZVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYWUxNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQWNjZXB0TWVkaWFUeXBlUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFjY2VwdGFibGVNZWRpYVR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwSGVhZGVyUmVhZGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciB1bmtub3duCisgKi8KK3B1YmxpYyBjbGFzcyBBY2NlcHRNZWRpYVR5cGVQcm92aWRlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sIjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lTWVkaWFUeXBlV2l0aFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWw7Y2hhcnNldD11dGY4IjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobS5nZXRQYXJhbWV0ZXJzKCkuY29udGFpbnNLZXkoImNoYXJzZXQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidXRmOCIsIG0uZ2V0UGFyYW1ldGVycygpLmdldCgiY2hhcnNldCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZU1lZGlhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaGVhZGVyID0gImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwsIHRleHQvaHRtbCI7CisgICAgICAgIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdE1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZU1lZGlhVHlwZVdpdGhRdWFsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sO3E9MC4xLCB0ZXh0L3htbDtxPTAuMiwgdGV4dC9odG1sO3E9MC4zIjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBVUkxDb25uZWN0aW9uQWNjZXB0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAidGV4dC9odG1sLCBpbWFnZS9naWYsIGltYWdlL2pwZWcsICo7IHE9LjIsICovKjsgcT0uMiI7CisgICAgICAgIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdE1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1LCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2lmIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltYWdlIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImpwZWciLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlyZWZveEFjY2VwdEhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaGVhZGVyID0gInRleHQveG1sLGFwcGxpY2F0aW9uL3htbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsdGV4dC9odG1sO3E9MC45LHRleHQvcGxhaW47cT0wLjgsaW1hZ2UvcG5nLCovKjtxPTAuNSI7CisgICAgICAgIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdE1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyg3LCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieGh0bWwreG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltYWdlIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBuZyIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg2KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhTdGFyQWNjZXB0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sO3E9MC4xLCB0ZXh0L3htbDtxPTAuMiwgKjtxPTAuMyI7CisgICAgICAgIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdE1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGVTcGVjaWZpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICIqLyosIHRleHQvKiwgdGV4dC9wbGFpbiI7CisgICAgICAgIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdE1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVNwZWNpZml0eVdpdGhRdWFsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiKi8qLCAqLyo7cT0wLjUsIHRleHQvKiwgdGV4dC8qO3E9MC41LCB0ZXh0L3BsYWluLCB0ZXh0L3BsYWluO3E9MC41IjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVNwZWNpZml0eUhUVFBFeGFtcGxlMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaGVhZGVyID0gInRleHQvKiwgdGV4dC9odG1sLCB0ZXh0L2h0bWw7bGV2ZWw9MSwgKi8qIjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVNwZWNpZml0eUhUVFBFeGFtcGxlMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaGVhZGVyID0gInRleHQvKiwgdGV4dC9odG1sO2xldmVsPTEsIHRleHQvaHRtbCwgKi8qIjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBVUkxDb25uZWN0aW9uQWNjZXB0SGVhZGVyV2l0aFByb3JpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJ0ZXh0L2h0bWwsIGltYWdlL2dpZiwgaW1hZ2UvanBlZywgKjsgcT0uMiwgKi8qOyBxPS4yIjsKKworICAgICAgICBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRNZWRpYVR5cGUoaGVhZGVyLAorICAgICAgICAgICAgICAgIEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoTWVkaWFUeXBlLlRFWFRfSFRNTCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1LCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2lmIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltYWdlIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImpwZWciLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlyZWZveEFjY2VwdEhlYWRlcldpdGhQcm9yaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAidGV4dC94bWwsYXBwbGljYXRpb24veG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCx0ZXh0L2h0bWw7cT0wLjksdGV4dC9wbGFpbjtxPTAuOCxpbWFnZS9wbmcsKi8qO3E9MC41IjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKAorICAgICAgICAgICAgICAgIGhlYWRlciwgSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZSgidGV4dC9odG1sO3FzPTEiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieGh0bWwreG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltYWdlIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBuZyIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlyZWZveEFjY2VwdEhlYWRlcldpdGhQcm9yaXR5MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaGVhZGVyID0gInRleHQveG1sLGFwcGxpY2F0aW9uL3htbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsdGV4dC9odG1sO3E9MC45LHRleHQvcGxhaW47cT0wLjgsaW1hZ2UvcG5nLCovKjtxPTAuNSI7CisgICAgICAgIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdE1lZGlhVHlwZSgKKyAgICAgICAgICAgICAgICBoZWFkZXIsCisgICAgICAgICAgICAgICAgSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShuZXcgU3RyaW5nW117InRleHQvaHRtbDtxcz0wLjgiLCAiYXBwbGljYXRpb24veG1sO3FzPTAuMSJ9KSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieGh0bWwreG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltYWdlIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBuZyIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Fubm90YXRpb25Jbmhlcml0YW5jZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Bbm5vdGF0aW9uSW5oZXJpdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiYjg2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Bbm5vdGF0aW9uSW5oZXJpdGFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IHRoYXQgSkFYLVJTIGFubm90YXRpb25zIGFyZSBjb3JyZWN0bHkgaW5oZXJpdGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBUaGUgYW5ub3RhdGlvbnMgb24gYSBzdXBlci1jbGFzcyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgYW5ub3RhdGlvbnMgb24gYW4gaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFubm90YXRpb25Jbmhlcml0YW5jZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIEZvby5jbGFzcywgQmFyLmNsYXNzCisgICAgICAgICk7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBTdXBlckZvb2FibGUgZXh0ZW5kcyBGb29hYmxlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3VwZXJGb29hYmxlV2hhdHNVcCIpCisgICAgICAgIFN0cmluZyBnZXRXaGF0c1VwKCk7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBGb29hYmxlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZm9vYWJsZUhlbGxvIikKKyAgICAgICAgU3RyaW5nIGdldEhlbGxvKCk7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZm9vYWJsZUhpIikKKyAgICAgICAgU3RyaW5nIGdldEhpKCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFN1cGVyRm9vIGltcGxlbWVudHMgU3VwZXJGb29hYmxlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3VwZXJGb29IZWxsbyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gIi1XUk9ORyBNRVNTQUdFLSI7CisgICAgICAgIH0KKworICAgICAgICAvLyBubyBhbm5vdGF0aW9ucyBoZXJlIHRoaXMgdGltZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhpKCkgeworICAgICAgICAgICAgcmV0dXJuICItV1JPTkcgTUVTU0FHRS0iOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgodmFsdWUgPSAiL2ZvbyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb28gZXh0ZW5kcyBTdXBlckZvbyBpbXBsZW1lbnRzIEZvb2FibGUgeworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuICJIZWxsbyEiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIaSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiSGkhIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2hhdHNVcCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiV2hhdCdzIHVwPyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiaHlwZXJCYXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHlwZXJCYXIgeworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdXBlckJhciBleHRlbmRzIEh5cGVyQmFyIHsKKyAgICB9CisKKyAgICBAUGF0aCgiYmFyYWJsZSIpCisgICAgcHVibGljIGludGVyZmFjZSBCYXJhYmxlIHsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFyIGV4dGVuZHMgU3VwZXJCYXIgaW1wbGVtZW50cyBCYXJhYmxlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImJhciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgd2hlbiB0aGVyZSBhcmUgY29uZmxpY3RpbmcgYW5ub3RhdGlvbnMgb24gdGhlIG1ldGhvZHMsIHRoZSBhbm5vdGF0aW9ucyBpbiB0aGUgc3VwZXJjbGFzcyBoYXMgaGlnaGVyCisgICAgICogcHJpb3JpdHkgdGhhbiB0aGUgb25lIGluIHRoZSBpbnRlcmZhY2UuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwZXJDbGFzc1ByZWNlZGVuY2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdXBlckNsYXNzUmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJmb28vc3VwZXJGb29IZWxsbyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBwYXRoIGZyb20gdGhlIHN1cGVyLWNsYXNzIGFubm90YXRpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcGF0aCBmcm9tIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgIkhlbGxvISIsIHN1cGVyQ2xhc3NSZXNwb25zZSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgaWZhY2VSZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImZvby9mb29hYmxlSGVsbG8iKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBwYXRoIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSBhbm5vdGF0aW9uIHNob3VsZCBub3QgZXhpc3QuIiwgNDA0LCBpZmFjZVJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgdGhlIGFubm90YXRpb24gaXMgaW5oZXJpdGVkIGZyb20gdGhlIGludGVyZmFjZSwgaWYgaXQgY2Fubm90IGJlIGZvdW5kIGluIHRoZSBjaGFpbiBvZiBzdXBlcmNsYXNzZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlQW5ub3RhdGlvbkluaGVyaXRhbmNlKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJmb28vZm9vYWJsZUhpIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHBhdGggZnJvbSB0aGUgc3VwZXItY2xhc3MgYW5ub3RhdGlvbiBzaG91bGQgaW5oZXJpdGVkLiIsCisgICAgICAgICAgICAgICAgIkhpISIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgaWYgdGhlIGFubm90YXRpb24gaXMgbm90IGZvdW5kIGluIHRoZSBjaGFpbiBvZiBzdXBlcmNsYXNzZXMsIGl0IGlzIGluaGVyaXRlZCBmcm9tIHRoZSBpbnRlcmZhY2UsIHRoYXQKKyAgICAgKiBpcyAibmVhcmVzdCIgaXRvIHRoZSBjbGFzcy4gSW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UgLSBzdXBlcmNsYXNzZXMgZG8gbm90IGhhdmUgYW5ub3RhdGlvbiwKKyAgICAgKiB0aGF0IGNvdWxkIGJlIGluaGVyaXRlZCwgbmVpdGhlciBkb2VzIHRoZSBpbnRlcmZhY2UgZGlyZWN0bHkgaW1wbGVtZW50ZWQgYnkgdGhlIGNsYXNzLCBzbyB0aGUgdGVzdCBleHBlY3RzIHRoZQorICAgICAqIGFubm90YXRpb24gdG8gYmUgaW5oZXJpdGVkIGZyb20gdGhlIGludGVyZmFjZSBvZiB0aGUgc3VwZXJjbGFzcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmhlcml0ZW5jZUZyb21TdXBlcmNsYXNzSW50ZXJmYWNlKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJmb28vc3VwZXJGb29hYmxlV2hhdHNVcCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBwYXRoIGZyb20gdGhlIGludGVyZmFjZSBvZiB0aGUgc3VwZXJjbGFzcyBzaG91bGQgaW5oZXJpdGVkLiIsCisgICAgICAgICAgICAgICAgIldoYXQncyB1cD8iLCByZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGNsYXNzLWxldmVsIGFubm90YXRpb24gYmVoYXZlIGluIHRoZSBzaW1pbGFyIG1hbm5lciBhcyB0aGUgbWV0aG9kLWxldmVsIGFubm90YXRpb25zLCBhbHRob3VnaCB0aGlzCisgICAgICogYmVoYXZpb3VyIGlzIG5vdCBkaXJlY3RseSBzcGVjaWZpZWQgaW4gdGhlIEpTUi0zMzkgKGluIHRoZSBDaGFwdGVyIDMuNi4sIHRoZSBzcGVjaWZpY2F0aW9uIGV4cGxpY2l0bHkgc3RhdGVzCisgICAgICogdGhhdCAiTm90ZSB0aGF0IGluaGVyaXRhbmNlIG9mIGNsYXNzIG9yIGludGVyZmFjZSBhbm5vdGF0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIi4KKyAgICAgKgorICAgICAqIEplcnNleSBkb2VzIHN1cHBvcnQgY2xhc3MtbGV2ZWwgYW5ub3RhdGlvbnMgaW5oZXJpdGFuY2UgYXMgaXRzIHNwZWNpZmljIGJlaGF2aW91ciBiZXlvbmQgdGhlIEpTUiBzY29wZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0Fubm90YXRpb25Jbmhlcml0YW5jZSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN1cGVyQ2xhc3NSZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImh5cGVyQmFyL2JhciIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBwYXRoIGZyb20gdGhlIHN1cGVyY2xhc3MgYW5ub3RhdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwYXRoIGZyb20gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAiYmFyIiwgc3VwZXJDbGFzc1Jlc3BvbnNlKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBpZmFjZVJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYmFyYWJsZS9iYXIiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBwYXRoIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSBhbm5vdGF0aW9uIHNob3VsZCBub3QgZXhpc3QuIiwgNDA0LCBpZmFjZVJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0NhY2hlQ29udHJvbEltcGxUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ2FjaGVDb250cm9sSW1wbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzhjOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0NhY2hlQ29udHJvbEltcGxUZXN0LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5DYWNoZUNvbnRyb2w7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkNhY2hlQ29udHJvbFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqLworcHVibGljIGNsYXNzIENhY2hlQ29udHJvbEltcGxUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBDYWNoZUNvbnRyb2xQcm92aWRlciBwID0gbmV3IENhY2hlQ29udHJvbFByb3ZpZGVyKCk7CisgICAgICAgIENhY2hlQ29udHJvbCBpbnN0YW5jZSA9IG5ldyBDYWNoZUNvbnRyb2woKTsKKworICAgICAgICBpbnN0YW5jZS5zZXROb0NhY2hlKHRydWUpOworICAgICAgICBTdHJpbmcgZXhwUmVzdWx0ID0gIm5vLWNhY2hlLCBuby10cmFuc2Zvcm0iOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcC50b1N0cmluZyhpbnN0YW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisKKyAgICAgICAgaW5zdGFuY2Uuc2V0Tm9TdG9yZSh0cnVlKTsKKyAgICAgICAgZXhwUmVzdWx0ID0gIm5vLWNhY2hlLCBuby1zdG9yZSwgbm8tdHJhbnNmb3JtIjsKKyAgICAgICAgcmVzdWx0ID0gcC50b1N0cmluZyhpbnN0YW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisKKyAgICAgICAgaW5zdGFuY2Uuc2V0UHJpdmF0ZSh0cnVlKTsKKyAgICAgICAgZXhwUmVzdWx0ID0gInByaXZhdGUsIG5vLWNhY2hlLCBuby1zdG9yZSwgbm8tdHJhbnNmb3JtIjsKKyAgICAgICAgcmVzdWx0ID0gcC50b1N0cmluZyhpbnN0YW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisKKyAgICAgICAgaW5zdGFuY2UuZ2V0UHJpdmF0ZUZpZWxkcygpLmFkZCgiRnJlZCIpOworICAgICAgICBleHBSZXN1bHQgPSAicHJpdmF0ZT1cIkZyZWRcIiwgbm8tY2FjaGUsIG5vLXN0b3JlLCBuby10cmFuc2Zvcm0iOworICAgICAgICByZXN1bHQgPSBwLnRvU3RyaW5nKGluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKyAgICAgICAgaW5zdGFuY2UuZ2V0UHJpdmF0ZUZpZWxkcygpLmFkZCgiQm9iIik7CisgICAgICAgIGV4cFJlc3VsdCA9ICJwcml2YXRlPVwiRnJlZCwgQm9iXCIsIG5vLWNhY2hlLCBuby1zdG9yZSwgbm8tdHJhbnNmb3JtIjsKKyAgICAgICAgcmVzdWx0ID0gcC50b1N0cmluZyhpbnN0YW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisKKyAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ2FjaGVDb250cm9sKCk7CisgICAgICAgIGluc3RhbmNlLmdldENhY2hlRXh0ZW5zaW9uKCkucHV0KCJrZXkxIiwgInZhbHVlMSIpOworICAgICAgICBleHBSZXN1bHQgPSAibm8tdHJhbnNmb3JtLCBrZXkxPXZhbHVlMSI7CisgICAgICAgIHJlc3VsdCA9IHAudG9TdHJpbmcoaW5zdGFuY2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCByZXN1bHQpOworICAgICAgICBpbnN0YW5jZS5nZXRDYWNoZUV4dGVuc2lvbigpLnB1dCgia2V5MSIsICJ2YWx1ZTEgd2l0aCBzcGFjZXMiKTsKKyAgICAgICAgZXhwUmVzdWx0ID0gIm5vLXRyYW5zZm9ybSwga2V5MT1cInZhbHVlMSB3aXRoIHNwYWNlc1wiIjsKKyAgICAgICAgcmVzdWx0ID0gcC50b1N0cmluZyhpbnN0YW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisKKyAgICAgICAgaW5zdGFuY2Uuc2V0Tm9TdG9yZSh0cnVlKTsKKyAgICAgICAgZXhwUmVzdWx0ID0gIm5vLXN0b3JlLCBuby10cmFuc2Zvcm0sIGtleTE9XCJ2YWx1ZTEgd2l0aCBzcGFjZXNcIiI7CisgICAgICAgIHJlc3VsdCA9IHAudG9TdHJpbmcoaW5zdGFuY2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCByZXN1bHQpOworCisgICAgICAgIGluc3RhbmNlID0gbmV3IENhY2hlQ29udHJvbCgpOworICAgICAgICBpbnN0YW5jZS5nZXRDYWNoZUV4dGVuc2lvbigpLnB1dCgia2V5MSIsIG51bGwpOworICAgICAgICBleHBSZXN1bHQgPSAibm8tdHJhbnNmb3JtLCBrZXkxIjsKKyAgICAgICAgcmVzdWx0ID0gcC50b1N0cmluZyhpbnN0YW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um91bmRUcmlwKCkgeworICAgICAgICBjaGVja1JvdW5kVHJpcCgibm8tY2FjaGUsIG5vLXRyYW5zZm9ybSIpOworICAgICAgICBjaGVja1JvdW5kVHJpcCgibm8tY2FjaGUsIG5vLXN0b3JlLCBuby10cmFuc2Zvcm0iKTsKKyAgICAgICAgY2hlY2tSb3VuZFRyaXAoInByaXZhdGUsIG5vLWNhY2hlLCBuby1zdG9yZSwgbm8tdHJhbnNmb3JtIik7CisgICAgICAgIGNoZWNrUm91bmRUcmlwKCJwcml2YXRlPVwiRnJlZFwiLCBuby1jYWNoZSwgbm8tc3RvcmUsIG5vLXRyYW5zZm9ybSIpOworICAgICAgICBjaGVja1JvdW5kVHJpcCgicHJpdmF0ZT1cIkZyZWQsIEJvYlwiLCBuby1jYWNoZSwgbm8tc3RvcmUsIG5vLXRyYW5zZm9ybSIpOworICAgICAgICBjaGVja1JvdW5kVHJpcCgibm8tdHJhbnNmb3JtLCBrZXkxPXZhbHVlMSIpOworICAgICAgICBjaGVja1JvdW5kVHJpcCgibm8tdHJhbnNmb3JtLCBrZXkxPVwidmFsdWUxIHdpdGggc3BhY2VzXCIiKTsKKyAgICAgICAgY2hlY2tSb3VuZFRyaXAoIm5vLXN0b3JlLCBuby10cmFuc2Zvcm0sIGtleTE9XCJ2YWx1ZTEgd2l0aCBzcGFjZXNcIiIpOworICAgICAgICBjaGVja1JvdW5kVHJpcCgibm8tdHJhbnNmb3JtLCBrZXkxIik7CisgICAgICAgIGNoZWNrUm91bmRUcmlwKCJtdXN0LXJldmFsaWRhdGUsIHByb3h5LXJldmFsaWRhdGUiKTsKKyAgICAgICAgY2hlY2tSb3VuZFRyaXAoIm1heC1hZ2U9MSwgcy1tYXhhZ2U9MSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1JvdW5kVHJpcChTdHJpbmcgcykgeworICAgICAgICBDYWNoZUNvbnRyb2xQcm92aWRlciBwID0gbmV3IENhY2hlQ29udHJvbFByb3ZpZGVyKCk7CisKKyAgICAgICAgQ2FjaGVDb250cm9sIGNjMSA9IHAuZnJvbVN0cmluZyhzKTsKKyAgICAgICAgQ2FjaGVDb250cm9sIGNjMiA9IHAuZnJvbVN0cmluZyhjYzEudG9TdHJpbmcoKSk7CisgICAgICAgIGNjMi50b1N0cmluZygpOworCisgICAgICAgIGNjMS5lcXVhbHMoY2MyKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNjMSwgY2MyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ2xpZW50SW52b2NhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9DbGllbnRJbnZvY2F0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMGYwZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ2xpZW50SW52b2NhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQXN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICoge0BsaW5rIEludm9jYXRpb259IEUyRSBBUEkgdGVzdHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRJbnZvY2F0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVk9DQVRJT05TID0gNTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU3luY0ludm9rZXJDYWxscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgpLnJlcXVlc3QoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdC5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU3luY0ludm9rZXJDYWxsc0FzU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LmdldChTdHJpbmcuY2xhc3MpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVN5bmNJbnZva2VyQ2FsbHNBc0dlbmVyaWNUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LmdldChuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHt9KSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTeW5jSW52b2tlckNhbGxzV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgpLnJlcXVlc3QoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSAiTWVzc2FnZTogIiArIGk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QucG9zdChFbnRpdHkudGV4dChlbnRpdHkpKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKGVudGl0eSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTeW5jSW52b2tlckNhbGxzQXNTdHJpbmdXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9ICJNZXNzYWdlOiAiICsgaTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdC5wb3N0KEVudGl0eS50ZXh0KGVudGl0eSksIFN0cmluZy5jbGFzcyksIGlzKGVudGl0eSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTeW5jSW52b2tlckNhbGxzQXNHZW5lcmljVHlwZVdpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gIk1lc3NhZ2U6ICIgKyBpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LnBvc3QoRW50aXR5LnRleHQoZW50aXR5KSwgbmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7fSksIGlzKGVudGl0eSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVBc3luY0ludm9rZXJDYWxscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBc3luY0ludm9rZXIgcmVxdWVzdCA9IHRhcmdldCgpLnJlcXVlc3QoKS5hc3luYygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LmdldCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVBc3luY0ludm9rZXJDYWxsc0FzU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jSW52b2tlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmFzeW5jKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QuZ2V0KFN0cmluZy5jbGFzcykuZ2V0KCksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXN5bmNJbnZva2VyQ2FsbHNBc0dlbmVyaWNUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jSW52b2tlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmFzeW5jKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QuZ2V0KG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkge30pLmdldCgpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFzeW5jSW52b2tlckNhbGxzV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBc3luY0ludm9rZXIgcmVxdWVzdCA9IHRhcmdldCgpLnJlcXVlc3QoKS5hc3luYygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9ICJNZXNzYWdlOiAiICsgaTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdC5wb3N0KEVudGl0eS50ZXh0KGVudGl0eSkpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoZW50aXR5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFzeW5jSW52b2tlckNhbGxzQXNTdHJpbmdXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jSW52b2tlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmFzeW5jKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gIk1lc3NhZ2U6ICIgKyBpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LnBvc3QoRW50aXR5LnRleHQoZW50aXR5KSwgU3RyaW5nLmNsYXNzKS5nZXQoKSwgaXMoZW50aXR5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFzeW5jSW52b2tlckNhbGxzQXNHZW5lcmljVHlwZVdpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNJbnZva2VyIHJlcXVlc3QgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYXN5bmMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSAiTWVzc2FnZTogIiArIGk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QucG9zdChFbnRpdHkudGV4dChlbnRpdHkpLCBuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHt9KS5nZXQoKSwgaXMoZW50aXR5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25JbnZva2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZEdldCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLmludm9rZSgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uSW52b2tlc0FzU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZEdldCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLmludm9rZShTdHJpbmcuY2xhc3MpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25JbnZva2VzQXNHZW5lcmljVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uIGludm9jYXRpb24gPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRHZXQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW52b2NhdGlvbi5pbnZva2UobmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7fSksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW52b2NhdGlvbkludm9rZXNXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZFBvc3QoRW50aXR5LnRleHQoIk9LIikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLmludm9rZSgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uSW52b2tlc0FzU3RyaW5nV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uIGludm9jYXRpb24gPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRQb3N0KEVudGl0eS50ZXh0KCJPSyIpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW52b2NhdGlvbi5pbnZva2UoU3RyaW5nLmNsYXNzKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uSW52b2tlc0FzR2VuZXJpY1R5cGVXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZFBvc3QoRW50aXR5LnRleHQoIk9LIikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLmludm9rZShuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHt9KSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uU3VibWl0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uIGludm9jYXRpb24gPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRHZXQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW52b2NhdGlvbi5zdWJtaXQoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW52b2NhdGlvblN1Ym1pdHNBc1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uIGludm9jYXRpb24gPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRHZXQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW52b2NhdGlvbi5zdWJtaXQoU3RyaW5nLmNsYXNzKS5nZXQoKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uU3VibWl0c0FzR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gdGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkR2V0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGludm9jYXRpb24uc3VibWl0KG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkge30pLmdldCgpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhbGxiYWNrSW52b2NhdGlvblN1Ym1pdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gdGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkR2V0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IHJlc3BvbnNlID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisKKyAgICAgICAgICAgIGludm9jYXRpb24uc3VibWl0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0KHMpOworICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXQodGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBsYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0KCksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW52b2NhdGlvblN1Ym1pdHNXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZFBvc3QoRW50aXR5LnRleHQoIk9LIikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLnN1Ym1pdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uU3VibWl0c0FzU3RyaW5nV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uIGludm9jYXRpb24gPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRQb3N0KEVudGl0eS50ZXh0KCJPSyIpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW52b2NhdGlvbi5zdWJtaXQoU3RyaW5nLmNsYXNzKS5nZXQoKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uU3VibWl0c0FzR2VuZXJpY1R5cGVXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZFBvc3QoRW50aXR5LnRleHQoIk9LIikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLnN1Ym1pdChuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHt9KS5nZXQoKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDYWxsYmFja0ludm9jYXRpb25TdWJtaXRzV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uIGludm9jYXRpb24gPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRQb3N0KEVudGl0eS50ZXh0KCJPSyIpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4gcmVzcG9uc2UgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKworICAgICAgICAgICAgaW52b2NhdGlvbi5zdWJtaXQobmV3IEludm9jYXRpb25DYWxsYmFjazxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBTdHJpbmcgcykgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXQocyk7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldCh0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXQoKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ29uc3RydWN0b3JTZWxlY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ29uc3RydWN0b3JTZWxlY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjNGQxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db25zdHJ1Y3RvclNlbGVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFRlc3QgdG8gdmVyaWZ5IHRoZSBwcm9wZXIgY29uc3RydWN0b3IgaXMgc2VsZWN0ZWQuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENvbnN0cnVjdG9yU2VsZWN0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgLyoqCisgICAgICogQSByZXNvdXJjZSB3aXRoIG11bHRpcGxlIGNvbnN0cnVjdG9ycy4KKyAgICAgKi8KKyAgICBAUGF0aCgicmVzb3VyY2UtdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdWx0aXBsZUNvbnN0cnVjdG9yUmVzb3VyY2UgeworICAgICAgICBwcml2YXRlIEh0dHBIZWFkZXJzIGhlYWRlcnM7CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyBpbmZvOworICAgICAgICBwcml2YXRlIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworICAgICAgICBwcml2YXRlIFJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcHJpdmF0ZSBQcm92aWRlcnMgcHJvdmlkZXI7CisKKyAgICAgICAgcHVibGljIE11bHRpcGxlQ29uc3RydWN0b3JSZXNvdXJjZSgpeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE11bHRpcGxlQ29uc3RydWN0b3JSZXNvdXJjZShAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKXsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBNdWx0aXBsZUNvbnN0cnVjdG9yUmVzb3VyY2UoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIGluZm8peworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXVsdGlwbGVDb25zdHJ1Y3RvclJlc291cmNlKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKXsKKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE11bHRpcGxlQ29uc3RydWN0b3JSZXNvdXJjZShAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QpeworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE11bHRpcGxlQ29uc3RydWN0b3JSZXNvdXJjZShAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgUHJvdmlkZXJzIHByb3ZpZGVyKXsKKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGlzVXNlZENvbnN0cnVjdG9yV2l0aE1vc3RBdHRyaWJ1dGVzKCl7CisgICAgICAgICAgICBib29sZWFuIG9rID0gYXBwbGljYXRpb24gIT0gbnVsbDsKKyAgICAgICAgICAgIG9rICY9IGhlYWRlcnMgIT0gbnVsbDsKKyAgICAgICAgICAgIG9rICY9IGluZm8gIT0gbnVsbDsKKyAgICAgICAgICAgIG9rICY9IHJlcXVlc3QgIT0gbnVsbDsKKyAgICAgICAgICAgIG9rICY9IHByb3ZpZGVyID09IG51bGw7CisgICAgICAgICAgICBSZXNwb25zZS5TdGF0dXMgc3RhdHVzID0gb2sgPyBSZXNwb25zZS5TdGF0dXMuT0sgOiBSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciB3aXRoIG11bHRpcGxlIGNvbnN0cnVjdG9ycy4KKyAgICAgKi8KKyAgICBAUHJvdmlkZXIKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxTdHJpbmc+IHsKKyAgICAgICAgcHJpdmF0ZSBIdHRwSGVhZGVycyBoZWFkZXJzOworICAgICAgICBwcml2YXRlIFVyaUluZm8gaW5mbzsKKyAgICAgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBSZXF1ZXN0IHJlcXVlc3Q7CisgICAgICAgIHByaXZhdGUgUHJvdmlkZXJzIHByb3ZpZGVyczsKKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nUmVhZGVyKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsIEBDb250ZXh0IFVyaUluZm8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFByb3ZpZGVycyBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHByb3ZpZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdSZWFkZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywgQENvbnRleHQgVXJpSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nUmVhZGVyKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsIEBDb250ZXh0IFVyaUluZm8gaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZ1JlYWRlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzLCBAQ29udGV4dCBVcmlJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdSZWFkZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZyb20oQ2xhc3M8U3RyaW5nPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXJzID09IG51bGwgfHwgaW5mbyA9PSBudWxsIHx8IGFwcGxpY2F0aW9uID09IG51bGwgfHwgcmVxdWVzdCA9PSBudWxsIHx8IHByb3ZpZGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJmYWlsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAicGFzcyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicHJvdmlkZXItdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm92aWRlclJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNdWx0aXBsZUNvbnN0cnVjdG9yUmVzb3VyY2UuY2xhc3MsIFByb3ZpZGVyUmVzb3VyY2UuY2xhc3MsIFN0cmluZ1JlYWRlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkVSU0VZLTE1MjkgcmVwcm9kdWNlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNvbnN0cnVjdG9yU2VsZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UtdGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXR1cm5lZCByZXNwb25zZSBtdXN0IG5vdCBiZSBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXNvdXJjZSBjb25zdHJ1Y3RvciB3aXRoIG1vc3QgYXJndW1lbnRzIGhhcyBub3QgYmVlbiBzZWxlY3RlZC4iLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMTcxMiByZXByb2R1Y2VyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyQ29uc3RydWN0b3JTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJwcm92aWRlci10ZXN0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoImVjaG8iKSk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmV0dXJuZWQgcmVzcG9uc2UgbXVzdCBub3QgYmUgbnVsbC4iLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXNzIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ29uc3VtZVByb2R1Y2VUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ29uc3VtZVByb2R1Y2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5NDY2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db25zdW1lUHJvZHVjZVRlc3QuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdW1lUHJvZHVjZVRlc3QgeworICAgIEBDb25zdW1lcyh7IiovKiIsICJhLyoiLCAiYi8qIiwgImEvYiIsICJjL2QifSkKKyAgICBjbGFzcyBDb25zdW1lc0NsYXNzIHsKKyAgICB9CisKKyAgICBAUHJvZHVjZXMgKHsiKi8qIiwgImEvKiIsICJiLyoiLCAiYS9iIiwgImMvZCJ9KQorICAgIGNsYXNzIFByb2R1Y2VzQ2xhc3MgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN1bWVzKCkgeworICAgICAgICBmaW5hbCBDb25zdW1lcyBjID0gQ29uc3VtZXNDbGFzcy5jbGFzcy5nZXRBbm5vdGF0aW9uKENvbnN1bWVzLmNsYXNzKTsKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGwgPSBNZWRpYVR5cGVzLmNyZWF0ZUZyb20oYyk7CisgICAgICAgIGNoZWNrTWVkaWFUeXBlcyhsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlcygpIHsKKyAgICAgICAgZmluYWwgUHJvZHVjZXMgcCA9IFByb2R1Y2VzQ2xhc3MuY2xhc3MuZ2V0QW5ub3RhdGlvbihQcm9kdWNlcy5jbGFzcyk7CisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBsID0gTWVkaWFUeXBlcy5jcmVhdGVGcm9tKHApOworICAgICAgICBjaGVja01lZGlhVHlwZXMobCk7CisgICAgfQorCisgICAgQENvbnN1bWVzKCIqLyosIGEvKiwgYi8qLCBhL2IsIGMvZCIpCisgICAgY2xhc3MgQ29uc3VtZXNTdHJpbmdDbGFzcyB7CisgICAgfQorCisgICAgQFByb2R1Y2VzKCIqLyosIGEvKiwgYi8qLCBhL2IsIGMvZCIpCisgICAgY2xhc3MgUHJvZHVjZXNTdHJpbmdDbGFzcyB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZXNTdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIENvbnN1bWVzIGMgPSBDb25zdW1lc1N0cmluZ0NsYXNzLmNsYXNzLmdldEFubm90YXRpb24oQ29uc3VtZXMuY2xhc3MpOworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbCA9IE1lZGlhVHlwZXMuY3JlYXRlRnJvbShjKTsKKyAgICAgICAgY2hlY2tNZWRpYVR5cGVzKGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2VzU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBQcm9kdWNlcyBwID0gUHJvZHVjZXNTdHJpbmdDbGFzcy5jbGFzcy5nZXRBbm5vdGF0aW9uKFByb2R1Y2VzLmNsYXNzKTsKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGwgPSBNZWRpYVR5cGVzLmNyZWF0ZUZyb20ocCk7CisgICAgICAgIGNoZWNrTWVkaWFUeXBlcyhsKTsKKyAgICB9CisKKyAgICBAQ29uc3VtZXMoeyIqLyosIGEvKiIsICJiLyosIGEvYiIsICJjL2QifSkKKyAgICBjbGFzcyBDb25zdW1lc1N0cmluZ3NDbGFzcyB7CisgICAgfQorCisgICAgQFByb2R1Y2VzKHsiKi8qLCBhLyoiLCAiYi8qLCBhL2IiLCAiYy9kIn0pCisgICAgY2xhc3MgUHJvZHVjZXNTdHJpbmdzQ2xhc3MgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN1bWVzU3RyaW5ncygpIHsKKyAgICAgICAgZmluYWwgQ29uc3VtZXMgYyA9IENvbnN1bWVzU3RyaW5nc0NsYXNzLmNsYXNzLmdldEFubm90YXRpb24oQ29uc3VtZXMuY2xhc3MpOworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbCA9IE1lZGlhVHlwZXMuY3JlYXRlRnJvbShjKTsKKyAgICAgICAgY2hlY2tNZWRpYVR5cGVzKGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2VzU3RyaW5ncygpIHsKKyAgICAgICAgZmluYWwgUHJvZHVjZXMgcCA9IFByb2R1Y2VzU3RyaW5nc0NsYXNzLmNsYXNzLmdldEFubm90YXRpb24oUHJvZHVjZXMuY2xhc3MpOworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbCA9IE1lZGlhVHlwZXMuY3JlYXRlRnJvbShwKTsKKyAgICAgICAgY2hlY2tNZWRpYVR5cGVzKGwpOworICAgIH0KKworCisgICAgdm9pZCBjaGVja01lZGlhVHlwZXMoZmluYWwgTGlzdDxNZWRpYVR5cGU+IGwpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGwuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgbC5nZXQoMCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgbC5nZXQoMCkuZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgbC5nZXQoMSkuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkIiwgbC5nZXQoMSkuZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgbC5nZXQoMikuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbC5nZXQoMikuZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgbC5nZXQoMykuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbC5nZXQoMykuZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbC5nZXQoNCkuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbC5nZXQoNCkuZ2V0U3VidHlwZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db250ZW50RGlzcG9zaXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ29udGVudERpc3Bvc2l0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjJjZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ29udGVudERpc3Bvc2l0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Db250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwRGF0ZUZvcm1hdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgSW1yYW5AU21hcnRJVEVuZ2luZWVyaW5nLkNvbQorICovCitwdWJsaWMgY2xhc3MgQ29udGVudERpc3Bvc2l0aW9uVGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnRlbnREaXNwb3NpdGlvblR5cGU7CisKKyAgICBwdWJsaWMgQ29udGVudERpc3Bvc2l0aW9uVGVzdCgpIHsKKyAgICAgICAgY29udGVudERpc3Bvc2l0aW9uVHlwZSA9ICJpbmxpbmUiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHsKKyAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uIGNvbnRlbnREaXNwb3NpdGlvbiA9IENvbnRlbnREaXNwb3NpdGlvbi50eXBlKG51bGwpLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50RGlzcG9zaXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgY29udGVudERpc3Bvc2l0aW9uLmdldFR5cGUoKSk7CisKKyAgICAgICAgY29udGVudERpc3Bvc2l0aW9uID0gQ29udGVudERpc3Bvc2l0aW9uLnR5cGUoY29udGVudERpc3Bvc2l0aW9uVHlwZSkuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRlbnREaXNwb3NpdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb250ZW50RGlzcG9zaXRpb25UeXBlLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0VHlwZSgpKTsKKworICAgICAgICBmaW5hbCBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICBjb250ZW50RGlzcG9zaXRpb24gPSBDb250ZW50RGlzcG9zaXRpb24udHlwZShjb250ZW50RGlzcG9zaXRpb25UeXBlKS5maWxlTmFtZSgidGVzdC5maWxlIikKKyAgICAgICAgICAgICAgICAuY3JlYXRpb25EYXRlKGRhdGUpLm1vZGlmaWNhdGlvbkRhdGUoZGF0ZSkucmVhZERhdGUoZGF0ZSkuc2l6ZSgxMjIyKS5idWlsZCgpOworCisgICAgICAgIGFzc2VydENvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24sIGRhdGUpOworICAgICAgICBTdHJpbmcgaGVhZGVyID0gY29udGVudERpc3Bvc2l0aW9uVHlwZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uID0gbmV3IENvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24udG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRlbnREaXNwb3NpdGlvbik7CisgICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb24gPSBuZXcgQ29udGVudERpc3Bvc2l0aW9uKGhlYWRlcik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRlbnREaXNwb3NpdGlvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGVudERpc3Bvc2l0aW9uVHlwZSwgY29udGVudERpc3Bvc2l0aW9uLmdldFR5cGUoKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZVN0cmluZyA9IEh0dHBEYXRlRm9ybWF0LmdldFByZWZlcnJlZERhdGVGb3JtYXQoKS5mb3JtYXQoZGF0ZSk7CisgICAgICAgICAgICBoZWFkZXIgPSBjb250ZW50RGlzcG9zaXRpb25UeXBlICsgIjtmaWxlbmFtZT1cInRlc3QuZmlsZVwiO2NyZWF0aW9uLWRhdGU9XCIiCisgICAgICAgICAgICAgICAgICAgICsgZGF0ZVN0cmluZyArICJcIjttb2RpZmljYXRpb24tZGF0ZT1cIiIgKyBkYXRlU3RyaW5nICsgIlwiO3JlYWQtZGF0ZT1cIiIKKyAgICAgICAgICAgICAgICAgICAgKyBkYXRlU3RyaW5nICsgIlwiO3NpemU9MTIyMiI7CisKKyAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbiA9IG5ldyBDb250ZW50RGlzcG9zaXRpb24oaGVhZGVyKTsKKyAgICAgICAgICAgIGFzc2VydENvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24sIGRhdGUpOworICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uID0gbmV3IENvbnRlbnREaXNwb3NpdGlvbihIdHRwSGVhZGVyUmVhZGVyLm5ld0luc3RhbmNlKGhlYWRlciksIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0Q29udGVudERpc3Bvc2l0aW9uKGNvbnRlbnREaXNwb3NpdGlvbiwgZGF0ZSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBDb250ZW50RGlzcG9zaXRpb24oKEh0dHBIZWFkZXJSZWFkZXIpIG51bGwsIHRydWUpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIGV4cGVjdGVkIHRvIGJlIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmYWlsKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICBmaW5hbCBDb250ZW50RGlzcG9zaXRpb24gY29udGVudERpc3Bvc2l0aW9uID0gQ29udGVudERpc3Bvc2l0aW9uLnR5cGUoY29udGVudERpc3Bvc2l0aW9uVHlwZSkuZmlsZU5hbWUoInRlc3QuZmlsZSIpCisgICAgICAgICAgICAgICAgLmNyZWF0aW9uRGF0ZShkYXRlKS5tb2RpZmljYXRpb25EYXRlKGRhdGUpLnJlYWREYXRlKGRhdGUpLnNpemUoMTIyMikuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVTdHJpbmcgPSBIdHRwRGF0ZUZvcm1hdC5nZXRQcmVmZXJyZWREYXRlRm9ybWF0KCkuZm9ybWF0KGRhdGUpOworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gY29udGVudERpc3Bvc2l0aW9uVHlwZSArICI7IGZpbGVuYW1lPVwidGVzdC5maWxlXCI7IGNyZWF0aW9uLWRhdGU9XCIiCisgICAgICAgICAgICAgICAgKyBkYXRlU3RyaW5nICsgIlwiOyBtb2RpZmljYXRpb24tZGF0ZT1cIiIgKyBkYXRlU3RyaW5nICsgIlwiOyByZWFkLWRhdGU9XCIiICsgZGF0ZVN0cmluZyArICJcIjsgc2l6ZT0xMjIyIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGhlYWRlciwgY29udGVudERpc3Bvc2l0aW9uLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRlbnREaXNwb3NpdGlvbihmaW5hbCBDb250ZW50RGlzcG9zaXRpb24gY29udGVudERpc3Bvc2l0aW9uLCBEYXRlIGRhdGUpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZW50RGlzcG9zaXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGVudERpc3Bvc2l0aW9uVHlwZSwgY29udGVudERpc3Bvc2l0aW9uLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC5maWxlIiwgY29udGVudERpc3Bvc2l0aW9uLmdldEZpbGVOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZS50b1N0cmluZygpLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZS50b1N0cmluZygpLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0UmVhZERhdGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGUudG9TdHJpbmcoKSwgY29udGVudERpc3Bvc2l0aW9uLmdldENyZWF0aW9uRGF0ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIyMiwgY29udGVudERpc3Bvc2l0aW9uLmdldFNpemUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ29va2llSW1wbFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db29raWVJbXBsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZTE0MzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ29va2llSW1wbFRlc3QuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5OZXdDb29raWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcmMgSGFkbGV5CisgKi8KK3B1YmxpYyBjbGFzcyBDb29raWVJbXBsVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVUb1N0cmluZygpIHsKKyAgICAgICAgQ29va2llIGNvb2tpZSA9IG5ldyBDb29raWUoImZyZWQiLCAiZmxpbnRzdG9uZSIpOworICAgICAgICBTdHJpbmcgZXhwUmVzdWx0ID0gIiRWZXJzaW9uPTE7ZnJlZD1mbGludHN0b25lIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgY29va2llLnRvU3RyaW5nKCkpOworCisgICAgICAgIGNvb2tpZSA9IG5ldyBDb29raWUoImZyZWQiLCAiZmxpbnRzdG9uZSIsICIvcGF0aCIsIG51bGwpOworICAgICAgICBleHBSZXN1bHQgPSAiJFZlcnNpb249MTtmcmVkPWZsaW50c3RvbmU7JFBhdGg9L3BhdGgiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCBjb29raWUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgY29va2llID0gbmV3IENvb2tpZSgiZnJlZCIsICJmbGludHN0b25lIiwgIi9wYXRoIiwgIi5zdW4uY29tIik7CisgICAgICAgIGV4cFJlc3VsdCA9ICIkVmVyc2lvbj0xO2ZyZWQ9ZmxpbnRzdG9uZTskRG9tYWluPS5zdW4uY29tOyRQYXRoPS9wYXRoIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgY29va2llLnRvU3RyaW5nKCkpOworCisgICAgICAgIGNvb2tpZSA9IG5ldyBDb29raWUoImZyZWQiLCAiZmxpbnRzdG9uZSIsICIvcGF0aCIsICIuc3VuLmNvbSIsIDIpOworICAgICAgICBleHBSZXN1bHQgPSAiJFZlcnNpb249MjtmcmVkPWZsaW50c3RvbmU7JERvbWFpbj0uc3VuLmNvbTskUGF0aD0vcGF0aCI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIGNvb2tpZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVWYWx1ZU9mKCkgeworICAgICAgICBDb29raWUgY29va2llID0gQ29va2llLnZhbHVlT2YoIiRWZXJzaW9uPTI7ZnJlZD1mbGludHN0b25lIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZnJlZCIsIGNvb2tpZS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZsaW50c3RvbmUiLCBjb29raWUuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjb29raWUuZ2V0VmVyc2lvbigpKTsKKworICAgICAgICBjb29raWUgPSBDb29raWUudmFsdWVPZigiJFZlcnNpb249MTtmcmVkPWZsaW50c3RvbmU7JFBhdGg9L3BhdGgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY29va2llLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxpbnRzdG9uZSIsIGNvb2tpZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvb2tpZS5nZXRWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoIiwgY29va2llLmdldFBhdGgoKSk7CisKKyAgICAgICAgY29va2llID0gQ29va2llLnZhbHVlT2YoIiRWZXJzaW9uPTE7ZnJlZD1mbGludHN0b25lOyREb21haW49LnN1bi5jb207JFBhdGg9L3BhdGgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY29va2llLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxpbnRzdG9uZSIsIGNvb2tpZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvb2tpZS5nZXRWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi5zdW4uY29tIiwgY29va2llLmdldERvbWFpbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aCIsIGNvb2tpZS5nZXRQYXRoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUNvb2tpZXMoKSB7CisgICAgICAgIFN0cmluZyBjb29raWVIZWFkZXIgPSAiZnJlZD1mbGludHN0b25lIjsKKyAgICAgICAgTWFwPFN0cmluZywgQ29va2llPiBjb29raWVzID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQ29va2llcyhjb29raWVIZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29va2llcy5zaXplKCksIDEpOworICAgICAgICBDb29raWUgYyA9IGNvb2tpZXMuZ2V0KCJmcmVkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMCk7CisgICAgICAgIGFzc2VydFRydWUoImZyZWQiLmVxdWFscyhjLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJmbGludHN0b25lIi5lcXVhbHMoYy5nZXRWYWx1ZSgpKSk7CisKKyAgICAgICAgY29va2llSGVhZGVyID0gImZyZWQ9ZmxpbnRzdG9uZSxiYXJuZXk9cnViYmxlIjsKKyAgICAgICAgY29va2llcyA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZENvb2tpZXMoY29va2llSGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvb2tpZXMuc2l6ZSgpLCAyKTsKKyAgICAgICAgYyA9IGNvb2tpZXMuZ2V0KCJmcmVkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMCk7CisgICAgICAgIGFzc2VydFRydWUoImZyZWQiLmVxdWFscyhjLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJmbGludHN0b25lIi5lcXVhbHMoYy5nZXRWYWx1ZSgpKSk7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiYmFybmV5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMCk7CisgICAgICAgIGFzc2VydFRydWUoImJhcm5leSIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoInJ1YmJsZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworCisgICAgICAgIGNvb2tpZUhlYWRlciA9ICJmcmVkPWZsaW50c3RvbmU7YmFybmV5PXJ1YmJsZSI7CisgICAgICAgIGNvb2tpZXMgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRDb29raWVzKGNvb2tpZUhlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb29raWVzLnNpemUoKSwgMik7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiZnJlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYy5nZXRWZXJzaW9uKCksIDApOworICAgICAgICBhc3NlcnRUcnVlKCJmcmVkIi5lcXVhbHMoYy5nZXROYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZmxpbnRzdG9uZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworICAgICAgICBjID0gY29va2llcy5nZXQoImJhcm5leSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYy5nZXRWZXJzaW9uKCksIDApOworICAgICAgICBhc3NlcnRUcnVlKCJiYXJuZXkiLmVxdWFscyhjLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJydWJibGUiLmVxdWFscyhjLmdldFZhbHVlKCkpKTsKKworICAgICAgICBjb29raWVIZWFkZXIgPSAiJFZlcnNpb249MTtmcmVkPWZsaW50c3RvbmU7JFBhdGg9L3BhdGg7YmFybmV5PXJ1YmJsZSI7CisgICAgICAgIGNvb2tpZXMgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRDb29raWVzKGNvb2tpZUhlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb29raWVzLnNpemUoKSwgMik7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiZnJlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYy5nZXRWZXJzaW9uKCksIDEpOworICAgICAgICBhc3NlcnRUcnVlKCJmcmVkIi5lcXVhbHMoYy5nZXROYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZmxpbnRzdG9uZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCIvcGF0aCIuZXF1YWxzKGMuZ2V0UGF0aCgpKSk7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiYmFybmV5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMSk7CisgICAgICAgIGFzc2VydFRydWUoImJhcm5leSIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoInJ1YmJsZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworCisgICAgICAgIGNvb2tpZUhlYWRlciA9ICIkVmVyc2lvbj0xO2ZyZWQ9ZmxpbnRzdG9uZTskUGF0aD0vcGF0aCxiYXJuZXk9cnViYmxlOyREb21haW49LnN1bi5jb20iOworICAgICAgICBjb29raWVzID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQ29va2llcyhjb29raWVIZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29va2llcy5zaXplKCksIDIpOworICAgICAgICBjID0gY29va2llcy5nZXQoImZyZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMuZ2V0VmVyc2lvbigpLCAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZnJlZCIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoImZsaW50c3RvbmUiLmVxdWFscyhjLmdldFZhbHVlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiL3BhdGgiLmVxdWFscyhjLmdldFBhdGgoKSkpOworICAgICAgICBjID0gY29va2llcy5nZXQoImJhcm5leSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYy5nZXRWZXJzaW9uKCksIDEpOworICAgICAgICBhc3NlcnRUcnVlKCJiYXJuZXkiLmVxdWFscyhjLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJydWJibGUiLmVxdWFscyhjLmdldFZhbHVlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiLnN1bi5jb20iLmVxdWFscyhjLmdldERvbWFpbigpKSk7CisKKyAgICAgICAgY29va2llSGVhZGVyID0gIiRWZXJzaW9uPTE7IGZyZWQgPSBmbGludHN0b25lIDsgJFBhdGg9L3BhdGgsIGJhcm5leT1ydWJibGUgOyREb21haW49LnN1bi5jb20iOworICAgICAgICBjb29raWVzID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQ29va2llcyhjb29raWVIZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29va2llcy5zaXplKCksIDIpOworICAgICAgICBjID0gY29va2llcy5nZXQoImZyZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMuZ2V0VmVyc2lvbigpLCAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZnJlZCIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoImZsaW50c3RvbmUiLmVxdWFscyhjLmdldFZhbHVlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiL3BhdGgiLmVxdWFscyhjLmdldFBhdGgoKSkpOworICAgICAgICBjID0gY29va2llcy5nZXQoImJhcm5leSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYy5nZXRWZXJzaW9uKCksIDEpOworICAgICAgICBhc3NlcnRUcnVlKCJiYXJuZXkiLmVxdWFscyhjLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJydWJibGUiLmVxdWFscyhjLmdldFZhbHVlKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiLnN1bi5jb20iLmVxdWFscyhjLmdldERvbWFpbigpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Q29va2llVG9TdHJpbmcoKSB7CisgICAgICAgIE5ld0Nvb2tpZSBjb29raWUgPSBuZXcgTmV3Q29va2llKCJmcmVkIiwgImZsaW50c3RvbmUiKTsKKyAgICAgICAgU3RyaW5nIGV4cFJlc3VsdCA9ICJmcmVkPWZsaW50c3RvbmU7VmVyc2lvbj0xIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgY29va2llLnRvU3RyaW5nKCkpOworCisgICAgICAgIGNvb2tpZSA9IG5ldyBOZXdDb29raWUoImZyZWQiLCAiZmxpbnRzdG9uZSIsIG51bGwsIG51bGwsIG51bGwsIDYwLCBmYWxzZSk7CisgICAgICAgIGV4cFJlc3VsdCA9ICJmcmVkPWZsaW50c3RvbmU7VmVyc2lvbj0xO01heC1BZ2U9NjAiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCBjb29raWUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgY29va2llID0gbmV3IE5ld0Nvb2tpZSgiZnJlZCIsICJmbGludHN0b25lIiwgbnVsbCwgbnVsbCwgImEgbW9kZXJuIHN0b25hZ2UgZmFtaWx5IiwgNjAsIGZhbHNlKTsKKyAgICAgICAgZXhwUmVzdWx0ID0gImZyZWQ9ZmxpbnRzdG9uZTtWZXJzaW9uPTE7Q29tbWVudD1cImEgbW9kZXJuIHN0b25hZ2UgZmFtaWx5XCI7TWF4LUFnZT02MCI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIGNvb2tpZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdDb29raWVWYWx1ZU9mKCkgeworICAgICAgICBOZXdDb29raWUgY29va2llID0gTmV3Q29va2llLnZhbHVlT2YoImZyZWQ9ZmxpbnRzdG9uZTtWZXJzaW9uPTIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY29va2llLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxpbnRzdG9uZSIsIGNvb2tpZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvb2tpZS5nZXRWZXJzaW9uKCkpOworCisgICAgICAgIGNvb2tpZSA9IE5ld0Nvb2tpZS52YWx1ZU9mKCJmcmVkPWZsaW50c3RvbmU7VmVyc2lvbj0xO01heC1BZ2U9NjAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY29va2llLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxpbnRzdG9uZSIsIGNvb2tpZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvb2tpZS5nZXRWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNjAsIGNvb2tpZS5nZXRNYXhBZ2UoKSk7CisKKyAgICAgICAgY29va2llID0gTmV3Q29va2llLnZhbHVlT2YoImZyZWQ9ZmxpbnRzdG9uZTtWZXJzaW9uPTE7Q29tbWVudD1cImEgbW9kZXJuIHN0b25hZ2UgZmFtaWx5XCI7TWF4LUFnZT02MDtTZWN1cmUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY29va2llLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxpbnRzdG9uZSIsIGNvb2tpZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIG1vZGVybiBzdG9uYWdlIGZhbWlseSIsIGNvb2tpZS5nZXRDb21tZW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29va2llLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2MCwgY29va2llLmdldE1heEFnZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb29raWUuaXNTZWN1cmUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvRW50aXR5VGFnUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvRW50aXR5VGFnUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2ZjgwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9FbnRpdHlUYWdQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRW50aXR5VGFnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5FbnRpdHlUYWdQcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqLworcHVibGljIGNsYXNzIEVudGl0eVRhZ1Byb3ZpZGVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ1dlYWsoKSB7CisgICAgICAgIGNoZWNrVG9TdHJpbmcobmV3IEVudGl0eVRhZygiSGVsbG8gXCJXb3JsZFwiIiwgdHJ1ZSksICJXL1wiSGVsbG8gXFxcIldvcmxkXFxcIlwiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdTdHJvbmcoKSB7CisgICAgICAgIGNoZWNrVG9TdHJpbmcobmV3IEVudGl0eVRhZygiSGVsbG8gXCJXb3JsZFwiIiksICJcIkhlbGxvIFxcXCJXb3JsZFxcXCJcIiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyb21TdHJpbmdXZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrRnJvbVN0cmluZygiVy9cIkhlbGxvIFxcXCJXb3JsZFxcXCJcIiIsIG5ldyBFbnRpdHlUYWcoIkhlbGxvIFwiV29ybGRcIiIsIHRydWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tU3RyaW5nU3Ryb25nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrRnJvbVN0cmluZygiXCJIZWxsbyBcXFwiV29ybGRcXFwiXCIiLCBuZXcgRW50aXR5VGFnKCJIZWxsbyBcIldvcmxkXCIiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVG9TdHJpbmcoZmluYWwgRW50aXR5VGFnIGUsIGZpbmFsIFN0cmluZyByZXN1bHQpIHsKKyAgICAgICAgZmluYWwgRW50aXR5VGFnUHJvdmlkZXIgaW5zdGFuY2UgPSBuZXcgRW50aXR5VGFnUHJvdmlkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgaW5zdGFuY2UudG9TdHJpbmcoZSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrRnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgZSwgZmluYWwgRW50aXR5VGFnIHJlc3VsdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEVudGl0eVRhZ1Byb3ZpZGVyIGluc3RhbmNlID0gbmV3IEVudGl0eVRhZ1Byb3ZpZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQsIGluc3RhbmNlLmZyb21TdHJpbmcoZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9FeGNlcHRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDhiOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuQ2xpZW50RXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuQ29va2llUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk1hdHJpeFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEFjY2VwdGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RBdXRob3JpemVkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlJlZGlyZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogRXhjZXB0aW9uIHRocm93aW5nIGFuZCBoYW5kbGluZyByZWxhdGVkIHRlc3RzOyBzdWNoIGFzCisgKiB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGhhbmRsaW5nIG9uIGJvdGggc2VydmVyIGFuZCBjbGllbnQgc2lkZSwKKyAqIHByb3BlciBleGNlcHRpb24gdGhyb3dpbmcgZXRjLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbkRyaXZlblJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc3BvbnNlRHJpdmVuUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgLy8gSkVSU0VZLTE1MzIKKyAgICAgICAgICAgICAgICBOb25XYWVUaHJvd2luZ0NvbnZlcnRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2UxLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTIuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlMy5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2U0LmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTUuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlNi5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2U3LmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTguY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlOS5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2UxMC5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlTWV0aG9kVGVzdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFdhZVRocm93aW5nQ29udmVydGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTEuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlMi5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2UzLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTQuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlNS5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2U2LmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTcuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlOC5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2U5LmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTEwLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVNZXRob2RUZXN0UmVzb3VyY2UuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCBmYWxzZSk7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIFVSSSB0ZXN0VXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vamVyc2V5LmphdmEubmV0IikuYnVpbGQoKTsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJUaHJvd2FibGVSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkIikKKyAgICBzdGF0aWMgTWFwPFN0cmluZywgV2ViQXBwbGljYXRpb25FeGNlcHRpb24+IEV4Y2VwdGlvbk1BUCA9IG5ldyBIYXNoTWFwPFN0cmluZywgV2ViQXBwbGljYXRpb25FeGNlcHRpb24+KCkge3sKKyAgICAgICAgcHV0KCIzMDEiLCBuZXcgUmVkaXJlY3Rpb25FeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLk1PVkVEX1BFUk1BTkVOVExZLCB0ZXN0VXJpKSk7CisgICAgICAgIHB1dCgiMzAyIiwgbmV3IFJlZGlyZWN0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5GT1VORCwgdGVzdFVyaSkpOworICAgICAgICBwdXQoIjMwMyIsIG5ldyBSZWRpcmVjdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuU0VFX09USEVSLCB0ZXN0VXJpKSk7CisgICAgICAgIHB1dCgiMzA3IiwgbmV3IFJlZGlyZWN0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5URU1QT1JBUllfUkVESVJFQ1QsIHRlc3RVcmkpKTsKKyAgICAgICAgcHV0KCI0MDAiLCBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigpKTsKKyAgICAgICAgcHV0KCI0MDEiLCBuZXcgTm90QXV0aG9yaXplZEV4Y2VwdGlvbigiY2hhbGxlbmdlIikpOworICAgICAgICBwdXQoIjQwMiIsIG5ldyBDbGllbnRFcnJvckV4Y2VwdGlvbig0MDIpKTsKKyAgICAgICAgcHV0KCI0MDQiLCBuZXcgTm90Rm91bmRFeGNlcHRpb24oKSk7CisgICAgICAgIHB1dCgiNDA1IiwgbmV3IE5vdEFsbG93ZWRFeGNlcHRpb24oIk9QVElPTlMiKSk7CisgICAgICAgIHB1dCgiNDA2IiwgbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oKSk7CisgICAgICAgIHB1dCgiNDE1IiwgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpKTsKKyAgICAgICAgcHV0KCI1MDAiLCBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbigpKTsKKyAgICAgICAgcHV0KCI1MDEiLCBuZXcgU2VydmVyRXJyb3JFeGNlcHRpb24oNTAxKSk7CisgICAgICAgIHB1dCgiNTAzIiwgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbigpKTsKKyAgICB9fTsKKworICAgIHN0YXRpYyBNYXA8U3RyaW5nLCBSZXNwb25zZT4gUmVzcG9uc2VNQVAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlc3BvbnNlPigpIHt7CisgICAgICAgIHB1dCgiMzAxIiwgUmVzcG9uc2Uuc3RhdHVzKDMwMSkubG9jYXRpb24odGVzdFVyaSkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiMzAyIiwgUmVzcG9uc2Uuc3RhdHVzKDMwMikubG9jYXRpb24odGVzdFVyaSkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiMzAzIiwgUmVzcG9uc2Uuc2VlT3RoZXIodGVzdFVyaSkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiMzA3IiwgUmVzcG9uc2UudGVtcG9yYXJ5UmVkaXJlY3QodGVzdFVyaSkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiNDAwIiwgUmVzcG9uc2Uuc3RhdHVzKDQwMCkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiNDAxIiwgUmVzcG9uc2Uuc3RhdHVzKDQwMSkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiNDAyIiwgUmVzcG9uc2Uuc3RhdHVzKDQwMikuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiNDA0IiwgUmVzcG9uc2Uuc3RhdHVzKDQwNCkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiNDA1IiwgUmVzcG9uc2Uuc3RhdHVzKDQwNSkuYWxsb3coIk9QVElPTlMiKS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCI0MDYiLCBSZXNwb25zZS5zdGF0dXMoNDA2KS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCI0MTUiLCBSZXNwb25zZS5zdGF0dXMoNDE1KS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCI1MDAiLCBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmJ1aWxkKCkpOworICAgICAgICBwdXQoIjUwMSIsIFJlc3BvbnNlLnN0YXR1cyg1MDEpLmJ1aWxkKCkpOworICAgICAgICBwdXQoIjUwMyIsIFJlc3BvbnNlLnN0YXR1cyg1MDMpLmJ1aWxkKCkpOworICAgIH19OworCisgICAgQFBhdGgoImV4Y2VwdGlvbkRyaXZlbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25Ecml2ZW5SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie3N0YXR1c30iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAUGF0aFBhcmFtKCJzdGF0dXMiKSBTdHJpbmcgc3RhdHVzKSB7CisgICAgICAgICAgICB0aHJvdyBFeGNlcHRpb25NQVAuZ2V0KHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzcG9uc2VEcml2ZW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VEcml2ZW5SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie3N0YXR1c30iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KEBQYXRoUGFyYW0oInN0YXR1cyIpIFN0cmluZyBzdGF0dXMpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZU1BUC5nZXQoc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFN0YXR1c0NvZGUoZmluYWwgU3RyaW5nIHN0YXR1cykgeworICAgICAgICBfdGVzdFN0YXR1c0NvZGVWaWFFeGNlcHRpb24oImV4Y2VwdGlvbkRyaXZlbiIsIHN0YXR1cyk7CisgICAgICAgIF90ZXN0U3RhdHVzQ29kZURpcmVjdGx5KCJleGNlcHRpb25Ecml2ZW4iLCBzdGF0dXMpOworICAgICAgICBfdGVzdFN0YXR1c0NvZGVWaWFFeGNlcHRpb24oInJlc3BvbnNlRHJpdmVuIiwgc3RhdHVzKTsKKyAgICAgICAgX3Rlc3RTdGF0dXNDb2RlRGlyZWN0bHkoInJlc3BvbnNlRHJpdmVuIiwgc3RhdHVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RTdGF0dXNDb2RlVmlhRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBwcmVmaXgsIGZpbmFsIFN0cmluZyBzdGF0dXMpIHsKKworICAgICAgICBmaW5hbCBpbnQgc3RhdHVzQ29kZSA9IEludGVnZXIucGFyc2VJbnQoc3RhdHVzKTsKKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKHByZWZpeCkucGF0aChzdGF0dXMpLnJlcXVlc3QoKS5nZXQoQ2xpZW50UmVzcG9uc2UuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiQW4gZXhjZXB0aW9uIGV4cGVjdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBUaHJvd2FibGVSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoRXhjZXB0aW9uTUFQLmdldChzdGF0dXMpLmdldENsYXNzKCksIGV4LmdldENsYXNzKCkpOworCisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGV4LmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzQ29kZSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICBpZiAoaXMzeHhDb2RlKHN0YXR1c0NvZGUpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFN0YXR1c0NvZGVEaXJlY3RseShmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBTdHJpbmcgc3RhdHVzKSB7CisgICAgICAgIGZpbmFsIGludCBzdGF0dXNDb2RlID0gSW50ZWdlci5wYXJzZUludChzdGF0dXMpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocHJlZml4KS5wYXRoKHN0YXR1cykucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdHVzQ29kZSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBpZiAoaXMzeHhDb2RlKHN0YXR1c0NvZGUpKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsU3RhdHVzQ29kZXMoKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHN0YXR1cyA6IEV4Y2VwdGlvbk1BUC5rZXlTZXQoKSkgeworICAgICAgICAgICAgX3Rlc3RTdGF0dXNDb2RlKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXMzeHhDb2RlKGZpbmFsIGludCBzdGF0dXNDb2RlKSB7CisgICAgICAgIHJldHVybiAyOTkgPCBzdGF0dXNDb2RlICYmIHN0YXR1c0NvZGUgPCA0MDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQkVHSU46IEpFUlNFWS0xNTMyIHJlcHJvZHVjZXIgY29kZToKKyAgICAgKgorICAgICAqIEZyb20gSkFYLVJTIDIuMCBzcGVjLCBzZWN0LiAzLjI6CisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBBIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHRocm93biBkdXJpbmcgY29uc3RydWN0aW9uIG9mIGZpZWxkIG9yIHByb3BlcnR5IHZhbHVlcyB1c2luZyAzIG9yIDQgYWJvdmUKKyAgICAgKiBpcyBwcm9jZXNzZWQgZGlyZWN0bHkgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4zLjQuIE90aGVyIGV4Y2VwdGlvbnMgdGhyb3duIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YKKyAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eSB2YWx1ZXMgdXNpbmcgMyBvciA0IGFib3ZlIGFyZSB0cmVhdGVkIGFzIGNsaWVudCBlcnJvcnM6IGlmIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBpcworICAgICAqIGFubm90YXRlZCB3aXRoIEBNYXRyaXhQYXJhbSwgQFF1ZXJ5UGFyYW0gb3IgQFBhdGhQYXJhbSB0aGVuIGFuIGltcGxlbWVudGF0aW9uIE1VU1QgZ2VuZXJhdGUgYW4gaW5zdGFuY2UKKyAgICAgKiBvZiBOb3RGb3VuZEV4Y2VwdGlvbiAoNDA0IHN0YXR1cykgdGhhdCB3cmFwcyB0aGUgdGhyb3duIGV4Y2VwdGlvbiBhbmQgbm8gZW50aXR5OyBpZiB0aGUgZmllbGQgb3IgcHJvcGVydHkKKyAgICAgKiBpcyBhbm5vdGF0ZWQgd2l0aCBASGVhZGVyUGFyYW0gb3IgQENvb2tpZVBhcmFtIHRoZW4gYW4gaW1wbGVtZW50YXRpb24gTVVTVCBnZW5lcmF0ZSBhbiBpbnN0YW5jZSBvZgorICAgICAqIEJhZFJlcXVlc3RFeGNlcHRpb24gKDQwMCBzdGF0dXMpIHRoYXQgd3JhcHMgdGhlIHRocm93biBleGNlcHRpb24gYW5kIG5vIGVudGl0eS4gRXhjZXB0aW9ucyBNVVNUIGJlCisgICAgICogcHJvY2Vzc2VkIGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMy40LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uV2FlVHlwZSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25XYWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAUGFyYW1Db252ZXJ0ZXIuTGF6eQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uV2FlVGhyb3dpbmdDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlcjxOb25XYWVUeXBlPiwgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOb25XYWVUeXBlIGZyb21TdHJpbmcoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9uV2FlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhOb25XYWVUeXBlIHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9uV2FlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKENsYXNzPFQ+IHJhd1R5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKE5vbldhZVR5cGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyYXdUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoUGFyYW1Db252ZXJ0ZXI8VD4pIHRoaXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL2ZpZWxkL2RlZmF1bHQtbWF0cml4IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTEgeworICAgICAgICBARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpCisgICAgICAgIEBNYXRyaXhQYXJhbSgibWlzc2luZyIpCisgICAgICAgIHByaXZhdGUgTm9uV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL2ZpZWxkL2RlZmF1bHQtcGF0aCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2UyIHsKKyAgICAgICAgQERlZmF1bHRWYWx1ZSgidmFsdWUiKQorICAgICAgICBAUGF0aFBhcmFtKCJtaXNzaW5nIikKKyAgICAgICAgcHJpdmF0ZSBOb25XYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvZmllbGQvZGVmYXVsdC1xdWVyeSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2UzIHsKKyAgICAgICAgQERlZmF1bHRWYWx1ZSgidmFsdWUiKQorICAgICAgICBAUXVlcnlQYXJhbSgibWlzc2luZyIpCisgICAgICAgIHByaXZhdGUgTm9uV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL2ZpZWxkL2RlZmF1bHQtaGVhZGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTQgeworICAgICAgICBARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpCisgICAgICAgIEBIZWFkZXJQYXJhbSgibWlzc2luZyIpCisgICAgICAgIHByaXZhdGUgTm9uV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL2ZpZWxkL2RlZmF1bHQtY29va2llIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTUgeworICAgICAgICBARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpCisgICAgICAgIEBDb29raWVQYXJhbSgibWlzc2luZyIpCisgICAgICAgIHByaXZhdGUgTm9uV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL2ZpZWxkL21hdHJpeCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2U2IHsKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJ0ZXN0IikKKyAgICAgICAgcHJpdmF0ZSBOb25XYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvZmllbGQvcGF0aC97dGVzdH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlNyB7CisgICAgICAgIEBQYXRoUGFyYW0oInRlc3QiKQorICAgICAgICBwcml2YXRlIE5vbldhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvbm9uLXdhZS9maWVsZC9xdWVyeSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2U4IHsKKyAgICAgICAgQFF1ZXJ5UGFyYW0oInRlc3QiKQorICAgICAgICBwcml2YXRlIE5vbldhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvbm9uLXdhZS9maWVsZC9oZWFkZXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlOSB7CisgICAgICAgIEBIZWFkZXJQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgTm9uV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL2ZpZWxkL2Nvb2tpZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2UxMCB7CisgICAgICAgIEBDb29raWVQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgTm9uV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL21ldGhvZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlTWV0aG9kVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJkZWZhdWx0LW1hdHJpeCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkZWZhdWx0TWF0cml4VGVzdChARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpIEBNYXRyaXhQYXJhbSgibWlzc2luZyIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJkZWZhdWx0LXBhdGgiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZGVmYXVsdFBhdGhUZXN0KEBEZWZhdWx0VmFsdWUoInZhbHVlIikgQFBhdGhQYXJhbSgibWlzc2luZyIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJkZWZhdWx0LXF1ZXJ5IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlZmF1bHRRdWVyeVRlc3QoQERlZmF1bHRWYWx1ZSgidmFsdWUiKSBAUXVlcnlQYXJhbSgibWlzc2luZyIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJkZWZhdWx0LWhlYWRlciIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkZWZhdWx0SGVhZGVyVGVzdChARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpIEBIZWFkZXJQYXJhbSgibWlzc2luZyIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJkZWZhdWx0LWNvb2tpZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkZWZhdWx0Q29va2llVGVzdChARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpIEBDb29raWVQYXJhbSgibWlzc2luZyIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJtYXRyaXgiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbWF0cml4VGVzdChATWF0cml4UGFyYW0oInRlc3QiKSBOb25XYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicGF0aC97dGVzdH0iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcGF0aFRlc3QoQFBhdGhQYXJhbSgidGVzdCIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJxdWVyeSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBxdWVyeVRlc3QoQFF1ZXJ5UGFyYW0oInRlc3QiKSBOb25XYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiaGVhZGVyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGhlYWRlclRlc3QoQEhlYWRlclBhcmFtKCJ0ZXN0IikgTm9uV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNvb2tpZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBjb29raWVUZXN0KEBDb29raWVQYXJhbSgidGVzdCIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25XYWVFeGNlcHRpb25UaHJvd25Gcm9tUGFyYW1Db252ZXJ0ZXIoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInBhcmFtLWNvbnZlcnRlci9ub24td2FlLyIpOworCisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWRlZmF1bHQtbWF0cml4IiwgNDA0LCB0YXJnZXQucGF0aCgiZmllbGQvZGVmYXVsdC1tYXRyaXgiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1kZWZhdWx0LXBhdGgiLCA0MDQsIHRhcmdldC5wYXRoKCJmaWVsZC9kZWZhdWx0LXBhdGgiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1kZWZhdWx0LXF1ZXJ5IiwgNDA0LCB0YXJnZXQucGF0aCgiZmllbGQvZGVmYXVsdC1xdWVyeSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWRlZmF1bHQtaGVhZGVyIiwgNDAwLCB0YXJnZXQucGF0aCgiZmllbGQvZGVmYXVsdC1oZWFkZXIiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1kZWZhdWx0LWNvb2tpZSIsIDQwMCwgdGFyZ2V0LnBhdGgoImZpZWxkL2RlZmF1bHQtY29va2llIikucmVxdWVzdCgpKTsKKworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1tYXRyaXgiLCA0MDQsIHRhcmdldC5wYXRoKCJmaWVsZC9tYXRyaXg7dGVzdD12YWx1ZSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLXBhdGgiLCA0MDQsIHRhcmdldC5wYXRoKCJmaWVsZC9wYXRoL3ZhbHVlIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtcXVlcnkiLCA0MDQsIHRhcmdldC5wYXRoKCJmaWVsZC9xdWVyeSIpLnF1ZXJ5UGFyYW0oInRlc3QiLCAidmFsdWUiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1oZWFkZXIiLCA0MDAsIHRhcmdldC5wYXRoKCJmaWVsZC9oZWFkZXIiKS5yZXF1ZXN0KCkuaGVhZGVyKCJ0ZXN0IiwgInZhbHVlIikpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1jb29raWUiLCA0MDAsIHRhcmdldC5wYXRoKCJmaWVsZC9jb29raWUiKS5yZXF1ZXN0KCkuY29va2llKCJ0ZXN0IiwgInZhbHVlIikpOworCisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LW1hdHJpeCIsIDQwNCwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9kZWZhdWx0LW1hdHJpeCIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LXBhdGgiLCA0MDQsIHRhcmdldC5wYXRoKCJtZXRob2QvZGVmYXVsdC1wYXRoIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWRlZmF1bHQtcXVlcnkiLCA0MDQsIHRhcmdldC5wYXRoKCJtZXRob2QvZGVmYXVsdC1xdWVyeSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LWhlYWRlciIsIDQwMCwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9kZWZhdWx0LWhlYWRlciIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LWNvb2tpZSIsIDQwMCwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9kZWZhdWx0LWNvb2tpZSIpLnJlcXVlc3QoKSk7CisKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLW1hdHJpeCIsIDQwNCwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9tYXRyaXg7dGVzdD12YWx1ZSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1wYXRoIiwgNDA0LCB0YXJnZXQucGF0aCgibWV0aG9kL3BhdGgvdmFsdWUiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtcXVlcnkiLCA0MDQsIHRhcmdldC5wYXRoKCJtZXRob2QvcXVlcnkiKS5xdWVyeVBhcmFtKCJ0ZXN0IiwgInZhbHVlIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWhlYWRlciIsIDQwMCwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9oZWFkZXIiKS5yZXF1ZXN0KCkuaGVhZGVyKCJ0ZXN0IiwgInZhbHVlIikpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtY29va2llIiwgNDAwLCB0YXJnZXQucGF0aCgibWV0aG9kL2Nvb2tpZSIpLnJlcXVlc3QoKS5jb29raWUoInRlc3QiLCAidmFsdWUiKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWVUeXBlIHsKKyAgICB9CisKKyAgICBAUGFyYW1Db252ZXJ0ZXIuTGF6eQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FlVGhyb3dpbmdDb252ZXJ0ZXIgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlcjxXYWVUeXBlPiwgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBXYWVUeXBlIGZyb21TdHJpbmcoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oNTU1KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFdhZVR5cGUgdmFsdWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig1NTUpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihDbGFzczxUPiByYXdUeXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChXYWVUeXBlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmF3VHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFBhcmFtQ29udmVydGVyPFQ+KSB0aGlzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvd2FlL2ZpZWxkL2RlZmF1bHQtbWF0cml4IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTEgeworICAgICAgICBARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpCisgICAgICAgIEBNYXRyaXhQYXJhbSgibWlzc2luZyIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvZGVmYXVsdC1wYXRoIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTIgeworICAgICAgICBARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpCisgICAgICAgIEBQYXRoUGFyYW0oIm1pc3NpbmciKQorICAgICAgICBwcml2YXRlIFdhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvd2FlL2ZpZWxkL2RlZmF1bHQtcXVlcnkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlMyB7CisgICAgICAgIEBEZWZhdWx0VmFsdWUoInZhbHVlIikKKyAgICAgICAgQFF1ZXJ5UGFyYW0oIm1pc3NpbmciKQorICAgICAgICBwcml2YXRlIFdhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvd2FlL2ZpZWxkL2RlZmF1bHQtaGVhZGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTQgeworICAgICAgICBARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpCisgICAgICAgIEBIZWFkZXJQYXJhbSgibWlzc2luZyIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvZGVmYXVsdC1jb29raWUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlNSB7CisgICAgICAgIEBEZWZhdWx0VmFsdWUoInZhbHVlIikKKyAgICAgICAgQENvb2tpZVBhcmFtKCJtaXNzaW5nIikKKyAgICAgICAgcHJpdmF0ZSBXYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL3dhZS9maWVsZC9tYXRyaXgiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlNiB7CisgICAgICAgIEBNYXRyaXhQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvcGF0aC97dGVzdH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlNyB7CisgICAgICAgIEBQYXRoUGFyYW0oInRlc3QiKQorICAgICAgICBwcml2YXRlIFdhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvd2FlL2ZpZWxkL3F1ZXJ5IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTggeworICAgICAgICBAUXVlcnlQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvaGVhZGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTkgeworICAgICAgICBASGVhZGVyUGFyYW0oInRlc3QiKQorICAgICAgICBwcml2YXRlIFdhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvd2FlL2ZpZWxkL2Nvb2tpZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2UxMCB7CisgICAgICAgIEBDb29raWVQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvbWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVNZXRob2RUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtbWF0cml4IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlZmF1bHRNYXRyaXhUZXN0KEBEZWZhdWx0VmFsdWUoInZhbHVlIikgQE1hdHJpeFBhcmFtKCJtaXNzaW5nIikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtcGF0aCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkZWZhdWx0UGF0aFRlc3QoQERlZmF1bHRWYWx1ZSgidmFsdWUiKSBAUGF0aFBhcmFtKCJtaXNzaW5nIikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtcXVlcnkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZGVmYXVsdFF1ZXJ5VGVzdChARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpIEBRdWVyeVBhcmFtKCJtaXNzaW5nIikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtaGVhZGVyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlZmF1bHRIZWFkZXJUZXN0KEBEZWZhdWx0VmFsdWUoInZhbHVlIikgQEhlYWRlclBhcmFtKCJtaXNzaW5nIikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtY29va2llIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlZmF1bHRDb29raWVUZXN0KEBEZWZhdWx0VmFsdWUoInZhbHVlIikgQENvb2tpZVBhcmFtKCJtaXNzaW5nIikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1hdHJpeCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBtYXRyaXhUZXN0KEBNYXRyaXhQYXJhbSgidGVzdCIpIFdhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJwYXRoL3t0ZXN0fSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwYXRoVGVzdChAUGF0aFBhcmFtKCJ0ZXN0IikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInF1ZXJ5IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHF1ZXJ5VGVzdChAUXVlcnlQYXJhbSgidGVzdCIpIFdhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJoZWFkZXIiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgaGVhZGVyVGVzdChASGVhZGVyUGFyYW0oInRlc3QiKSBXYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY29va2llIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGNvb2tpZVRlc3QoQENvb2tpZVBhcmFtKCJ0ZXN0IikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhZUV4Y2VwdGlvblRocm93bkZyb21QYXJhbUNvbnZlcnRlcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicGFyYW0tY29udmVydGVyL3dhZS8iKTsKKworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1kZWZhdWx0LW1hdHJpeCIsIDU1NSwgdGFyZ2V0LnBhdGgoImZpZWxkL2RlZmF1bHQtbWF0cml4IikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtZGVmYXVsdC1wYXRoIiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvZGVmYXVsdC1wYXRoIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtZGVmYXVsdC1xdWVyeSIsIDU1NSwgdGFyZ2V0LnBhdGgoImZpZWxkL2RlZmF1bHQtcXVlcnkiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1kZWZhdWx0LWhlYWRlciIsIDU1NSwgdGFyZ2V0LnBhdGgoImZpZWxkL2RlZmF1bHQtaGVhZGVyIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtZGVmYXVsdC1jb29raWUiLCA1NTUsIHRhcmdldC5wYXRoKCJmaWVsZC9kZWZhdWx0LWNvb2tpZSIpLnJlcXVlc3QoKSk7CisKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtbWF0cml4IiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvbWF0cml4O3Rlc3Q9dmFsdWUiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1wYXRoIiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvcGF0aC92YWx1ZSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLXF1ZXJ5IiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvcXVlcnkiKS5xdWVyeVBhcmFtKCJ0ZXN0IiwgInZhbHVlIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtaGVhZGVyIiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvaGVhZGVyIikucmVxdWVzdCgpLmhlYWRlcigidGVzdCIsICJ2YWx1ZSIpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtY29va2llIiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvY29va2llIikucmVxdWVzdCgpLmNvb2tpZSgidGVzdCIsICJ2YWx1ZSIpKTsKKworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtZGVmYXVsdC1tYXRyaXgiLCA1NTUsIHRhcmdldC5wYXRoKCJtZXRob2QvZGVmYXVsdC1tYXRyaXgiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtZGVmYXVsdC1wYXRoIiwgNTU1LCB0YXJnZXQucGF0aCgibWV0aG9kL2RlZmF1bHQtcGF0aCIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LXF1ZXJ5IiwgNTU1LCB0YXJnZXQucGF0aCgibWV0aG9kL2RlZmF1bHQtcXVlcnkiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtZGVmYXVsdC1oZWFkZXIiLCA1NTUsIHRhcmdldC5wYXRoKCJtZXRob2QvZGVmYXVsdC1oZWFkZXIiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtZGVmYXVsdC1jb29raWUiLCA1NTUsIHRhcmdldC5wYXRoKCJtZXRob2QvZGVmYXVsdC1jb29raWUiKS5yZXF1ZXN0KCkpOworCisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1tYXRyaXgiLCA1NTUsIHRhcmdldC5wYXRoKCJtZXRob2QvbWF0cml4O3Rlc3Q9dmFsdWUiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtcGF0aCIsIDU1NSwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9wYXRoL3ZhbHVlIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLXF1ZXJ5IiwgNTU1LCB0YXJnZXQucGF0aCgibWV0aG9kL3F1ZXJ5IikucXVlcnlQYXJhbSgidGVzdCIsICJ2YWx1ZSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1oZWFkZXIiLCA1NTUsIHRhcmdldC5wYXRoKCJtZXRob2QvaGVhZGVyIikucmVxdWVzdCgpLmhlYWRlcigidGVzdCIsICJ2YWx1ZSIpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWNvb2tpZSIsIDU1NSwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9jb29raWUiKS5yZXF1ZXN0KCkuY29va2llKCJ0ZXN0IiwgInZhbHVlIikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U2luZ2xlKFN0cmluZyBjYXNlTmFtZSwgaW50IGV4cGVjdGVkU3RhdHVzLCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlcXVlc3QuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGVzdCBvZiBhbiBleGNlcHRpb24gdGhyb3duIGR1cmluZyBmaWVsZC9wYXJhbWV0ZXIgaW5qZWN0aW9uIFsiICsgY2FzZU5hbWUgKyAiXSBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICBleHBlY3RlZFN0YXR1cywKKyAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorICAgIC8qKgorICAgICAqIEVORDogSkVSU0VZLTE1MzIgcmVwcm9kdWNlciBjb2RlLgorICAgICAqLworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Zvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Zvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNzQ1NDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSHR0cERhdGVGb3JtYXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwSGVhZGVyUmVhZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBJbXJhbkBTbWFydElURW5naW5lZXJpbmcuQ29tCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvblRlc3QgZXh0ZW5kcyBDb250ZW50RGlzcG9zaXRpb25UZXN0IHsKKworICAgIHB1YmxpYyBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvblRlc3QoKSB7CisgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvblR5cGUgPSAiZm9ybS1kYXRhIjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGUoKSB7CisgICAgICAgIGZpbmFsIERhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGNvbnRlbnREaXNwb3NpdGlvbjsKKyAgICAgICAgY29udGVudERpc3Bvc2l0aW9uID0gRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgidGVzdERhdGEiKS5maWxlTmFtZSgidGVzdC5maWxlIikuY3JlYXRpb25EYXRlKGRhdGUpCisgICAgICAgICAgICAgICAgLm1vZGlmaWNhdGlvbkRhdGUoZGF0ZSkucmVhZERhdGUoZGF0ZSkuc2l6ZSgxMjIyKS5idWlsZCgpOworICAgICAgICBhc3NlcnRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24sIGRhdGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVTdHJpbmcgPSBIdHRwRGF0ZUZvcm1hdC5nZXRQcmVmZXJyZWREYXRlRm9ybWF0KCkuZm9ybWF0KGRhdGUpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9IGNvbnRlbnREaXNwb3NpdGlvblR5cGUgKyAiO2ZpbGVuYW1lPVwidGVzdC5maWxlXCI7Y3JlYXRpb24tZGF0ZT1cIiIgKyBkYXRlU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICsgIlwiO21vZGlmaWNhdGlvbi1kYXRlPVwiIiArIGRhdGVTdHJpbmcgKyAiXCI7cmVhZC1kYXRlPVwiIiArIGRhdGVTdHJpbmcgKyAiXCI7c2l6ZT0xMjIyIgorICAgICAgICAgICAgICAgICAgICArICI7bmFtZT1cInRlc3REYXRhXCIiOworCisgICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb24gPSBuZXcgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24oY29udGVudERpc3Bvc2l0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXNzZXJ0Rm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24oY29udGVudERpc3Bvc2l0aW9uLCBkYXRlKTsKKyAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbiA9IG5ldyBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihoZWFkZXIpOworICAgICAgICAgICAgYXNzZXJ0Rm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24oY29udGVudERpc3Bvc2l0aW9uLCBkYXRlKTsKKyAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbiA9IG5ldyBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihIdHRwSGVhZGVyUmVhZGVyLm5ld0luc3RhbmNlKGhlYWRlciksIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0Rm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24oY29udGVudERpc3Bvc2l0aW9uLCBkYXRlKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGZhaWwoZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKChIdHRwSGVhZGVyUmVhZGVyKSBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyBleHBlY3RlZCB0byBiZSB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgZmFpbChleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAvL2V4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbigiZm9ybS1kYXRhO2ZpbGVuYW1lPVwidGVzdC5maWxlXCIiKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIGZhaWwoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZShudWxsKS5idWlsZCgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyBleHBlY3RlZCB0byBiZSB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgZmFpbChleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBEYXRlIGRhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICBmaW5hbCBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBjb250ZW50RGlzcG9zaXRpb24gPSBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJ0ZXN0RGF0YSIpCisgICAgICAgICAgICAgICAgLmZpbGVOYW1lKCJ0ZXN0LmZpbGUiKS5jcmVhdGlvbkRhdGUoZGF0ZSkubW9kaWZpY2F0aW9uRGF0ZShkYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWREYXRlKGRhdGUpLnNpemUoMTIyMikuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVTdHJpbmcgPSBIdHRwRGF0ZUZvcm1hdC5nZXRQcmVmZXJyZWREYXRlRm9ybWF0KCkuZm9ybWF0KGRhdGUpOworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gY29udGVudERpc3Bvc2l0aW9uVHlwZSArICI7IGZpbGVuYW1lPVwidGVzdC5maWxlXCI7IGNyZWF0aW9uLWRhdGU9XCIiICsgZGF0ZVN0cmluZworICAgICAgICAgICAgICAgICsgIlwiOyBtb2RpZmljYXRpb24tZGF0ZT1cIiIgKyBkYXRlU3RyaW5nICsgIlwiOyByZWFkLWRhdGU9XCIiICsgZGF0ZVN0cmluZyArICJcIjsgc2l6ZT0xMjIyIgorICAgICAgICAgICAgICAgICsgIjsgbmFtZT1cInRlc3REYXRhXCIiOworCisgICAgICAgIGFzc2VydEVxdWFscyhoZWFkZXIsIGNvbnRlbnREaXNwb3NpdGlvbi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihmaW5hbCBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBjb250ZW50RGlzcG9zaXRpb24sIGZpbmFsIERhdGUgZGF0ZSkgeworICAgICAgICBhc3NlcnRDb250ZW50RGlzcG9zaXRpb24oY29udGVudERpc3Bvc2l0aW9uLCBkYXRlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0RGF0YSIsIGNvbnRlbnREaXNwb3NpdGlvbi5nZXROYW1lKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0h0dHBIZWFkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvSHR0cEhlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGVjYmRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0h0dHBIZWFkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5BY2NlcHRhYmxlTGFuZ3VhZ2VUYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5BY2NlcHRhYmxlVG9rZW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwRGF0ZUZvcm1hdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5MYW5ndWFnZVRhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlBhcmFtZXRlcml6ZWRIZWFkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5Ub2tlbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwSGVhZGVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb2tlbnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gInR5cGUgIC8gIGNvbnRlbnQ7IGEgPSBcImFzZHNkXCIiOworCisgICAgICAgIGZpbmFsIEh0dHBIZWFkZXJSZWFkZXIgciA9IEh0dHBIZWFkZXJSZWFkZXIubmV3SW5zdGFuY2UoaGVhZGVyKTsKKyAgICAgICAgd2hpbGUgKHIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByLm5leHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi94bWw7Y2hhcnNldD1VVEYtOCI7CisgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKG1pbWVUeXBlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYW5ndWFnZVRhZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBsYW5ndWFnZVRhZyA9ICJlbi1VUyI7CisgICAgICAgIG5ldyBMYW5ndWFnZVRhZyhsYW5ndWFnZVRhZyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0YWJsZUxhbmd1YWdlVGFnKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlVGFnID0gImVuLVVTO3E9MC4xMjMiOworICAgICAgICBuZXcgQWNjZXB0YWJsZUxhbmd1YWdlVGFnKGxhbmd1YWdlVGFnKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRhYmxlTGFuZ3VhZ2VUYWdMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBsYW5ndWFnZVRhZ3MgPSAiZW4tVVM7cT0wLjEyMywgZnI7cT0wLjIsIGVuO3E9MC4zLCAqO3E9MC4wMSI7CisgICAgICAgIGZpbmFsIExpc3Q8QWNjZXB0YWJsZUxhbmd1YWdlVGFnPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TGFuZ3VhZ2UobGFuZ3VhZ2VUYWdzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIGwuZ2V0KDApLmdldFRhZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmciIsIGwuZ2V0KDEpLmdldFRhZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbi1VUyIsIGwuZ2V0KDIpLmdldFRhZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbC5nZXQoMykuZ2V0VGFnKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRva2VuKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRva2VuID0gImd6aXAiOworICAgICAgICBuZXcgVG9rZW4odG9rZW4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdGFibGVUb2tlbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0b2tlbiA9ICJnemlwO3E9MC4xMjMiOworICAgICAgICBuZXcgQWNjZXB0YWJsZVRva2VuKHRva2VuKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRhYmxlVG9rZW5MaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0b2tlbnMgPSAiZ3ppcDtxPTAuMTIzLCBjb21wcmVzcztxPTAuMiwgemxpYjtxPTAuMywgKjtxPTAuMDEiOworICAgICAgICBmaW5hbCBMaXN0PEFjY2VwdGFibGVUb2tlbj4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdFRva2VuKHRva2Vucyk7CisgICAgICAgIGFzc2VydEVxdWFscygiemxpYiIsIGwuZ2V0KDApLmdldFRva2VuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbXByZXNzIiwgbC5nZXQoMSkuZ2V0VG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ3ppcCIsIGwuZ2V0KDIpLmdldFRva2VuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBsLmdldCgzKS5nZXRUb2tlbigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlUGFyc2luZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBkYXRlX1JGQzExMjMgPSAiU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQiOworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZV9SRkMxMDM2ID0gIlN1bmRheSwgMDYtTm92LTk0IDA4OjQ5OjM3IEdNVCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBkYXRlX0FOU0lfQyA9ICJTdW4gTm92ICA2IDA4OjQ5OjM3IDE5OTQiOworCisgICAgICAgIEh0dHBIZWFkZXJSZWFkZXIucmVhZERhdGUoZGF0ZV9SRkMxMTIzKTsKKyAgICAgICAgSHR0cEhlYWRlclJlYWRlci5yZWFkRGF0ZShkYXRlX1JGQzEwMzYpOworICAgICAgICBIdHRwSGVhZGVyUmVhZGVyLnJlYWREYXRlKGRhdGVfQU5TSV9DKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlRm9ybWF0dGluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBkYXRlX1JGQzExMjMgPSAiU3VuLCAwNiBOb3YgMTk5NCAwODo0OTozNyBHTVQiOworICAgICAgICBmaW5hbCBEYXRlIGRhdGUgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWREYXRlKGRhdGVfUkZDMTEyMyk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVfZm9ybWF0dGVkID0gSHR0cERhdGVGb3JtYXQuZ2V0UHJlZmVycmVkRGF0ZUZvcm1hdCgpLmZvcm1hdChkYXRlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGVfUkZDMTEyMywgZGF0ZV9mb3JtYXR0ZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlcml6ZWRIZWFkZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBQYXJhbWV0ZXJpemVkSGVhZGVyIHBoID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcGguZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgcGggPSBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYS9iIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYS9iIiwgcGguZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgcGggPSBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiICBhICAvICBiICAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhL2IiLCBwaC5nZXRWYWx1ZSgpKTsKKworICAgICAgICBwaCA9IG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwaC5nZXRWYWx1ZSgpKTsKKworICAgICAgICBwaCA9IG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCI7Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgcGguZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwaC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKworICAgICAgICBwaCA9IG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCI7OzsiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwaC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBoLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisgICAgICAgIHBoID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoIiAgOyAgOyAgOyAgIik7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgcGguZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBwaC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKworICAgICAgICBwaCA9IG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJhO3g9MTt5PTIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcGguZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwaC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGguZ2V0UGFyYW1ldGVycygpLmdldCgieCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgcGguZ2V0UGFyYW1ldGVycygpLmdldCgieSIpKTsKKworICAgICAgICBwaCA9IG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJhIDsgIHg9MSAgOyAgeT0yICAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcGguZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwaC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGguZ2V0UGFyYW1ldGVycygpLmdldCgieCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgcGguZ2V0UGFyYW1ldGVycygpLmdldCgieSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYWxlUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYWxlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjZTcxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhbGVQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkxvY2FsZVByb3ZpZGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqLworcHVibGljIGNsYXNzIExvY2FsZVByb3ZpZGVyVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIExvY2FsZVByb3ZpZGVyIGluc3RhbmNlID0gbmV3IExvY2FsZVByb3ZpZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCBpbnN0YW5jZS50b1N0cmluZyhuZXcgTG9jYWxlKCJlbiIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4tVVMiLCBpbnN0YW5jZS50b1N0cmluZyhuZXcgTG9jYWxlKCJlbiIsICJ1cyIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMb2NhbGVQcm92aWRlciBpbnN0YW5jZSA9IG5ldyBMb2NhbGVQcm92aWRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvY2FsZSgiZW4iKSwgaW5zdGFuY2UuZnJvbVN0cmluZygiZW4iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9jYWxlKCJlbiIsICJ1cyIpLCBpbnN0YW5jZS5mcm9tU3RyaW5nKCJlbi11cyIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlckFzeW5jVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyQXN5bmNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzZjk5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlckFzeW5jVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCBpZiB0aGUgbG9jYXRpb24gcmVsYXRpdmVyIFVSSSBpcyBjb3JyZWN0bHkgcmVzb2x2ZWQgd2l0aGluIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIGNhc2VzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkhlYWRlckFzeW5jVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTG9jYXRpb25IZWFkZXJBc3luY1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljQm9vbGVhbiBleGVjdXRvckNvbXBhcmlzb25GYWlsZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljQm9vbGVhbiBpbnRlcnJ1cHRlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzcG9uc2VUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIHRlc3QgaW5mcmFzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBJbiB0aGlzIGNhc2UgaXQgcHJlcGFyZXMgZXhlY3V0b3IgdGhyZWFkIHBvb2wgb2Ygc2l6ZSBvbmUgYW5kIGluaXRpYWxpemVzIHRoZSB0aHJlYWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICAvKiB0aHJlYWQgcG9vbCBmb3IgY3VzdG9tIGV4ZWN1dG9yIGFzeW5jIHRlc3QgKi8KKyAgICAgICAgTG9jYXRpb25IZWFkZXJBc3luY1Rlc3QuZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDEpOworCisgICAgICAgIC8vIEZvcmNlIHRoZSB0aHJlYWQgdG8gYmUgZWFnZXJseSBpbnN0YW50aWF0ZWQgLSB0aGlzIHByZXZlbnRzIHRoZSBpbnN0YW50aWF0aW9uIGxhdGVyIGFuZCBlbnN1cmVzLCB0aGF0IHRoZSB0aHJlYWQKKyAgICAgICAgLy8gd2lsbCBub3QgYmUgYSBjaGlsZCB0aHJlYWQgb2YgdGhlIHJlcXVlc3QgaGFuZGxpbmcgdGhyZWFkLCBzbyB0aGUgdGhyZWFkLWxvY2FsIGJhc2VVcmkgdmFyaWFibGUgd2lsbCBub3QgYmUgaW5oZXJpdGVkLgorICAgICAgICBMb2NhdGlvbkhlYWRlckFzeW5jVGVzdC5leGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlRocmVhZCBwb29sIGluaXRpYWxpemVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IEpBWC1SUyByZXNvdXJjZQorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJWb2lkTWV0aG9kQW5ub3RhdGVkV2l0aEdFVCIpCisgICAgQFBhdGgodmFsdWUgPSAiL1Jlc3BvbnNlVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZVRlc3QgeworCisgICAgICAgIC8qIGluamVjdGVkIHJlcXVlc3QgVVJJIGZvciBhc3NlcnRpb25zIGluIHRoZSByZXNvdXJjZSBtZXRob2RzICovCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBc3luY2hyb25vdXMgcmVzb3VyY2UgbWV0aG9kIGZvciB0ZXN0aW5nIGlmIHRoZSBVUkkgaXMgYWJzb2x1dGl6ZWQgYWxzbyBpbiBjYXNlIG9mIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nOworICAgICAgICAgKgorICAgICAgICAgKiBUaGUgcmVzcG9uc2UgaXMgY3JlYXRlZCBpbiB0aGUgc2VwYXJhdGUgdGhyZWFkLiBUaGlzIHRlc3RzLCB0aGF0IHRoZSB0aHJlYWQgc3RpbGwgaGFzIGFjY2VzcyB0byB0aGUgcmVxdWVzdCBiYXNlVXJpCisgICAgICAgICAqIHRocmVhZC1sb2NhbCB2YXJpYWJsZSBpbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZEpheHJzUmVzcG9uc2UuQnVpbGRlcn0uCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbkFzeW5jIikKKyAgICAgICAgcHVibGljIHZvaWQgbG9jYXRpb25Bc3luYyhAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gZ2V0VXJpQnVpbGRlcigpLnNlZ21lbnQoImxvY2F0aW9uQXN5bmMiKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXN1bHQgPSBSZXNwb25zZS5jcmVhdGVkKHVyaSkuYnVpbGQoKTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkkgbG9jYXRpb24gPSByZXN1bHQuZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGxvY2F0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KGxvY2F0aW9uLnRvU3RyaW5nKCkpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgYXN5bmMgdGVzdCB3aXRoIGN1c3RvbSBleGVjdXRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogSXQgcnVucyBpbiBhIHRocmVhZCB0aGF0IHdhcyBub3QgY3JlYXRlZCB3aXRoaW4gdGhlIHJlcXVlc3Qgc2NvcGUsIHNvIGl0IGRvZXMgbm90IGluaGVyaXQgdGhlIGJhc2VVcmkgdGhyZWFkLWxvY2FsCisgICAgICAgICAqIHZhcmlhYmxlIHZhbHVlLgorICAgICAgICAgKiBJbiB0aGlzIGNhc2UsIFVSSSB3aWxsIG5vdCBiZSBhYnNvbHV0aXplZCB1bnRpbCBjYWxsaW5nIHtAbGluayBBc3luY1Jlc3BvbnNlI3Jlc3VtZShPYmplY3QpfS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4ZWN1dG9yQXN5bmMiKQorICAgICAgICBATWFuYWdlZEFzeW5jCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dG9yQXN5bmMoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIExvY2F0aW9uSGVhZGVyQXN5bmNUZXN0LmV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gZ2V0VXJpQnVpbGRlcigpLnNlZ21lbnQoImV4ZWN1dG9yQXN5bmMiKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXN1bHQgPSBSZXNwb25zZS5jcmVhdGVkKHVyaSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF1cmlJbmZvLmdldEFic29sdXRlUGF0aCgpLmVxdWFscyhyZXN1bHQuZ2V0TG9jYXRpb24oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yQ29tcGFyaXNvbkZhaWxlZC5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQbGFjZWhvbGRlciBmb3IgdGhlIHN1c3BlbmRlZCBhc3luYyByZXNwb25zZXM7CisgICAgICAgICAqIEZvciB0aGUgY3VycmVudCB0ZXN0IGEgc2ltcGxlIHN0YXRpYyBmaWVsZCB3b3VsZCBiZSBlbm91Z2gsIGJ1dCB0aGlzIGlzIGVhc2lseSBleHRlbnNpYmxlOworICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGlzIGluc3BpcmVkIGJ5IHRoZSB7QGxpbmsgQXN5bmNSZXNwb25zZX0gamF2YWRvYyBleGFtcGxlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+IHN1c3BlbmRlZCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8Pig1KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3RhcnQgb2YgdGhlIGFzeW5jIHRlc3QgLSBzdG9yZXMgdGhlIGFzeW5jaHJvbm91cyByZXNwb25zZSBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uQXN5bmNTdGFydCIpCisgICAgICAgIHB1YmxpYyB2b2lkIGxvY2F0aW9uQXN5bmNTdGFydChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkLnB1dChhc3luY1Jlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZC5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmlzaCBvZiB0aGUgYXN5bmMgdGVzdCAtIGNyZWF0ZXMgYSByZXNwb25zZSwgY2hlY2tzIHRoZSBsb2NhdGlvbiBoZWFkZXIgYW5kIHJlc3VtZXMgdGhlIGFzeW5jUmVzcG9uc2UKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBVUkkgd2FzIGNvcnJlY3RseSBhYnNvbHV0aXplZCwgZmFsc2UgaWYgdGhlIFVSSSBpcyByZWxhdGl2ZSBvciBkaWZmZXJzIGZyb20gdGhlIGV4cGVjdGVkIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb25Bc3luY0ZpbmlzaCIpCisgICAgICAgIHB1YmxpYyBCb29sZWFuIGxvY2F0aW9uQXN5bmNGaW5pc2goKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlID0gc3VzcGVuZGVkLnBvbGwoMjAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IGdldFVyaUJ1aWxkZXIoKS5zZWdtZW50KCJsb2NhdGlvbkFzeW5jRmluaXNoIikuYnVpbGQoKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3VsdCA9IFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5idWlsZCgpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB3YXNFcXVhbCA9IHJlc3VsdC5nZXRMb2NhdGlvbigpLmVxdWFscyh1cmlJbmZvLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiB3YXNFcXVhbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm4gVXJpQnVpbGRlciB3aXRoIGJhc2UgcHJlLXNldCB7QGNvZGUgL1Jlc3BvbnNlVGVzdH0gdXJpIHNlZ21lbnQgZm9yIHRoaXMgcmVzb3VyY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVXJpQnVpbGRlcgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBVcmlCdWlsZGVyIGdldFVyaUJ1aWxkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tUmVzb3VyY2UoUmVzcG9uc2VUZXN0LmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2ljIGFzeW5jaHJvbm91cyB0ZXN0Y2FzZTsgY2hlY2tzIGlmIHRoZSBVUkkgaXMgY29ycmVjdGx5IGFic29sdXRpemVkIGFsc28gd2l0aGluIGEgc2VwYXJhdGUgdGhyZWFkIGR1cmluZworICAgICAqIGFzeW5jIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luYygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkVXJpID0gZ2V0QmFzZVVyaSgpICsgIlJlc3BvbnNlVGVzdC9sb2NhdGlvbkFzeW5jIjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJSZXNwb25zZVRlc3QvbG9jYXRpb25Bc3luYyIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJDb21wYXJpc29uIGZhaWxlZCBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kLiBcbkV4cGVjdGVkOiAlMSRzXG5BY3R1YWw6ICUyJHMiLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkVXJpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMobXNnLCByZXNwb25zZS5nZXRTdGF0dXMoKSwgUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUi5nZXRTdGF0dXNDb2RlKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbiByZXNvbHZlZCBmcm9tIHJlc3BvbnNlID4gIiArIGxvY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVXJpLCBsb2NhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aXRoIGEgdGhyZWFkIGZyb20gdGhyZWFkLXBvb2wgKGNyZWF0ZWQgb3V0IG9mIHJlcXVlc3Qgc2NvcGUpCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0b3JBc3luYygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJSZXNwb25zZVRlc3QvZXhlY3V0b3JBc3luYyIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgY29tcGFyaXNvbiBmYWlsZWQgaW4gdGhlIHJlc291cmNlIG1ldGhvZC4iLCBleGVjdXRvckNvbXBhcmlzb25GYWlsZWQuZ2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QmFzZVVyaSgpICsgIlJlc3BvbnNlVGVzdC9leGVjdXRvckFzeW5jIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzeW5jaHJvbm91cyB0ZXN0Y2FzZSBzcGxpdCBvdmVyIHR3byBkaXN0aW5jdCByZXF1ZXN0cworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcGFyYXRlZEFzeW5jKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IGZ1dHVyZVJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L2xvY2F0aW9uQXN5bmNTdGFydCIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpOworICAgICAgICBmaW5hbCBCb29sZWFuIHJlc3VsdCA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC9sb2NhdGlvbkFzeW5jRmluaXNoIikucmVxdWVzdCgpLmdldChCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRocmVhZCB3YXMgaW50ZXJydXB0ZWQgb24gaW5zZXJ0aW5nIGludG8gYmxvY2tpbmcgcXVldWUuIiwgaW50ZXJydXB0ZWQuZ2V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBmdXR1cmVSZXNwb25zZS5nZXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEJhc2VVcmkoKSArICJSZXNwb25zZVRlc3QvbG9jYXRpb25Bc3luY0ZpbmlzaCIsIGxvY2F0aW9uKTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJCYXNpY1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlckJhc2ljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2N2UyZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJCYXNpY1Rlc3QuamF2YQpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3QgaWYgdGhlIGxvY2F0aW9uIHJlbGF0aXZlIFVSSSBpcyBjb3JyZWN0bHkgcmVzb2x2ZWQgd2l0aGluIGJhc2ljIGNhc2VzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkhlYWRlckJhc2ljVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTG9jYXRpb25IZWFkZXJCYXNpY1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzcG9uc2VUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY29uZmlnKTsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgSkFYLVJTIHJlc291cmNlCisgICAgICovCisgICAgQFBhdGgodmFsdWUgPSAiL1Jlc3BvbnNlVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZVRlc3QgeworCisgICAgICAgIC8qIGluamVjdGVkIHJlcXVlc3QgVVJJIGZvciBhc3NlcnRpb25zIGluIHRoZSByZXNvdXJjZSBtZXRob2RzICovCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSBiYXNpYyB1cmkgY29udmVyc2lvbiB0ZXN0CisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHVyaQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb24iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0KCkgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGUoImxvY2F0aW9uIik7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiVVJJIENyZWF0ZWQgaW4gdGhlIHJlc291cmNlIG1ldGhvZCA+ICIgKyB1cmkpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIHRlc3Qgd2l0aCBudWxsIGxvY2F0aW9uCisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIG51bGwgbG9jYXRpb24gdXJpCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbk51bGwiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0TnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKG51bGwpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCB3aXRoIGVudGl0eSBjb250YWluaW5nIHJlc3BvbnNlCisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIHJlbGF0aXZlIHVyaSBhbmQgd2l0aCBlbnRpdHkKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uV2l0aEJvZHkiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0V2l0aEJvZHkoKSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSgibG9jYXRpb25XaXRoQm9keSIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5lbnRpdHkoIlJldHVybiBmcm9tIGxvY2F0aW9uV2l0aEJvZHkiKS50eXBlKCJ0ZXh0L3BsYWluIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIGRpcmVjdCB0ZXN0IC0gbG9jYXRpb24gaGVhZGVyIGlzIGNoZWNrZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBSZXNwb25zZS5jcmVhdGVkKCkgYW5kCisgICAgICAgICAqIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXMgYSBib29sZWFuIHJlc3BvbnNlIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSAoe0BsaW5rIFJlc3BvbnNlfSkgdHlwZSBhbmQgY2hlY2tpbmcgdGhlCisgICAgICAgICAqIGhlYWRlciBpbiB0aGUgY2FsbGluZyB0ZXN0IG1ldGhvZC4gVGhpcyBpc29sYXRlcyB0aGUgaW5mbHVlbmNlIG9mIGFic29sdXRpemF0aW9uIHJvdXRpbmUgcGVyZm9ybWVkIGluIHRoZQorICAgICAgICAgKiAoe0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJSdW50aW1lfSBiZWZvcmUgY2xvc2luZyB0aGUgc3RyZWFtLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgVVJJIGlzIGFic29sdXRpemVkIGNvcnJlY3RseSwgZmFsc2UgaWYgdGhlIFVSSSByZW1haW5zIHJlbGF0aXZlIChvciBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgb25lKS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uRGlyZWN0IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIEJvb2xlYW4gbG9jYXRpb25EaXJlY3RUZXN0KCkgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IGdldFVyaUJ1aWxkZXIoKS5zZWdtZW50KCJsb2NhdGlvbkRpcmVjdCIpLmJ1aWxkKCk7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5idWlsZCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmdldExvY2F0aW9uKCkuZXF1YWxzKHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisKKworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyBjb3JyZWN0IGJhc2VVcmkgYW5kIHJlcXVlc3Qgb3ZlcndyaXRlIGluIHRoZSBwcmVtYXRjaGluZyBmaWx0ZXIuCisgICAgICAgICAqIFNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnkgdGhlIHRlc3QsIGFzIHtAbGluayBSZXNwb25zZVRlc3QjcmVkaXJlY3RlZFVyaSgpfSBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJmaWx0ZXJDaGFuZ2VkQmFzZVVyaSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvbldpdGhDaGFuZ2VkQmFzZVVyaSgpIHsKKyAgICAgICAgICAgIGZhaWwoIk1ldGhvZCBzaG91bGQgbm90IGV4cGVjdGVkIHRvIGJlIGNhbGxlZCwgYXMgcHJlbWF0Y2hpbmcgZmlsdGVyIHNob3VsZCBoYXZlIGNoYW5nZWQgdGhlIHJlcXVlc3QgdXJpLiIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgibmV3IikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTm90IGNhbGxlZCBieSB0aGUgdGVzdCBkaXJlY3RseSwgYnV0IGFmdGVyIHByZW1hdGNoaW5nIGZpbHRlciByZWRpcmVjdCBmcm9tCisgICAgICAgICAqIHtAbGluayBSZXNwb25zZVRlc3QjbG9jYXRpb25XaXRoQ2hhbmdlZEJhc2VVcmkoKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIDIwMSBDcmVhdGVkfSByZXNwb25zZSB3aXRoIGxvY2F0aW9uIHJlc29sdmVkIGFnYWluc3QgbmV3IGJhc2VVcmkuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJuZXdVcmkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcmVkaXJlY3RlZFVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKFVSSS5jcmVhdGUoIm5ld1JlZGlyZWN0ZWQiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgcmVsYXRpdmUgVVJJIHJlc29sdXRpb24gaW4gY2FzZSBvZiB7QGNvZGUgc2VlT3RoZXJ9IHJlc3BvbnNlLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSAzMDMgU2VlIE90aGVyfSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInNlZU90aGVyIikKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHNlZU90aGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVSSS5jcmVhdGUoIm90aGVyIikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0ZXN0aW5nIHJlbGF0aXZlIFVSSSByZXNvbHV0aW9uIGluIGNhc2Ugb2Yge0Bjb2RlIHNlZU90aGVyfSByZXNwb25zZS4KKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgMzAzIFNlZSBPdGhlcn0gcmVzcG9uc2Ugd2l0aCByZWxhdGl2ZSBVUkkKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNlZU90aGVyTGVhZGluZyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBzZWVPdGhlcldpdGhMZWFkaW5nU2xhc2goKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VlT3RoZXIoVVJJLmNyZWF0ZSgiL290aGVyIikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0ZXN0aW5nIHJlbGF0aXZlIFVSSSByZXNvbHV0aW9uIGluIGNhc2Ugb2Yge0Bjb2RlIHNlZU90aGVyfSByZXNwb25zZS4KKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgMzAzIFNlZSBPdGhlcn0gcmVzcG9uc2Ugd2l0aCByZWxhdGl2ZSBVUkkKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNlZU90aGVyVHJhaWxpbmciKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugc2VlT3RoZXJXaXRoVHJhaWxpbmdTbGFzaCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZWVPdGhlcihVUkkuY3JlYXRlKCJvdGhlci8iKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgcmVsYXRpdmUgVVJJIHJlc29sdXRpb24gaW4gY2FzZSBvZiB7QGNvZGUgdGVtcG9yYXJ5UmVkaXJlY3R9IHJlc3BvbnNlLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSAzMDcgVGVtcG9yYXJ5IFJlZGlyZWN0fSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVtcG9yYXJ5UmVkaXJlY3QiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdGVtcG9yYXJ5UmVkaXJlY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UudGVtcG9yYXJ5UmVkaXJlY3QoVVJJLmNyZWF0ZSgicmVkaXJlY3QiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgcmVsYXRpdmUgVVJJIHJlc29sdXRpb24gaW4gY2FzZSBvZiB7QGNvZGUgdGVtcG9yYXJ5UmVkaXJlY3R9IHJlc3BvbnNlLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSAzMDcgVGVtcG9yYXJ5IFJlZGlyZWN0fSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVtcG9yYXJ5UmVkaXJlY3RMZWFkaW5nIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRlbXBvcmFyeVJlZGlyZWN0V2l0aExlYWRpbmdTbGFzaCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS50ZW1wb3JhcnlSZWRpcmVjdChVUkkuY3JlYXRlKCIvcmVkaXJlY3QiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgcmVsYXRpdmUgVVJJIHJlc29sdXRpb24gaW4gY2FzZSBvZiB7QGNvZGUgdGVtcG9yYXJ5UmVkaXJlY3R9IHJlc3BvbnNlLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSAzMDcgVGVtcG9yYXJ5IFJlZGlyZWN0fSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVtcG9yYXJ5UmVkaXJlY3RUcmFpbGluZyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0ZW1wb3JhcnlSZWRpcmVjdFdpdGhUcmFpbGluZ1NsYXNoKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnRlbXBvcmFyeVJlZGlyZWN0KFVSSS5jcmVhdGUoInJlZGlyZWN0LyIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybiBVcmlCdWlsZGVyIHdpdGggYmFzZSBwcmUtc2V0IHtAY29kZSAvUmVzcG9uc2VUZXN0fSB1cmkgc2VnbWVudCBmb3IgdGhpcyByZXNvdXJjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBVcmlCdWlsZGVyCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFVyaUJ1aWxkZXIgZ2V0VXJpQnVpbGRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShSZXNwb25zZVRlc3QuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzaWMgdGVzdDsgcmVzb3VyY2UgbWV0aG9kcyByZXR1cm5zIHJlbGF0aXZlIHVyaSwgdGVzdCBleHBlY3RzIHVyaSB0byBiZSBhYnNvbHV0ZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRSZWxhdGl2ZVVyaVRvQWJzb2x1dGUoKSB7CisgICAgICAgIGNoZWNrUmVzb3VyY2UoIlJlc3BvbnNlVGVzdC9sb2NhdGlvbiIsICJsb2NhdGlvbiIpOworICAgICAgICAvLyBjaGVja1Jlc291cmNlKCJSZXNwb25zZVRlc3QvbG9jYXRpb24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdpdGggZW50aXR5OyBtb3N0IG9mIHRoZSBIVFRQIDIwMSBDcmVhdGVkIHJlc3BvbnNlcyBkbyBub3QgY29udGFpbiBhbnkgYm9keSwganVzdCBoZWFkZXJzLgorICAgICAqIFRoaXMgdGVzdCBlbnN1cmVzLCB0aGF0IHRoZSB1cmkgY29udmVyc2lvbiB3b3JrcyBldmVuIGluIGNhc2Ugd2hlbiBlbnRpdHkgaXMgcHJlc2VudC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZVVyaVdpdGhFbnRpdHkoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2hlY2tSZXNvdXJjZSgiUmVzcG9uc2VUZXN0L2xvY2F0aW9uV2l0aEJvZHkiLCAibG9jYXRpb25XaXRoQm9keSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCBudWxsIGxvY2F0aW9uOworICAgICAqIEVuc3VyZXMsIHRoYXQgdGhlIG51bGwgbG9jYXRpb24gaXMgcHJvY2Vzc2VkIGNvcnJlY3RseS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTG9jYXRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L2xvY2F0aW9uTnVsbCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbiByZXNvbHZlZCBmcm9tIHJlc3BvbnNlID4gIiArIGxvY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiTG9jYXRpb24gaGVhZGVyIHNob3VsZCBiZSBhYnNvbHV0ZSBVUkkiLCBsb2NhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgaWYgdGhlIFVSSSBpcyBhYnNvbHV0aXplZCBpbiB0aGUgUmVzcG9uc2UgZGlyZWN0bHkgYWZ0ZXIgUmVzcG9uc2UuQnVpbGRlci5jcmVhdGVkKCkgaXMgY2FsbGVkCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVyc2lvbkRpcmVjdGx5KCkgeworICAgICAgICBmaW5hbCBCb29sZWFuIHJlc3VsdCA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC9sb2NhdGlvbkRpcmVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlZU90aGVyKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC9zZWVPdGhlciIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoIlRFWFQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJvdGhlciIsIGxvY2F0aW9uKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC9zZWVPdGhlckxlYWRpbmciKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJvdGhlciIsIGxvY2F0aW9uKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC9zZWVPdGhlclRyYWlsaW5nIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyAib3RoZXIvIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRlbXBvcmFyeVJlZGlyZWN0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC90ZW1wb3JhcnlSZWRpcmVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJyZWRpcmVjdCIsIGxvY2F0aW9uKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC90ZW1wb3JhcnlSZWRpcmVjdExlYWRpbmciKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJyZWRpcmVjdCIsIGxvY2F0aW9uKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC90ZW1wb3JhcnlSZWRpcmVjdFRyYWlsaW5nIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyAicmVkaXJlY3QvIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIHByaXZhdGUgUmVzcG9uc2UgY2hlY2tSZXNvdXJjZShmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZWxhdGl2ZVVyaSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2VQYXRoKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkgKyBleHBlY3RlZFJlbGF0aXZlVXJpLCBsb2NhdGlvbik7CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9Cit9CisKKworCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJGaWx0ZXJzVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyRmlsdGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk3NWFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyRmlsdGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkR5bmFtaWNGZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0IGlmIHRoZSBsb2NhdGlvbiByZXNwb25zZSBoZWFkZXIgcmVsYXRpdmUgVVJJIGlzIGNvcnJlY3RseSByZXNvbHZlZCB3aXRoaW4gY29tcGxleCBjYXNlcyB3aXRoIGludGVyY2VwdG9ycywgZmlsdGVycywKKyAqIGV4Y2VwdGlvbiBtYXBwZXJzLCBldGMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTG9jYXRpb25IZWFkZXJGaWx0ZXJzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTG9jYXRpb25IZWFkZXJCYXNpY1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHN0YXRpYyBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3I7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIE15VGVzdC5jbGFzcywKKyAgICAgICAgICAgICAgICBMb2NhdGlvbk1hbmlwdWxhdGlvbkR5bmFtaWNCaW5kaW5nLmNsYXNzLAorICAgICAgICAgICAgICAgIEFib3J0aW5nUHJlTWF0Y2hpbmdSZXF1ZXN0RmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIEJhc2VVcmlDaGFuZ2luZ1ByZU1hdGNoaW5nRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RFeGNlcHRpb25NYXBwZXIuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIHRlc3QgaW5mcmFzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBJbiB0aGlzIGNhc2UgaXQgcHJlcGFyZXMgZXhlY3V0b3IgdGhyZWFkIHBvb2wgb2Ygc2l6ZSBvbmUgYW5kIGluaXRpYWxpemVzIHRoZSB0aHJlYWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICAvKiB0aHJlYWQgcG9vbCBmb3IgY3VzdG9tIGV4ZWN1dG9yIGFzeW5jIHRlc3QgKi8KKyAgICAgICAgTG9jYXRpb25IZWFkZXJGaWx0ZXJzVGVzdC5leGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMSk7CisKKyAgICAgICAgLy8gRm9yY2UgdGhlIHRocmVhZCB0byBiZSBlYWdlcmx5IGluc3RhbnRpYXRlZCAtIHRoaXMgcHJldmVudHMgdGhlIGluc3RhbnRpYXRpb24gbGF0ZXIgYW5kIGVuc3VyZXMsIHRoYXQgdGhlIHRocmVhZAorICAgICAgICAvLyB3aWxsIG5vdCBiZSBhIGNoaWxkIHRocmVhZCBvZiB0aGUgcmVxdWVzdCBoYW5kbGluZyB0aHJlYWQsIHNvIHRoZSB0aHJlYWQtbG9jYWwgYmFzZVVyaSB2YXJpYWJsZSB3aWxsIG5vdCBiZSBpbmhlcml0ZWQuCisgICAgICAgIExvY2F0aW9uSGVhZGVyRmlsdGVyc1Rlc3QuZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJUaHJlYWQgcG9vbCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IEpBWC1SUyByZXNvdXJjZQorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJWb2lkTWV0aG9kQW5ub3RhdGVkV2l0aEdFVCIpCisgICAgQFBhdGgodmFsdWUgPSAiL1Jlc3BvbnNlVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVRlc3QgeworCisgICAgICAgIC8qIGluamVjdGVkIHJlcXVlc3QgVVJJIGZvciBhc3NlcnRpb25zIGluIHRoZSByZXNvdXJjZSBtZXRob2RzICovCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSB0ZXN0IHdpdGggdXJpIHJld3JpdHRlbiBpbiB0aGUgZmlsdGVyCisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHVyaQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb25UZXN0V2l0aEZpbHRlciIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvblRlc3RXaXRoRmlsdGVyKCkgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGUoImxvY2F0aW9uIik7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiVVJJIENyZWF0ZWQgaW4gdGhlIHJlc291cmNlIG1ldGhvZCA+ICIgKyB1cmkpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIHRlc3Qgd2l0aCB1cmkgcmV3cml0dGVuIGluIHRoZSBpbnRlcmNlcHRvcgorICAgICAgICAgKiBAcmV0dXJuIHRlc3QgcmVzcG9uc2Ugd2l0aCByZWxhdGl2ZSBsb2NhdGlvbiB1cmkgYW5kIHdpdGggYm9keQorICAgICAgICAgKiAod3JpdGUgaW50ZXJjZXB0b3JzIGFyZSBub3QgdHJpZ2dlcmVkIGZvciBlbnRpdHktbGVzcyByZXNwb25zZXMpCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbldpdGhJbnRlcmNlcHRvciIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvblRlc3RXaXRoSW50ZXJjZXB0b3IoKSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSgiZm9vIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmVudGl0eSgiUmV0dXJuIGZyb20gbG9jYXRpb25UZXN0V2l0aEludGVyY2VwdG9yIikudHlwZSgidGV4dC9wbGFpbiIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgVVJJIGFic29sdXRpemF0aW9uIGFmdGVyIHRoZSBhYm9ydGlvbiBpbiB0aGUgcG9zdC1tYXRjaGluZyBmaWx0ZXIuCisgICAgICAgICAqIEByZXR1cm4gZHVtbXkgcmVzcG9uc2UgLSB0aGlzIHN0cmluZyBzaG91bGQgbmV2ZXIgYmUgcHJvcGFnYXRlZCB0byB0aGUgY2xpZW50ICh0aGUgcHJvY2Vzc2luZyBjaGFpbgorICAgICAgICAgKiB3aWxsIGJlIGFib3J0ZWQgaW4gdGhlIGZpbHRlciBiZWZvcmUgdGhpcyByZXNvdXJjZSBtZXRob2QgaXMgZXZlbiBjYWxsZWQuCisgICAgICAgICAqIEhvd2V2ZXIsIGl0IGlzIG5lZWRlZCBoZXJlLCBiZWNhdXNlIHRoZSBmaWx0ZXIgaXMgYm91bmQgdG8gdGhlIHJlc291cmNlIG1ldGhvZCBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb25BYm9ydGVkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBsb2NhdGlvblRlc3RBYm9ydGVkKCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc291cmNlIG1ldGhvZCBsb2NhdGlvblRlc3RBYm9ydGVkKCkgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLiBUaGUgcG9zdC1tYXRjaGluZyBmaWx0ZXIgd2FzICIKKyAgICAgICAgICAgICAgICAgICAgKyAibm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LiAiLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gIkRVTU1ZX1JFU1BPTlNFIjsgLy8gdGhpcyBzdHJpbmcgc2hvdWxkIG5ldmVyIHJlYWNoIHRoZSBjbGllbnQgKHRoZSByZXNvdXJjZSBtZXRob2Qgd2lsbCBub3QgYmUgY2FsbGVkKQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyBVUkkgYWJzb2x1dGl6YXRpb24gYWZ0ZXIgdGhlIGFib3J0aW9uIGluIHRoZSBwcmUtbWF0Y2hpbmcgZmlsdGVyLgorICAgICAgICAgKiBAcmV0dXJuIGR1bW15IHJlc3BvbnNlIC0gdGhpcyBzdHJpbmcgc2hvdWxkIG5ldmVyIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNsaWVudCAodGhlIHByb2Nlc3NpbmcgY2hhaW4gd2lsbCBiZQorICAgICAgICAgKiBleGVjdXRvckNvbXBhcmlzb25GYWlsZWQgaW4gdGhlIGZpbHRlciBiZWZvcmUgdGhpcyByZXNvdXJjZSBtZXRob2QgaXMgZXZlbiBjYWxsZWQuCisgICAgICAgICAqIEhvd2V2ZXIsIGl0IGlzIG5lZWRlZCBoZXJlLCBiZWNhdXNlIHRoZSBmaWx0ZXIgaXMgYm91bmQgdG8gdGhlIHJlc291cmNlIG1ldGhvZCBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb25BYm9ydGVkUHJlTWF0Y2hpbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGxvY2F0aW9uVGVzdFByZU1hdGNoaW5nQWJvcnRlZCgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSByZXNvdXJjZSBtZXRob2QgbG9jYXRpb25UZXN0UHJlTWF0Y2hpbmdBYm9ydGVkKCkgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLiBUaGUgcHJlLW1hdGNoaW5nICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZmlsdGVyIHdhcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuICIsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiAiRFVNTVlfUkVTUE9OU0UiOyAvLyB0aGlzIHN0cmluZyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhlIGNsaWVudCAodGhlIHJlc291cmNlIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQpCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCBvZiBSZXNwb25zZUZpbHRlcnMgaW4gdGhlIHN5bmMgY2FzZS4KKyAgICAgICAgICogUmV0dXJucyByZXNwb25zZSB3aXRoIGEgcmVsYXRpdmUgVVJJLCB3aGljaCBpcyB0aGFuIGFic29sdXRpemVkIGJ5IEplcnNleS4KKyAgICAgICAgICogTGF0ZXIgdGhlIHtAbGluayBVcmlDaGVja2luZ1Jlc3BvbnNlRmlsdGVyfSBpcyB0cmlnZ2VyZWQgYW5kIGNoZWNrcyB0aGUgVVJJIGFnYWluIC0gdGhlIGNoZWNrIGl0c2VsZiBpcyBkb25lIGluIHRoZQorICAgICAgICAgKiBmaWx0ZXIuCisgICAgICAgICAqIEJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrLCB0aGUgZmlsdGVyIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0YXR1cyAoMjAxIC0gQ3JlYXRlZCkgb3IgYW4KKyAgICAgICAgICogZXJyb3Igc3RhdHVzICg1MDAgLSBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IpIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2UgYm9keS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlRmlsdGVyU3luYyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSByZXNwb25zZUZpbHRlclN5bmMoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCJyZXNwb25zZUZpbHRlclN5bmMiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSB0ZXN0IG9mIFJlc3BvbnNlRmlsdGVycyBpbiB0aGUgYXN5bmMgY2FzZS4gSXQgcnVucyBpbiB0aGUgc2VwYXJhdGUgdGhyZWFkIGNyZWF0ZWQgb24gcmVxdWVzdC4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyByZXNwb25zZSB3aXRoIGEgcmVsYXRpdmUgVVJJLCB3aGljaCBpcyB0aGFuIGFic29sdXRpemVkIGJ5IEplcnNleS4KKyAgICAgICAgICogTGF0ZXIgdGhlIHtAbGluayBVcmlDaGVja2luZ1Jlc3BvbnNlRmlsdGVyfSBpcyB0cmlnZ2VyZWQgYW5kIGNoZWNrcyB0aGUgVVJJIGFnYWluIC0gdGhlIGNoZWNrIGl0c2VsZiBpcyBkb25lIGluIHRoZQorICAgICAgICAgKiBmaWx0ZXIuCisgICAgICAgICAqIEJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrLCB0aGUgZmlsdGVyIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0YXR1cyAoMjAxIC0gQ3JlYXRlZCkgb3IgYW4KKyAgICAgICAgICogZXJyb3Igc3RhdHVzICg1MDAgLSBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IpIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2UgYm9keS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlRmlsdGVyQXN5bmMiKQorICAgICAgICBwdWJsaWMgdm9pZCByZXNwb25zZUZpbHRlckFzeW5jKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3VsdCA9IFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgicmVzcG9uc2VGaWx0ZXJBc3luYyIpKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCBvZiBSZXNwb25zZUZpbHRlcnMgaW4gdGhlIGFzeW5jL2V4ZWN1dG9yIGNhc2UuIEl0IHJ1bnMgaW4gYSB0aHJlYWQgY3JlYXRlZCBvdXQgb2YgdGhlCisgICAgICAgICAqIHJlcXVlc3Qgc2NvcGUuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgcmVzcG9uc2Ugd2l0aCBhIHJlbGF0aXZlIFVSSSwgd2hpY2ggaXMgdGhhbiBhYnNvbHV0aXplZCBieSBKZXJzZXkuCisgICAgICAgICAqIExhdGVyIHRoZSB7QGxpbmsgVXJpQ2hlY2tpbmdSZXNwb25zZUZpbHRlcn0gaXMgdHJpZ2dlcmVkIGFuZCBjaGVja3MgdGhlIFVSSSBhZ2FpbiAtIHRoZSBjaGVjayBpdHNlbGYgaXMgZG9uZSBpbiB0aGUKKyAgICAgICAgICogZmlsdGVyLgorICAgICAgICAgKiBCYXNlZCBvbiB0aGUgcmVzdWx0IG9mIHRoZSBjaGVjaywgdGhlIGZpbHRlciByZXR1cm5zIHRoZSBvcmlnaW5hbCBzdGF0dXMgKDIwMSAtIENyZWF0ZWQpIG9yIGFuCisgICAgICAgICAqIGVycm9yIHN0YXR1cyAoNTAwIC0gSW50ZXJuYWwgU2VydmVyIEVycm9yKSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIHJlc3BvbnNlIGJvZHkuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXNwb25zZUZpbHRlckFzeW5jRXhlY3V0b3IiKQorICAgICAgICBwdWJsaWMgdm9pZCByZXNwb25zZUZpbHRlckFzeW5jRXhlY3V0b3IoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgicmVzcG9uc2VGaWx0ZXJBc3luY0V4ZWN1dG9yIikpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0ZXN0aW5nIGZvciB0ZXN0aW5nIHRoZSBVUkkgYWJzb2x1dGl6YXRpb24gaW4gdGhlIGV4Y2VwdGlvbiBtYXBwZXIgaW4gdGhlIHN5bmNocm9ub3VzIGNhc2UuCisgICAgICAgICAqCisgICAgICAgICAqIE1ldGhvZCBhbHdheXMgdGhyb3dzIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0sIHdoaWNoIGlzIGRlZmluZWQgdG8gYmUgaGFuZGxlZCBieSB7QGxpbmsgVGVzdEV4Y2VwdGlvbk1hcHBlcn0uCisgICAgICAgICAqIFRoZSBleGNlcHRpb24gbWFwcGVyIHRoZW4gY3JlYXRlcyB0aGUgcmVzcG9uc2Ugd2l0aCByZWxhdGl2ZSBVUkkgYW5kIHJlc3BvbnNlIGlzIHJvdXRlZAorICAgICAgICAgKiBpbnRvIHtAbGluayBVcmlDaGVja2luZ1Jlc3BvbnNlRmlsdGVyfSwgd2hpY2ggY2hlY2tzIGlmIHRoIFVSSSB3YXMgY29ycmVjdGx5IGFic29sdXRpemVkLgorICAgICAgICAgKiBAcmV0dXJuIGRvZXMgbm90IHJldHVybiBhbnkgcmVzcG9uc2UKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4Y2VwdGlvbk1hcHBlclN5bmMiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZXhjZXB0aW9uTWFwcGVyU3luYygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyBmb3IgdGVzdGluZyB0aGUgVVJJIGFic29sdXRpemF0aW9uIGluIHRoZSBleGNlcHRpb24gbWFwcGVyIGluIHRoZSBhc3luY2hyb25vdXMgY2FzZS4KKyAgICAgICAgICogTmV3IHRocmVhZCBpcyBzdGFydGVkIGZvciB0aGUgcmVzb3VyY2UgbWV0aG9kIHByb2Nlc3NpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIE1ldGhvZCBhbHdheXMgInRocm93cyIge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSAoaW4gY2FzZSBvZiBhc3luYyBtZXRob2RzLAorICAgICAgICAgKiB0aGUgZXhjZXB0aW9ucyBhcmUgbm90IHRocm93biBkaXJlY3RseSwgYnV0IHBhc3NlZCB0byB7QGxpbmsgQXN5bmNSZXNwb25zZSNyZXN1bWUoVGhyb3dhYmxlKX0pLAorICAgICAgICAgKiB3aGljaCBpcyBkZWZpbmVkIHRvIGJlIGhhbmRsZWQgYnkge0BsaW5rIFRlc3RFeGNlcHRpb25NYXBwZXJ9LiAgICAgICAgICoKKyAgICAgICAgICogVGhlIGV4Y2VwdGlvbiBtYXBwZXIgdGhlbiBjcmVhdGVzIHRoZSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSSBhbmQgcmVzcG9uc2UgaXMgcm91dGVkCisgICAgICAgICAqIGludG8ge0BsaW5rIFVyaUNoZWNraW5nUmVzcG9uc2VGaWx0ZXJ9LCB3aGljaCBjaGVja3MgaWYgdGggVVJJIHdhcyBjb3JyZWN0bHkgYWJzb2x1dGl6ZWQuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJleGNlcHRpb25NYXBwZXJBc3luYyIpCisgICAgICAgIHB1YmxpYyB2b2lkIGV4Y2VwdGlvbk1hcHBlckFzeW5jKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyBmb3IgdGVzdGluZyB0aGUgVVJJIGFic29sdXRpemF0aW9uIGluIHRoZSBleGNlcHRpb24gbWFwcGVyIGluIHRoZSBhc3luY2hyb25vdXMgY2FzZS4KKyAgICAgICAgICogQSB0aHJlYWQgZnJvbSBleGVjdXRvciB0aHJlYWQgcG9vbCAoY3JlYXRlZCBvdXQgb2YgcmVxdWVzdCBzY29wZSkgaXMgdXNlZCBmb3IgcHJvY2Vzc2luZyB0aGUgcmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBNZXRob2QgYWx3YXlzICJ0aHJvd3MiIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gKGluIGNhc2Ugb2YgYXN5bmMgbWV0aG9kcywKKyAgICAgICAgICogdGhlIGV4Y2VwdGlvbnMgYXJlIG5vdCB0aHJvd24gZGlyZWN0bHksIGJ1dCBwYXNzZWQgdG8ge0BsaW5rIEFzeW5jUmVzcG9uc2UjcmVzdW1lKFRocm93YWJsZSl9KSwKKyAgICAgICAgICogd2hpY2ggaXMgZGVmaW5lZCB0byBiZSBoYW5kbGVkIGJ5IHtAbGluayBUZXN0RXhjZXB0aW9uTWFwcGVyfS4gICAgICAgICAqCisgICAgICAgICAqIFRoZSBleGNlcHRpb24gbWFwcGVyIHRoZW4gY3JlYXRlcyB0aGUgcmVzcG9uc2Ugd2l0aCByZWxhdGl2ZSBVUkkgYW5kIHJlc3BvbnNlIGlzIHJvdXRlZAorICAgICAgICAgKiBpbnRvIHtAbGluayBVcmlDaGVja2luZ1Jlc3BvbnNlRmlsdGVyfSwgd2hpY2ggY2hlY2tzIGlmIHRoIFVSSSB3YXMgY29ycmVjdGx5IGFic29sdXRpemVkLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZXhjZXB0aW9uTWFwcGVyRXhlY3V0b3IiKQorICAgICAgICBwdWJsaWMgdm9pZCBleGNlcHRpb25NYXBwZXJFeGVjdXRvcihAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgY29ycmVjdCBiYXNlVXJpIGFuZCByZXF1ZXN0IG92ZXJ3cml0ZSBpbiB0aGUgcHJlbWF0Y2hpbmcgZmlsdGVyLgorICAgICAgICAgKiBTaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ5IHRoZSB0ZXN0LCBhcyB7QGxpbmsgTXlUZXN0I3JlZGlyZWN0ZWRVcmkoKX0gc2hvdWxkIGJlIGNhbGxlZCBpbnN0ZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZmlsdGVyQ2hhbmdlZEJhc2VVcmkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25XaXRoQ2hhbmdlZEJhc2VVcmkoKSB7CisgICAgICAgICAgICBmYWlsKCJNZXRob2Qgc2hvdWxkIG5vdCBleHBlY3RlZCB0byBiZSBjYWxsZWQsIGFzIHByZW1hdGNoaW5nIGZpbHRlciBzaG91bGQgaGF2ZSBjaGFuZ2VkIHRoZSByZXF1ZXN0IHVyaS4iKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKFVSSS5jcmVhdGUoIm5ldyIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5vdCBjYWxsZWQgYnkgdGhlIHRlc3QgZGlyZWN0bHksIGJ1dCBhZnRlciBwcmVtYXRjaGluZyBmaWx0ZXIgcmVkaXJlY3QgZnJvbQorICAgICAgICAgKiB7QGxpbmsgTXlUZXN0I2xvY2F0aW9uV2l0aENoYW5nZWRCYXNlVXJpKCl9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSAyMDEgQ3JlYXRlZH0gcmVzcG9uc2Ugd2l0aCBsb2NhdGlvbiByZXNvbHZlZCBhZ2FpbnN0IG5ldyBiYXNlVXJpLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibmV3VXJpIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHJlZGlyZWN0ZWRVcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCJuZXdSZWRpcmVjdGVkIikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgVVJJIGNyZWF0ZWQgaW4gdGhlIHBvc3QtbWF0Y2hpbmcgcmVxdWVzdCBmaWx0ZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRGaWx0ZXIoKSB7CisgICAgICAgIGNoZWNrUmVzcG9uc2VGaWx0ZXIoIlJlc3BvbnNlVGVzdC9sb2NhdGlvbkFib3J0ZWQiLCAidXJpQWZ0ZXJBYm9ydGlvbi9TVUNDRVNTIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgVVJJIGNyZWF0ZWQgaW4gdGhlIHByZS1tYXRjaGluZyByZXF1ZXN0IGZpbHRlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYm9ydFByZU1hdGNoaW5nRmlsdGVyKCkgeworICAgICAgICBjaGVja1Jlc291cmNlKCJSZXNwb25zZVRlc3QvbG9jYXRpb25BYm9ydGVkUHJlTWF0Y2hpbmciLCAidXJpQWZ0ZXJQcmVNYXRjaGluZ0Fib3J0aW9uL1NVQ0NFU1MiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCBVUkkgUmV3cml0dGVuIGluIHRoZSBjb250YWluZXIgcmVzcG9uc2UgZmlsdGVyOworICAgICAqIEZpbHRlcnMgZG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIHJlc3BvbnNlIGhlYWRlcnMgYW5kIGNhbiBtYW5pcHVsYXRlIHRoZSBsb2NhdGlvbiB1cmkgc28gdGhhdCBpdCBjb250YWlucyBhIHJlbGF0aXZlIGFkZHJlc3MuCisgICAgICogVGhpcyB0ZXN0IGluY29ycG9yYXRlcyBhIGZpbHRlciB3aGljaCByZXBsYWNlcyB0aGUgdXJpIHdpdGggYSByZWxhdGl2ZSBvbmUuIEhvd2V2ZXIgd2UgZXhwZWN0IHRvIGhhdmUgYWJzb2x1dGUgdXJpIGF0CisgICAgICogdGhlIGVuZCBvZiB0aGUgY2hhaW4uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGVVcmlXaXRoRmlsdGVyKCkgeworICAgICAgICBjaGVja1Jlc291cmNlKCJSZXNwb25zZVRlc3QvbG9jYXRpb25UZXN0V2l0aEZpbHRlciIsICJSZXNwb25zZVRlc3QvVXJpQ2hhbmdlZEJ5RmlsdGVyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aXRoIFVSSSBSZXdyaXR0ZW4gaW4gdGhlIHdyaXRlciBpbnRlcmNlcHRvcjsKKyAgICAgKiBJbnRlcmNlcHRvcnMgZG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIHJlc3BvbnNlIGhlYWRlcnMgYW5kIGNhbiBtYW5pcHVsYXRlIHRoZSBsb2NhdGlvbiB1cmkgc28gdGhhdCBpdCBjb250YWlucyBhIHJlbGF0aXZlCisgICAgICogYWRkcmVzcy4KKyAgICAgKiBUaGlzIHRlc3QgaW5jb3Jwb3JhdGVzIGFuIGludGVyY2VwdG9yIHdoaWNoIHJlcGxhY2VzIHRoZSB1cmkgd2l0aCBhIHJlbGF0aXZlIG9uZS4gSG93ZXZlciB3ZSBleHBlY3QgdG8gaGF2ZSBhYnNvbHV0ZSB1cmkKKyAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBjaGFpbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZVVyaVdpdGhJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgY2hlY2tSZXNvdXJjZSgiUmVzcG9uc2VUZXN0L2xvY2F0aW9uV2l0aEludGVyY2VwdG9yIiwgIlJlc3BvbnNlVGVzdC9VcmlDaGFuZ2VkQnlJbnRlcmNlcHRvciIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCwgdGhhdCB1cmkgaXMgY29ycmVjdCBpbiB0aGUgcmVzcG9uc2UgZmlsdGVyIHdoZW4gY3JlYXRlZCBpbiB0aGUgZXhjZXB0aW9uIG1hcHBlciAoc3luY2hyb25vdXMpLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbk1hcHBlclN5bmMoKSB7CisgICAgICAgIGNoZWNrUmVzcG9uc2VGaWx0ZXIoIlJlc3BvbnNlVGVzdC9leGNlcHRpb25NYXBwZXJTeW5jIiwgIkVYQ0VQVElPTl9NQVBQRVIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IHVyaSBpcyBjb3JyZWN0IGluIHRoZSByZXNwb25zZSBmaWx0ZXIgd2hlbiBjcmVhdGVkIGluIHRoZSBleGNlcHRpb24gbWFwcGVyIChhc3luY2hyb25vdXMpLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbk1hcHBlckFzeW5jKCkgeworICAgICAgICBjaGVja1Jlc3BvbnNlRmlsdGVyKCJSZXNwb25zZVRlc3QvZXhjZXB0aW9uTWFwcGVyQXN5bmMiLCAiRVhDRVBUSU9OX01BUFBFUiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QsIHRoYXQgdXJpIGlzIGNvcnJlY3QgaW4gdGhlIHJlc3BvbnNlIGZpbHRlciB3aGVuIGNyZWF0ZWQgaW4gdGhlIGV4Y2VwdGlvbiBtYXBwZXIgKGFzeW5jaHJvbm91cy9leGVjdXRvcikuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uTWFwcGVyRXhlY3V0b3IoKSB7CisgICAgICAgIGNoZWNrUmVzcG9uc2VGaWx0ZXIoIlJlc3BvbnNlVGVzdC9leGNlcHRpb25NYXBwZXJFeGVjdXRvciIsICJFWENFUFRJT05fTUFQUEVSIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgYmFzZVVyaSBhbmQgcmVxdWVzdFVyaSBjaGFuZ2UgaW4gdGhlIHByZW1hdGNoaW5nIGZpbHRlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbkJhc2VVcmlDaGFuZ2VkQnlQcmVtYXRjaGluZ0ZpbHRlcigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJSZXNwb25zZVRlc3QvZmlsdGVyQ2hhbmdlZEJhc2VVcmkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3d3dy5zZXJ2ZXIuY29tL25ld1JlZGlyZWN0ZWQiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkxvY2F0aW9uIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QsIHRoYXQgdXJpIGlzIGNvcnJlY3QgaW4gdGhlIHJlc3BvbnNlIGZpbHRlciAoc3luY2hyb25vdXMpLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc3BvbnNlRmlsdGVyU3luYygpIHsKKyAgICAgICAgY2hlY2tSZXNwb25zZUZpbHRlcigiUmVzcG9uc2VUZXN0L3Jlc3BvbnNlRmlsdGVyU3luYyIsICJyZXNwb25zZUZpbHRlclN5bmMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IHVyaSBpcyBjb3JyZWN0IGluIHRoZSByZXNwb25zZSBmaWx0ZXIgKGFzeW5jaHJvbm91cykuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VGaWx0ZXJBc3luYygpIHsKKyAgICAgICAgY2hlY2tSZXNwb25zZUZpbHRlcigiUmVzcG9uc2VUZXN0L3Jlc3BvbnNlRmlsdGVyQXN5bmMiLCAicmVzcG9uc2VGaWx0ZXJBc3luYyIpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IHVyaSBpcyBjb3JyZWN0IGluIHRoZSByZXNwb25zZSBmaWx0ZXIgKGFzeW5jaHJvbm91cy9leGVjdXRvcikuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VGaWx0ZXJBc3luY0V4ZWN1dG9yKCkgeworICAgICAgICBjaGVja1Jlc3BvbnNlRmlsdGVyKCJSZXNwb25zZVRlc3QvcmVzcG9uc2VGaWx0ZXJBc3luY0V4ZWN1dG9yIiwgInJlc3BvbnNlRmlsdGVyQXN5bmNFeGVjdXRvciIpOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBSZXNwb25zZSBmaWx0ZXIgLSByZXBsYWNlcyB0aGUgTG9jYXRpb24gaGVhZGVyIHdpdGggYSByZWxhdGl2ZSB1cmkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2NhdGlvbk1hbmlwdWxhdGlvbkZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsID8+IGhlYWRlcnMgPSByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpOworICAgICAgICAgICAgZmluYWwgTGlzdDxVUkk+IGxvY2F0aW9ucyA9IChMaXN0PFVSST4pIGhlYWRlcnMuZ2V0KEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgICAgIGxvY2F0aW9ucy5zZXQoMCwgVVJJLmNyZWF0ZSgiUmVzcG9uc2VUZXN0L1VyaUNoYW5nZWRCeUZpbHRlciIpKTsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbk1hbmlwdWxhdGlvbkZpbHRlciBhcHBsaWVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzcG9uc2UgZmlsdGVyIC0gY2hlY2sgaWYgdGhlIFVSSSBpcyBhYnNvbHV0ZS4gSWYgaXQgaXMgbm90IGNvcnJlY3RseSBhYnNvbHV0aXplZCwKKyAgICAgKiBpdCBjaGFuZ2VzIHRoZSByZXNwb25zZSB0byA1MDAgLSBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IgYW5kIHNldHMgdGhlIGVycm9yIG1lc3NhZ2UgaW50byB0aGUgcmVzcG9uc2UgYm9keS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVyaUNoZWNraW5nUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgVVJJIGxvY2F0aW9uID0gcmVzcG9uc2VDb250ZXh0LmdldExvY2F0aW9uKCk7CisgICAgICAgICAgICBpZiAoIWxvY2F0aW9uLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRTdGF0dXMoUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUi5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoIlJlc3BvbnNlIGxvY2F0aW9uIHdhcyBub3QgYWJzb2x1dGUgaW4gVXJpQ2hlY2tpbmdGaWx0ZXIuIExvY2F0aW9uIHZhbHVlOiAiICsgbG9jYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWVzdCBGaWx0ZXIgd2hpY2ggYWJvcnRzIHRoZSBjdXJyZW50IHJlcXVlc3QgY2FsbGluZyBDb250YWluZXJSZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoKS4KKyAgICAgKgorICAgICAqIFRoZSByZXR1cm5lZCByZXNwb25zZSBpcyBwYXNzZWQgdG8gUmVzcG9uc2UuY3JlYXRlZCgpIGFuZCBpbW1lZGlhdGVseSB0ZXN0ZWQgZm9yIGFic29sdXRpemF0aW9uLgorICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5LCBhcyB0aGUgcmVsYXRpdmUgVVJJIHdvdWxkIGJlIGFic29sdXRpemVkIGxhdGVyIGFueXdheSBhbmQgd291bGQgcmVhY2ggdGhlIGNhbGxpbmcgdGVzdCBtZXRob2QgYXMKKyAgICAgKiBhbiBhYnNvbHV0ZSBVUkkgYW5kIHRoZXJlIHdvdWxkIGJlIG5vIHdheSB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIFVSSSBjb252ZXJzaW9uIHdhcyBkb25lLgorICAgICAqCisgICAgICogVGhlIHJlc3VsdCBvZiB0aGUgdGVzdCBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHRlc3QgbWV0aG9kIGJ5IHNlcGFyYXRlIFVSSSB2YWx1ZXMgaW4gY2FzZSBvZiBhIHN1Y2Nlc3Mgb3IgYSBmYWlsdXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJvcnRpbmdSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJBYm9ydGluZyByZXF1ZXN0IGluIHRoZSByZXF1ZXN0IGZpbHRlci4gUmV0dXJuaW5nIHN0YXR1cyBjcmVhdGVkLiIpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN1Y2Nlc3NSZWxhdGl2ZVVyaSA9ICJ1cmlBZnRlckFib3J0aW9uL1NVQ0NFU1MiOworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZS5jcmVhdGVkKFVSSS5jcmVhdGUoc3VjY2Vzc1JlbGF0aXZlVXJpKSkuYnVpbGQoKTsKKworICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuZXF1YWxzKHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRCYXNlVXJpKCkgKyBzdWNjZXNzUmVsYXRpdmVVcmkpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBSZXNwb25zZS5jcmVhdGVkKFVSSS5jcmVhdGUoInVyaUFmdGVyQWJvcnRpb24vRkFJTFVSRSIpKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgRmlsdGVyIHdoaWNoIGFib3J0cyB0aGUgY3VycmVudCByZXF1ZXN0IGNhbGxpbmcgQ29udGFpbmVyUmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKCkuCisgICAgICoKKyAgICAgKiBUaGUgcmV0dXJuZWQgcmVzcG9uc2UgaXMgcGFzc2VkIHRvIFJlc3BvbnNlLmNyZWF0ZWQoKSBhbmQgaW1tZWRpYXRlbHkgdGVzdGVkIGZvciBhYnNvbHV0aXphdGlvbi4KKyAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSwgYXMgdGhlIHJlbGF0aXZlIFVSSSB3b3VsZCBiZSBhYnNvbHV0aXplZCBsYXRlciBhbnl3YXkgYW5kIHdvdWxkIHJlYWNoIHRoZSBjYWxsaW5nIHRlc3QgbWV0aG9kIGFzCisgICAgICogYW4gYWJzb2x1dGUgVVJJIGFuZCB0aGVyZSB3b3VsZCBiZSBubyB3YXkgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBVUkkgY29udmVyc2lvbiB3YXMgZG9uZS4KKyAgICAgKgorICAgICAqIFRoZSByZXN1bHQgb2YgdGhlIHRlc3QgaXMgcHJvcGFnYXRlZCBiYWNrIHRvIHRoZSB0ZXN0IG1ldGhvZCBieSBzZXBhcmF0ZSBVUkkgdmFsdWVzIGluIGNhc2Ugb2YgYSBzdWNjZXNzIG9yIGEgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFib3J0aW5nUHJlTWF0Y2hpbmdSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRBYnNvbHV0ZVBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKCJsb2NhdGlvbkFib3J0ZWRQcmVNYXRjaGluZyIpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkFib3J0aW5nIHJlcXVlc3QgaW4gdGhlIHJlcXVlc3QgZmlsdGVyLiBSZXR1cm5pbmcgc3RhdHVzIGNyZWF0ZWQuIik7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN1Y2Nlc3NSZWxhdGl2ZVVyaSA9ICJ1cmlBZnRlclByZU1hdGNoaW5nQWJvcnRpb24vU1VDQ0VTUyI7CisgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZS5jcmVhdGVkKFVSSS5jcmVhdGUoc3VjY2Vzc1JlbGF0aXZlVXJpKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS5lcXVhbHMocmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldEJhc2VVcmkoKSArIHN1Y2Nlc3NSZWxhdGl2ZVVyaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBSZXNwb25zZS5jcmVhdGVkKFVSSS5jcmVhdGUoInVyaUFmdGVyUHJlTWF0Y2hpbmdBYm9ydGlvbi9GQUlMVVJFIikpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChyZXNwb25zZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHByZW1hdGNoaW5nIGZpbHRlciB3aGljaCBjaGFuZ2VzIHJlcXVlc3QgVVJJIGFuZCBiYXNlIFVSSS4KKyAgICAgKgorICAgICAqIEFzIGEgcmVzdWx0LCBkaWZmZXJlbnQgcmVzb3VyY2UgbWF0aG9kIHNob3VsZCBiZSBtYXRjaGVkIGFuZCBpbnZva2VkIGFuZCByZXR1cm4gbG9jYXRpb24gcmVzb2x2ZWQgYWdhaW5zdCB0aGUgbmV3CisgICAgICogYmFzZSBVUkkuCisgICAgICovCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXNlVXJpQ2hhbmdpbmdQcmVNYXRjaGluZ0ZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldEFic29sdXRlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoImZpbHRlckNoYW5nZWRCYXNlVXJpIikpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBVUkkgcmVxdWVzdFVyaSA9IHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCk7CisgICAgICAgICAgICAgICAgLy8gTk9URSwgdGhhdCB0aGUgdHJhaWxpbmcgc2xhc2ggbWF0dGVycywgd2l0aG91dCBpdCwgdGhlIFVSSSBpcyBub2QgdmFsaWQgYW5kIGlzIG5vdCBjb3JyZWN0bHkgcmVzb2x2ZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgLy8gVVJJLnJlc29sdmUoKSBtZXRob2QuCisgICAgICAgICAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBVUkkuY3JlYXRlKCJodHRwOi8vd3d3LnNlcnZlci5jb20vIik7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0UmVxdWVzdFVyaShiYXNlVXJpLCByZXF1ZXN0VXJpLnJlc29sdmUoIm5ld1VyaSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlciBpbnRlcmNlcHRvciAtIHJlcGxhY2VzIHRoZSBMb2NhdGlvbiBoZWFkZXIgd2l0aCBhIHJlbGF0aXZlIHVyaS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2F0aW9uTWFuaXB1bGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCA/PiBoZWFkZXJzID0gY29udGV4dC5nZXRIZWFkZXJzKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFVSST4gbG9jYXRpb25zID0gKExpc3Q8VVJJPikgaGVhZGVycy5nZXQoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICAgICAgbG9jYXRpb25zLnNldCgwLCBVUkkuY3JlYXRlKCJSZXNwb25zZVRlc3QvVXJpQ2hhbmdlZEJ5SW50ZXJjZXB0b3IiKSk7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb25NYW5pcHVsYXRpb25JbnRlcmNlcHRvciBhcHBsaWVkLiIpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGNlcHRpb24gbWFwcGVyIHdoaWNoIGNyZWF0ZXMgYSB0ZXN0IHJlc3BvbnNlIHdpdGggYSByZWxhdGl2ZSBVUkkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgiRVhDRVBUSU9OX01BUFBFUiIpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIHRoZSBmaWx0ZXIgYW5kIGludGVyY2VwdG9yIGFuZCBiaW5kcyBpdCB0byB0aGUgcmVzb3VyY2UgbWV0aG9kcyBvZiBpbnRlcmVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2F0aW9uTWFuaXB1bGF0aW9uRHluYW1pY0JpbmRpbmcgaW1wbGVtZW50cyBEeW5hbWljRmVhdHVyZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoTXlUZXN0LmNsYXNzLmVxdWFscyhyZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lID0gcmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLmNvbnRhaW5zKCJsb2NhdGlvblRlc3RXaXRoRmlsdGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihMb2NhdGlvbk1hbmlwdWxhdGlvbkZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbk1hbmlwdWxhdGlvbkZpbHRlciByZWdpc3RlcmVkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kTmFtZS5jb250YWlucygibG9jYXRpb25UZXN0V2l0aEludGVyY2VwdG9yIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihMb2NhdGlvbk1hbmlwdWxhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uTWFuaXB1bGF0aW9uSW50ZXJjZXB0b3IgcmVnaXN0ZXJlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUuY29udGFpbnMoImxvY2F0aW9uVGVzdEFib3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEFib3J0aW5nUmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJBYm9ydGluZ1JlcXVlc3RGaWx0ZXIgcmVnaXN0ZXJlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUuY29udGFpbnMoInJlc3BvbnNlRmlsdGVyU3luYyIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtZXRob2ROYW1lLmNvbnRhaW5zKCJyZXNwb25zZUZpbHRlckFzeW5jIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1ldGhvZE5hbWUuY29udGFpbnMoImxvY2F0aW9uVGVzdEFib3J0ZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbWV0aG9kTmFtZS5jb250YWlucygiZXhjZXB0aW9uTWFwcGVyU3luYyIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtZXRob2ROYW1lLmNvbnRhaW5zKCJleGNlcHRpb25NYXBwZXJBc3luYyIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtZXRob2ROYW1lLmNvbnRhaW5zKCJleGNlcHRpb25NYXBwZXJFeGVjdXRvciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoVXJpQ2hlY2tpbmdSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJVcmlDaGVja2luZ1Jlc3BvbnNlRmlsdGVyIHJlZ2lzdGVyZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLmNvbnRhaW5zKCJsb2NhdGlvbldpdGhDaGFuZ2VkQmFzZVVyaSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoQmFzZVVyaUNoYW5naW5nUHJlTWF0Y2hpbmdGaWx0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiQmFzZVVyaUNoYW5naW5nUHJlTWF0Y2hpbmdGaWx0ZXIgcmVnaXN0ZXJlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlIGNoZWNrUmVzb3VyY2UoZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVsYXRpdmVVcmkpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlUGF0aCkucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uIHJlc29sdmVkIGZyb20gcmVzcG9uc2UgPiAiICsgbG9jYXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QmFzZVVyaSgpICsgZXhwZWN0ZWRSZWxhdGl2ZVVyaSwgbG9jYXRpb24pOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzcG9uc2VGaWx0ZXIoZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVsYXRpdmVVcmkpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlUGF0aCkucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygiTWVzc2FnZSBmcm9tIHJlc3BvbnNlIGZpbHRlcjogIiArIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwKKyAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRTdGF0dXMoKSwgUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUi5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QmFzZVVyaSgpICsgZXhwZWN0ZWRSZWxhdGl2ZVVyaSwgcmVzcG9uc2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJXaXRoQWJzb2x1dGl6YXRpb25EaXNhYmxlZFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlcldpdGhBYnNvbHV0aXphdGlvbkRpc2FibGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDgwOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJXaXRoQWJzb2x1dGl6YXRpb25EaXNhYmxlZFRlc3QuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBUZXN0IGlmIHRoZSBsb2NhdGlvbiByZXNwb25zZSBoZWFkZXIgaXMgbGVmdCBpbnRhY3QgaW4gY2FzZSB0aGUKKyAqIHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI0xPQ0FUSU9OX0hFQURFUl9SRUxBVElWRV9VUklfUkVTT0xVVElPTl9ESVNBQkxFRH0gcHJvcGVydHkgaXMgc2V0IHRvIHtAY29kZSB0cnVlfS4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkhlYWRlcldpdGhBYnNvbHV0aXphdGlvbkRpc2FibGVkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTG9jYXRpb25IZWFkZXJXaXRoQWJzb2x1dGl6YXRpb25EaXNhYmxlZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc3BvbnNlVGVzdC5jbGFzcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVELCBCb29sZWFuLlRSVUUpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBKQVgtUlMgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBAUGF0aCh2YWx1ZSA9ICJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlVGVzdCB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIGJhc2ljIHVyaSB0ZXN0CisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHVyaQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb24iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0KCkgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGUoImxvY2F0aW9uIik7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiVVJJIENyZWF0ZWQgaW4gdGhlIHJlc291cmNlIG1ldGhvZCA+ICIgKyB1cmkpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIHRlc3Qgd2l0aCBudWxsIGxvY2F0aW9uCisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIG51bGwgbG9jYXRpb24gdXJpCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbk51bGwiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0TnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKG51bGwpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCB3aXRoIGxvY2F0aW9uIHN0YXJ0aW5nIHdpdGggc2luZ2xlIHNsYXNoCisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHVyaSBzdGFydGluZyB3aXRoIHNsYXNoCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvblNsYXNoIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGxvY2F0aW9uVGVzdFNsYXNoKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgiL2xvY2F0aW9uIikpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdpdGggcmVsYXRpdmUgbG9jYXRpb247CisgICAgICogRW5zdXJlcywgdGhhdCB0aGUgbG9jYXRpb24gcmVtYWlucyBpbnRhY3QKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2xvY2F0aW9uIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uIHJlc29sdmVkIGZyb20gcmVzcG9uc2UgPiAiICsgbG9jYXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoImxvY2F0aW9uIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCByZWxhdGl2ZSBsb2NhdGlvbiB3aXRoIGxlYWRpbmcgc2xhc2gKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbldpdGhTbGFzaCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2xvY2F0aW9uU2xhc2giKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscygiL2xvY2F0aW9uIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCByZWxhdGl2ZSBsb2NhdGlvbiB3aXRoIGxlYWRpbmcgc2xhc2gKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTG9jYXRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9sb2NhdGlvbk51bGwiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydE51bGwobG9jYXRpb24pOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlcldpdGhJbmNvbXBhdGlibGVGbGFnVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyV2l0aEluY29tcGF0aWJsZUZsYWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliNmU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlcldpdGhJbmNvbXBhdGlibGVGbGFnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIFRlc3QgaWYgdGhlIGxvY2F0aW9uIHJlc3BvbnNlIGhlYWRlciBpcyByZXNvbHZlZCBhY2NvcmRpbmcgdG8gUkZDNzIzMSAoaW4gYSBKQVgtUlMgMi4wIGluY29tcGF0aWJsZSB3YXkpIHdoZW4KKyAqIHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI0xPQ0FUSU9OX0hFQURFUl9SRUxBVElWRV9VUklfUkVTT0xVVElPTl9SRkM3MjMxfSBwcm9wZXJ0eSBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9IGFuZAorICoge0BsaW5rIFNlcnZlclByb3BlcnRpZXMjTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVEfSB0byB7QGNvZGUgZmFsc2V9CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTG9jYXRpb25IZWFkZXJXaXRoSW5jb21wYXRpYmxlRmxhZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKExvY2F0aW9uSGVhZGVyV2l0aEluY29tcGF0aWJsZUZsYWdUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNwb25zZVRlc3QuY2xhc3MpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkxPQ0FUSU9OX0hFQURFUl9SRUxBVElWRV9VUklfUkVTT0xVVElPTl9SRkM3MjMxLCBCb29sZWFuLlRSVUUpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBKQVgtUlMgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBAUGF0aCh2YWx1ZSA9ICJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlVGVzdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSBiYXNpYyB1cmkgdGVzdAorICAgICAgICAgKiBAcmV0dXJuIHRlc3QgcmVzcG9uc2Ugd2l0aCByZWxhdGl2ZSBsb2NhdGlvbiB1cmkKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGxvY2F0aW9uVGVzdCgpIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKCJsb2NhdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIHRlc3Qgd2l0aCBudWxsIGxvY2F0aW9uCisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIG51bGwgbG9jYXRpb24gdXJpCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbk51bGwiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0TnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKG51bGwpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCB3aXRoIGxvY2F0aW9uIHN0YXJ0aW5nIHdpdGggc2luZ2xlIHNsYXNoCisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHVyaSBzdGFydGluZyB3aXRoIHNsYXNoCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvblNsYXNoIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGxvY2F0aW9uVGVzdFNsYXNoKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgiL2xvY2F0aW9uIikpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdpdGggcmVsYXRpdmUgbG9jYXRpb247CisgICAgICogRW5zdXJlcywgdGhhdCB0aGUgbG9jYXRpb24gcmVtYWlucyBpbnRhY3QKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2xvY2F0aW9uIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uIHJlc29sdmVkIGZyb20gcmVzcG9uc2UgPiAiICsgbG9jYXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyAidGVzdC9sb2NhdGlvbiIsIGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdpdGggcmVsYXRpdmUgbG9jYXRpb24gd2l0aCBsZWFkaW5nIHNsYXNoCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb25XaXRoU2xhc2goKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9sb2NhdGlvblNsYXNoIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uIHJlc29sdmVkIGZyb20gcmVzcG9uc2UgPiAiICsgbG9jYXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QmFzZVVyaSgpICsgImxvY2F0aW9uIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCByZWxhdGl2ZSBsb2NhdGlvbiB3aXRoIGxlYWRpbmcgc2xhc2gKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsTG9jYXRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9sb2NhdGlvbk51bGwiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydE51bGwobG9jYXRpb24pOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9NZWRpYVR5cGVQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9NZWRpYVR5cGVQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTE0N2IyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL01lZGlhVHlwZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIE1lZGlhIHR5cGUgcHJvdmlkZXIgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWVkaWFUeXBlUHJvdmlkZXJUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIGhlYWRlciA9IG5ldyBNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgInhtbCIpOworICAgICAgICBmaW5hbCBNZWRpYVR5cGVQcm92aWRlciBpbnN0YW5jZSA9IG5ldyBNZWRpYVR5cGVQcm92aWRlcigpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBSZXN1bHQgPSAiYXBwbGljYXRpb24veG1sIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGluc3RhbmNlLnRvU3RyaW5nKGhlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdXaXRoUGFyYW1zKCkgeworICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHBhcmFtcy5wdXQoImNoYXJzZXQiLCAidXRmOCIpOworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgaGVhZGVyID0gbmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAieG1sIiwgcGFyYW1zKTsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlUHJvdmlkZXIgaW5zdGFuY2UgPSBuZXcgTWVkaWFUeXBlUHJvdmlkZXIoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwUmVzdWx0ID0gImFwcGxpY2F0aW9uL3htbDtjaGFyc2V0PXV0ZjgiOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gaW5zdGFuY2UudG9TdHJpbmcoaGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZVByb3ZpZGVyIGluc3RhbmNlID0gbmV3IE1lZGlhVHlwZVByb3ZpZGVyKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWwiOworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgcmVzdWx0ID0gaW5zdGFuY2UuZnJvbVN0cmluZyhoZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFR5cGUoKSwgImFwcGxpY2F0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0U3VidHlwZSgpLCAieG1sIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW1ldGVycygpLnNpemUoKSwgMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbVN0cmluZ1dpdGhQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWw7Y2hhcnNldD11dGY4IjsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlUHJvdmlkZXIgaW5zdGFuY2UgPSBuZXcgTWVkaWFUeXBlUHJvdmlkZXIoKTsKKworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgcmVzdWx0ID0gaW5zdGFuY2UuZnJvbVN0cmluZyhoZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFR5cGUoKSwgImFwcGxpY2F0aW9uIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0U3VidHlwZSgpLCAieG1sIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UGFyYW1ldGVycygpLnNpemUoKSwgMSk7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0LmdldFBhcmFtZXRlcnMoKS5jb250YWluc0tleSgiY2hhcnNldCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJjaGFyc2V0IiksICJ1dGY4Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFF1b3RlZFBhcmFtKCkgeworICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgcGFyYW1zLnB1dCgiZm9vIiwgIlwiYmFyXCIiKTsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIGhlYWRlciA9IG5ldyBNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgInhtbCIsIHBhcmFtcyk7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZVByb3ZpZGVyIGluc3RhbmNlID0gbmV3IE1lZGlhVHlwZVByb3ZpZGVyKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGluc3RhbmNlLnRvU3RyaW5nKGhlYWRlcik7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBSZXN1bHQgPSAiYXBwbGljYXRpb24veG1sO2Zvbz1cIlxcXCJiYXJcXFwiXCIiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCByZXN1bHQpOworCisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtID0gaW5zdGFuY2UuZnJvbVN0cmluZyhyZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlwiYmFyXCIiLCBtLmdldFBhcmFtZXRlcnMoKS5nZXQoImZvbyIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTWVzc2FnZUJvZHlSZWFkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTWVzc2FnZUJvZHlSZWFkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiZDdmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9NZXNzYWdlQm9keVJlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5SZWFkZXJXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5IdHRwUG9zdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJ5dGVBcnJheUVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuSHR0cENsaWVudEJ1aWxkZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgSmFuIFN1cG9sIChqYW4uc3Vwb2wgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlSZWFkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgSHR0cEhlYWRlcnMgaGVhZGVyczsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgicGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBsYWluKGZpbmFsIEVudGl0eUZvclJlYWRlciBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHkuZ2V0VmFsdWUoKSArICI7IiArIGhlYWRlcnMuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwcE9jdGV0UmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8RW50aXR5Rm9yUmVhZGVyPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUuZXF1YWxzKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudGl0eUZvclJlYWRlciByZWFkRnJvbShmaW5hbCBDbGFzczxFbnRpdHlGb3JSZWFkZXI+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIFVuZGVybHlpbmcgc3RyZWFtIHNob3VsZCBub3QgYmUgY2xvc2VkIGFuZCBKZXJzZXkgaXMgcHJldmVudGluZyBmcm9tIGNsb3NpbmcgaXQuCisgICAgICAgICAgICBlbnRpdHlTdHJlYW0uY2xvc2UoKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlGb3JSZWFkZXIoUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5Rm9yUmVhZGVyIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgRW50aXR5Rm9yUmVhZGVyKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihBcHBPY3RldFJlYWRlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aGV0aGVyIHRoZSBkZWZhdWx0IHtAbGluayBNZWRpYVR5cGV9ICh7QHZhbHVlIE1lZGlhVHlwZSNBUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU19KSBpcyBwYXNzZWQgdG8gYSByZWFkZXIgaWYgbm8KKyAgICAgKiB7QHZhbHVlIEh0dHBIZWFkZXJzI0NPTlRFTlRfVFlQRX0gdmFsdWUgaXMgcHJvdmlkZWQgaW4gYSByZXF1ZXN0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb250ZW50VHlwZUZvclJlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBIdHRwUG9zdCBodHRwUG9zdCA9IG5ldyBIdHRwUG9zdChVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZS9wbGFpbiIpLmJ1aWxkKCkpOworICAgICAgICBodHRwUG9zdC5zZXRFbnRpdHkobmV3IEJ5dGVBcnJheUVudGl0eSgidmFsdWUiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgaHR0cFBvc3QucmVtb3ZlSGVhZGVycygiQ29udGVudC1UeXBlIik7CisKKyAgICAgICAgZmluYWwgSHR0cENsaWVudCBodHRwQ2xpZW50ID0gSHR0cENsaWVudEJ1aWxkZXIuY3JlYXRlKCkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gaHR0cENsaWVudC5leGVjdXRlKGh0dHBQb3N0KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTtudWxsIiwgUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcocmVzcG9uc2UuZ2V0RW50aXR5KCkuZ2V0Q29udGVudCgpLCBudWxsKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL01lc3NhZ2VCb2R5V3JpdGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL01lc3NhZ2VCb2R5V3JpdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjA1MWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTWVzc2FnZUJvZHlXcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lZGlhVHlwZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVmFyaW91cyBNZXNzYWdlQm9keVdyaXRlciB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVdyaXRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTkFNRSA9ICJNZXNzYWdlQm9keVdyaXRlclRlc3RIZWFkZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVkFMVUVfQ0xJRU5UID0gIkNsaWVudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9WQUxVRV9TRVJWRVIgPSAiU2VydmVyIjsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgT3ZlcnJpZGluZ1N0cmluZ1Byb3ZpZGVyLmNsYXNzLCBIdG1sU3RyaW5nUHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihPdmVycmlkaW5nU3RyaW5nUHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPdmVycmlkaW5nU3RyaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gY29uZmlnOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZSgKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0LAorICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHQsCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIFVuZGVybHlpbmcgc3RyZWFtIHNob3VsZCBub3QgYmUgY2xvc2VkIGFuZCBKZXJzZXkgaXMgcHJldmVudGluZyBmcm9tIGNsb3NpbmcgaXQuCisgICAgICAgICAgICBlbnRpdHlTdHJlYW0uY2xvc2UoKTsKKworICAgICAgICAgICAgaHR0cEhlYWRlcnMucHV0U2luZ2xlKEhFQURFUl9OQU1FLAorICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0UnVudGltZVR5cGUoKSA9PSBSdW50aW1lVHlwZS5TRVJWRVIgPyBIRUFERVJfVkFMVUVfU0VSVkVSIDogSEVBREVSX1ZBTFVFX0NMSUVOVCk7CisKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSh0LmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHRtbFN0cmluZ1Byb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIGNvbmZpZzsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisKKyAgICAgICAgICAgIGlmIChNZWRpYVR5cGVzLnR5cGVFcXVhbChNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIG1lZGlhVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hhcnNldCA9IG1lZGlhVHlwZS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJjaGFyc2V0Iik7CisgICAgICAgICAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCB8fCAhInV0Zi04Ii5lcXVhbHNJZ25vcmVDYXNlKGNoYXJzZXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvckV4Y2VwdGlvbigiQ2hhcnNldCBub3QgcmVjZWl2ZWQgaW4gaXNXcml0YWJsZSgpIiwgNTAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0LAorICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSwKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hhcnNldCA9IG1lZGlhVHlwZS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJjaGFyc2V0Iik7CisgICAgICAgICAgICBpZiAoY2hhcnNldCA9PSBudWxsIHx8ICEidXRmLTgiLmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmVyRXJyb3JFeGNlcHRpb24oIkNoYXJzZXQgbm90IHJlY2VpdmVkIGluIHdyaXRlVG8oKSIsIDUwMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBodG1sID0gIjxodG1sPjxib2R5PiIgKyBlbnRpdHkgKyAiPC9ib2R5PjwvaHRtbD4iOworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGh0bWwuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlLgorICAgICAqLworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoQEhlYWRlclBhcmFtKEhFQURFUl9OQU1FKSBmaW5hbCBTdHJpbmcgaGVhZGVyLCBmaW5hbCBTdHJpbmcgcG9zdCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEhFQURFUl9WQUxVRV9DTElFTlQsIGhlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gcG9zdDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIpCisgICAgICAgIEBQYXRoKCJodG1sLWNoYXJzZXQtaW4tcHJvZHVjZXMiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEh0bWxGb3JDaGFyc2V0SW5Qcm9kdWNlcygpIHsKKyAgICAgICAgICAgIHJldHVybiAiZm9vIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImh0bWwtY2hhcnNldC1leHBsaWNpdC1pbi1yZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRIdG1sRm9yRXhwbGljaXRDaGFyc2V0SW5SZXNwb25zZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiZm9vIiwgTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLndpdGhDaGFyc2V0KCJ1dGYtOCIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgICAgIEBQYXRoKCJodG1sLWNoYXJzZXQtaW4tYWNjZXB0cyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbEZvckNoYXJzZXRJbkFjY2VwdHMoKSB7CisgICAgICAgICAgICByZXR1cm4gImZvbyI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBpdCdzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIGRlZmF1bHQgTWVzc2FnZUJvZHlXcml0ZXIgaW5zdGFuY2VzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5wb3N0KEVudGl0eS50ZXh0KCJjb250ZW50IikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhIRUFERVJfVkFMVUVfU0VSVkVSLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSEVBREVSX05BTUUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgbWVkaWEgdHlwZSBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiBAUHJvZHVjZXMgb3IgZXhwbGljaXRseSBpbiBhIHNlcnZlciByZXNwb25zZSBhcmUgcmVjZWl2ZWQKKyAgICAgKiBpbiB0aGUgc2VsZWN0ZWQgbWVzc2FnZSBib2R5IHdyaXRlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGVQYXJhbWV0ZXJzSW5NZXNzYWdlQm9keVdyaXRlcigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJodG1sLWNoYXJzZXQtaW4tcHJvZHVjZXMiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiTWVkaWFUeXBlIGNoYXJzZXQgcGFyYW1ldGVyIGluIEBQcm9kdWNlcyBmYWlsZWQgdG8gcHJvcGFnYXRlIGludG8gTWVzc2FnZUJvZHlXcml0ZXIiLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlIGNvbnRlbnQgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIuIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIjxodG1sPjxib2R5PmZvbzwvYm9keT48L2h0bWw+IikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiaHRtbC1jaGFyc2V0LWV4cGxpY2l0LWluLXJlc3BvbnNlIikucmVxdWVzdCgidGV4dC9odG1sIikuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoIk1lZGlhVHlwZSBjaGFyc2V0IHBhcmFtZXRlciBleHBsaWNpdGx5IHNldCBpbiBSZXNwb25zZSBmYWlsZWQgdG8gcHJvcGFnYXRlIGludG8gTWVzc2FnZUJvZHlXcml0ZXIiLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlIGNvbnRlbnQgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIuIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIjxodG1sPjxib2R5PmZvbzwvYm9keT48L2h0bWw+IikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiaHRtbC1jaGFyc2V0LWluLWFjY2VwdHMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRS53aXRoQ2hhcnNldCgidXRmLTgiKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoIk1lZGlhVHlwZSBjaGFyc2V0IHBhcmFtZXRlciBzZW50IHdpdGggcmVxdWVzdCBpbiBBY2NlcHQgaGVhZGVyIGZhaWxlZCB0byBwcm9wYWdhdGUgaW50byBNZXNzYWdlQm9keVdyaXRlciIsCisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgY29udGVudCByZXR1cm5lZCBmcm9tIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiPGh0bWw+PGJvZHk+Zm9vPC9ib2R5PjwvaHRtbD4iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL09wdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvT3B0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2MxYTAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL09wdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBPcHRpb25zVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIdHRwT3B0aW9uc1Rlc3QuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvT3B0aW9uc1Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHR0cE9wdGlvbnNUZXN0IHsKKworICAgICAgICBzdGF0aWMgU3RyaW5nIGh0bWxfY29udGVudCA9CisgICAgICAgICAgICAgICAgIjxodG1sPjxoZWFkPjx0aXRsZT5nZXQgdGV4dC9odG1sPC90aXRsZT48L2hlYWQ+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGJvZHk+Z2V0IHRleHQvaHRtbDwvYm9keT48L2h0bWw+IjsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRQbGFpbigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiQ1RTLWdldCB0ZXh0L3BsYWluIikuaGVhZGVyKCJURVNULUhFQUQiLCAidGV4dC1wbGFpbiIpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRIdG1sKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGh0bWxfY29udGVudCkuaGVhZGVyKCJURVNULUhFQUQiLCAidGV4dC1odG1sIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvc3ViIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldFN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiVEVTVC1nZXQgdGV4dC9wbGFpbiIpLmhlYWRlcigiVEVTVC1IRUFEIiwKKyAgICAgICAgICAgICAgICAgICAgInN1Yi10ZXh0LXBsYWluIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvc3ViIikKKyAgICAgICAgQFByb2R1Y2VzKHZhbHVlID0gInRleHQvaHRtbCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBoZWFkU3ViKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGh0bWxfY29udGVudCkuaGVhZGVyKCJURVNULUhFQUQiLCAic3ViLXRleHQtaHRtbCIpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGllbnQgaW52b2tlcyBPUFRJT05TIG9uIGEgc3ViIHJlc291cmNlIGF0IC9PcHRpb25zVGVzdC9zdWI7CisgICAgICogd2hpY2ggbm8gcmVxdWVzdCBtZXRob2QgZGVzaWduYXRlZCBmb3IgT1BUSU9OUy4KKyAgICAgKiBWZXJpZnkgdGhhdCBhbiBhdXRvbWF0aWMgcmVzcG9uc2UgaXMgZ2VuZXJhdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgT3B0aW9uU3ViVGVzdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvT3B0aW9uc1Rlc3Qvc3ViIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpLm9wdGlvbnMoKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldEFsbG93ZWRNZXRob2RzKCkuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRBbGxvd2VkTWV0aG9kcygpLmNvbnRhaW5zKCJIRUFEIikpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldEFsbG93ZWRNZXRob2RzKCkuY29udGFpbnMoIk9QVElPTlMiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLCBNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9RdWFsaXR5U291cmNlTWVkaWFUeXBlUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUXVhbGl0eVNvdXJjZU1lZGlhVHlwZVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNzE5MDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUXVhbGl0eVNvdXJjZU1lZGlhVHlwZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5RdWFsaXR5U291cmNlTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciB1bmtub3duCisgKi8KK3B1YmxpYyBjbGFzcyBRdWFsaXR5U291cmNlTWVkaWFUeXBlUHJvdmlkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZU1lZGlhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gImFwcGxpY2F0aW9uL3htbCI7CisgICAgICAgIGZpbmFsIExpc3Q8UXVhbGl0eVNvdXJjZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoaGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZU1lZGlhVHlwZVdpdGhQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sO2NoYXJzZXQ9dXRmOCI7CisgICAgICAgIGZpbmFsIExpc3Q8UXVhbGl0eVNvdXJjZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbC5zaXplKCkpOworCisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtLmdldFBhcmFtZXRlcnMoKS5jb250YWluc0tleSgiY2hhcnNldCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1dGY4IiwgbS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJjaGFyc2V0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgdGV4dC9odG1sIjsKKyAgICAgICAgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZU1lZGlhVHlwZVdpdGhRdWFsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sO3FzPTAuMSwgdGV4dC94bWw7cXM9MC4yLCB0ZXh0L2h0bWw7cXM9MC4zIjsKKyAgICAgICAgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZU1lZGlhVHlwZVdpdGhRdWFsaXR5MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gImFwcGxpY2F0aW9uL3htbDtxcz0wLjEsIHRleHQveG1sO3FzPTAuMiwgdGV4dC9odG1sO3FzPTAuOTMiOworICAgICAgICBmaW5hbCBMaXN0PFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBVUkxDb25uZWN0aW9uQWNjZXB0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAidGV4dC9odG1sLCBpbWFnZS9naWYsIGltYWdlL2pwZWcsICovKjsgcXM9LjIiOworICAgICAgICBmaW5hbCBMaXN0PFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbWFnZSIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnaWYiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygianBlZyIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpcmVmb3hBY2NlcHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJ0ZXh0L3htbCxhcHBsaWNhdGlvbi94bWwsYXBwbGljYXRpb24veGh0bWwreG1sLHRleHQvaHRtbDtxcz0wLjksdGV4dC9wbGFpbjtxcz0wLjgsaW1hZ2UvcG5nLCovKjsiCisgICAgICAgICAgICAgICAgKyAicXM9MC41IjsKKyAgICAgICAgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyg3LCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieGh0bWwreG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltYWdlIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBuZyIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg2KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVNwZWNpZml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gIiovKiwgdGV4dC8qLCB0ZXh0L3BsYWluIjsKKyAgICAgICAgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVNwZWNpZml0eVdpdGhRdWFsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAiKi8qLCAqLyo7cXM9MC41LCB0ZXh0LyosIHRleHQvKjtxcz0wLjUsIHRleHQvcGxhaW4sIHRleHQvcGxhaW47cXM9MC41IjsKKyAgICAgICAgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyg2LCBsLnNpemUoKSk7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGVTcGVjaWZpdHlIVFRQRXhhbXBsZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJ0ZXh0LyosIHRleHQvaHRtbCwgdGV4dC9odG1sO2xldmVsPTEsICovKiI7CisgICAgICAgIGZpbmFsIExpc3Q8UXVhbGl0eVNvdXJjZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlU3BlY2lmaXR5SFRUUEV4YW1wbGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAidGV4dC8qLCB0ZXh0L2h0bWw7bGV2ZWw9MSwgdGV4dC9odG1sLCAqLyoiOworICAgICAgICBmaW5hbCBMaXN0PFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgTWVkaWFUeXBlIG07CisgICAgICAgIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNvdXJjZUNvbnRleHRUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzb3VyY2VDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmFjZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzb3VyY2VDb250ZXh0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsySW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCB7QGxpbmsgUmVzb3VyY2VDb250ZXh0fTogcmVzb3VyY2UgY29udGV4dCBtdXN0IHByb3ZpZGUgYWNjZXNzIHRvCisgKiBzdWItcmVzb3VyY2VzIHRoYXQgY2FuIGJlIHByb3ZpZGVkIGJ5IGEgY3VzdG9tIGNvbXBvbmVudCBwcm92aWRlci4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VDb250ZXh0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSb290UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Um9vdFJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0OworCisgICAgICAgIEBQYXRoKCJzaW5nbGV0b24iKQorICAgICAgICBwdWJsaWMgU2luZ2xldG9uUmVzb3VyY2UgZ2V0U2luZ2xldG9uUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0LmdldFJlc291cmNlKFNpbmdsZXRvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJwZXJyZXF1ZXN0IikKKyAgICAgICAgcHVibGljIFBlclJlcXVlc3RSZXNvdXJjZSBnZXRQZXJSZXF1ZXN0U3ViUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0LmdldFJlc291cmNlKFBlclJlcXVlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiaW5qZWN0L3twYXRofSIpCisgICAgICAgIHB1YmxpYyBJbmplY3RSZXNvdXJjZSBnZXRJbmplY3RSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIEluamVjdFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VDb250ZXh0LmdldFJlc291cmNlKEluamVjdFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldFBhdGgoInNvbWV0aGluZyIpOworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dC5pbml0UmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImluamVjdEZyb21OZXdSZXNvdXJjZS97cGF0aH0iKQorICAgICAgICBwdWJsaWMgSW5qZWN0UmVzb3VyY2UgZ2V0SW5qZWN0UmVzb3VyY2VGcm9tTmV3KCkgeworICAgICAgICAgICAgZmluYWwgSW5qZWN0UmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgSW5qZWN0UmVzb3VyY2UoKTsKKyAgICAgICAgICAgIHJlc291cmNlLnNldFBhdGgoInNvbWV0aGluZyIpOworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dC5pbml0UmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdFJlc291cmNlIHsKKyAgICAgICAgQFBhdGhQYXJhbSgicGF0aCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25SZXNvdXJjZSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyUmVxdWVzdFJlc291cmNlIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzb3VyY2VGcm9tUmVzb3VyY2VDb250ZXh0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB0YXJnZXQoIi9zaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCB0YXJnZXQoIi9zaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHRhcmdldCgiL3BlcnJlcXVlc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB0YXJnZXQoIi9wZXJyZXF1ZXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVSZXNvdXJjZUZyb21SZXNvdXJjZUNvbnRleHQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiYWFhIiwgdGFyZ2V0KCIvaW5qZWN0L2FhYSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmJiIiwgdGFyZ2V0KCIvaW5qZWN0L2JiYiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZVJlc291cmNlRnJvbU5ld1Jlc291cmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImFhYSIsIHRhcmdldCgiL2luamVjdEZyb21OZXdSZXNvdXJjZS9hYWEiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJiYiIsIHRhcmdldCgiL2luamVjdEZyb21OZXdSZXNvdXJjZS9iYmIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Jlc3BvbnNlRTJFVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Jlc3BvbnNlRTJFVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMDY1NTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzcG9uc2VFMkVUZXN0LmphdmEKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlVyaTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBSZXNwb25zZSBFMkUgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJlc3BvbnNlRTJFVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgLyoqCisgICAgICogQ3VzdG9tIE9LIHJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT2tSZXNwb25zZSBleHRlbmRzIFJlc3BvbnNlIHsKKworICAgICAgICBwcml2YXRlIFJlc3BvbnNlIHI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEN1c3RvbSBPSyByZXNwb25zZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVudGl0eSBlbnRpdHkgY29udGVudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPa1Jlc3BvbnNlKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHIgPSBSZXNwb25zZS5vayhlbnRpdHkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRTdGF0dXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhdHVzVHlwZSBnZXRTdGF0dXNJbmZvKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0U3RhdHVzSW5mbygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0RW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIHJlYWRFbnRpdHkoQ2xhc3M8VD4gZW50aXR5VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHIucmVhZEVudGl0eShlbnRpdHlUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShHZW5lcmljVHlwZTxUPiBlbnRpdHlUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gci5yZWFkRW50aXR5KGVudGl0eVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KENsYXNzPFQ+IGVudGl0eVR5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuIHIucmVhZEVudGl0eShlbnRpdHlUeXBlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIHJlYWRFbnRpdHkoR2VuZXJpY1R5cGU8VD4gZW50aXR5VHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gci5yZWFkRW50aXR5KGVudGl0eVR5cGUsIGFubm90YXRpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gci5oYXNFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBidWZmZXJFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gci5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIHIuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVkaWFUeXBlIGdldE1lZGlhVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldE1lZGlhVHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRMYW5ndWFnZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0TGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEFsbG93ZWRNZXRob2RzKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0QWxsb3dlZE1ldGhvZHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgTmV3Q29va2llPiBnZXRDb29raWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0Q29va2llcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFbnRpdHlUYWcgZ2V0RW50aXR5VGFnKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0RW50aXR5VGFnKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERhdGUgZ2V0RGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldERhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGF0ZSBnZXRMYXN0TW9kaWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIGdldExvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PExpbms+IGdldExpbmtzKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0TGlua3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNMaW5rKFN0cmluZyByZWxhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHIuaGFzTGluayhyZWxhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpbmsgZ2V0TGluayhTdHJpbmcgcmVsYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldExpbmsocmVsYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaW5rLkJ1aWxkZXIgZ2V0TGlua0J1aWxkZXIoU3RyaW5nIHJlbGF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRMaW5rQnVpbGRlcihyZWxhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBnZXRNZXRhZGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldE1ldGFkYXRhKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBnZXRIZWFkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0SGVhZGVycygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U3RyaW5nSGVhZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldFN0cmluZ0hlYWRlcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlclN0cmluZyhTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0SGVhZGVyU3RyaW5nKG5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjdXN0b20iKQorICAgICAgICBwdWJsaWMgT2tSZXNwb25zZSBzdWJyZXNwb25zZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2tSZXNwb25zZSgic3VicmVzcG9uc2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm51bGwiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbnVsbFJlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJuby1zdGF0dXMtd2l0aC1lbnRpdHkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZW50aXR5UmVzcG9uc2VUZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJlc3BvbnNlQnVpbGRlcigpLmVudGl0eSgiMTIzNDU2Nzg5MCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJuby1zdGF0dXMtd2l0aG91dC1lbnRpdHkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugbm9FbnRpdHlSZXNwb25zZVRlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCkuY3JlYXRlUmVzcG9uc2VCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBVcmkoInJlc3BvbnNlL2ludGVybmFsIikKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldDsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJleHRlcm5hbCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBleHRlcm5hbCgpIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworICAgICAgICAgICAgaWYgKHRhcmdldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eSgiaW5qZWN0ZWQgV2ViVGFyZ2V0IGlzIG51bGwiKS5idWlsZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuYnVpbGRHZXQoKS5pbnZva2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImludGVybmFsIikKKyAgICAgICAgcHVibGljIFN0cmluZyBpbnRlcm5hbCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiaW50ZXJuYWwiOworICAgICAgICB9CisKKyAgICAgICAgQFBVVAorICAgICAgICBAUGF0aCgibm90LW1vZGlmaWVkLXB1dCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBub3RNb2RpZmllZFB1dChTdHJpbmcgZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vdE1vZGlmaWVkKCkuZW50aXR5KCJub3QtbW9kaWZpZWQtIiArIGRhdGEpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc3BvbnNlVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMTUxNiByZXByb2R1Y2VyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVJlc3BvbnNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzcG9uc2UiKS5wYXRoKCJjdXN0b20iKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVzcG9uc2UgaXMgbnVsbC4iLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMuIiwgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgInN1YnJlc3BvbnNlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMTUyNyByZXByb2R1Y2VyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vU3RhdHVzUmVzcG9uc2UoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJlc3BvbnNlIikucGF0aCgibm8tc3RhdHVzLXtwYXJhbX0tZW50aXR5Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlc29sdmVUZW1wbGF0ZSgicGFyYW0iLCAid2l0aCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVzcG9uc2UgaXMgbnVsbC4iLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMuIiwgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgIjEyMzQ1Njc4OTAiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlc29sdmVUZW1wbGF0ZSgicGFyYW0iLCAid2l0aG91dCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVzcG9uc2UgaXMgbnVsbC4iLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMuIiwgMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJVbmV4cGVjdGVkIG5vbi1lbXB0eSByZXNwb25zZSBlbnRpdHkuIiwgcmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0xNTI4IHJlcHJvZHVjZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFJlc3BvbnNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzcG9uc2UiKS5wYXRoKCJudWxsIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoIlJlc3BvbnNlIGlzIG51bGwuIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2Ugc3RhdHVzLiIsIDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiVW5leHBlY3RlZCBub24tZW1wdHkgcmVzcG9uc2UgZW50aXR5LiIsIHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMTUzMSByZXByb2R1Y2VyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluYm91bmRPdXRib3VuZFJlc3BvbnNlTWl4aW5nKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNwb25zZSIpLnBhdGgoImV4dGVybmFsIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVzcG9uc2UgaXMgbnVsbC4iLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMuIiwgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgImludGVybmFsIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktODQ1IHJlcHJvZHVjZXIuCisgICAgICoKKyAgICAgKiBWZXJpZmllcyBjb25zaXN0ZW50IGJlaGF2aW9yIG92ZXIgdGltZSAoIndvcmtzIGFzIGRlc2lnbmVkIikuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5SW5Ob3RNb2RpZmllZFB1dFJlc3Bvc25lKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNwb25zZSIpLnBhdGgoIm5vdC1tb2RpZmllZC1wdXQiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgicHV0LWRhdGEiKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlJlc3BvbnNlIGlzIG51bGwuIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2Ugc3RhdHVzLiIsIFJlc3BvbnNlLlN0YXR1cy5OT1RfTU9ESUZJRUQuZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIC8vIHJlc3BvbnNlIGVudGl0eSBpcyBkcm9wcGVkIGJ5IHNlcnZlciBjb250YWluZXIgaW4gY29tcGxpYW5jZSB3aXRoIEhUVFAgMS4xIHNwZWMKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5LiIsIHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzcG9uc2VJbnRlZ3JhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNwb25zZUludGVncmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjNhYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzcG9uc2VJbnRlZ3JhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZUludGVncmF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNwb25zZUludGVncmF0aW9uVGVzdC5SZXNwb25zZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkZPTExPV19SRURJUkVDVFMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAUGF0aCh2YWx1ZSA9ICIvUmVzcG9uc2VUZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlVGVzdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXModmFsdWUgPSAidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBzdGF0dXNUZXN0KEBRdWVyeVBhcmFtKCJzdGF0dXMiKSBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXM7CisgICAgICAgICAgICBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmVzcDsKKworICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDIwMDoKKyAgICAgICAgICAgICAgICAgICAgcmVzcCA9IFJlc3BvbnNlLm9rKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjA0OgorICAgICAgICAgICAgICAgIGNhc2UgMjAxOgorICAgICAgICAgICAgICAgIGNhc2UgMjAyOgorICAgICAgICAgICAgICAgIGNhc2UgMzAzOgorICAgICAgICAgICAgICAgIGNhc2UgMzA0OgorICAgICAgICAgICAgICAgIGNhc2UgMzA3OgorICAgICAgICAgICAgICAgIGNhc2UgNDAwOgorICAgICAgICAgICAgICAgIGNhc2UgNDAxOgorICAgICAgICAgICAgICAgIGNhc2UgNDAzOgorICAgICAgICAgICAgICAgIGNhc2UgNDA0OgorICAgICAgICAgICAgICAgIGNhc2UgNDA2OgorICAgICAgICAgICAgICAgIGNhc2UgNDA5OgorICAgICAgICAgICAgICAgIGNhc2UgNDEwOgorICAgICAgICAgICAgICAgIGNhc2UgNDE1OgorICAgICAgICAgICAgICAgIGNhc2UgNTAwOgorICAgICAgICAgICAgICAgIGNhc2UgNTAzOgorICAgICAgICAgICAgICAgIGNhc2UgNDExOgorICAgICAgICAgICAgICAgIGNhc2UgNDEyOgorICAgICAgICAgICAgICAgICAgICByZXNwID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBSZXNwb25zZS5vaygpLmVudGl0eSgiVW5leHBlY3RlZCBwYXJhbWV0ZXIgaW4gcmVxdWVzdDogIiArIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSByZXNwLmhlYWRlcigiVEVTVEhFQURFUiIsICJzdGF0dXMgY29kZSBpbiByZXF1ZXN0ID0gIiArIHN0YXR1cykuYnVpbGQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFN0YXR1cyhpbnQgc3RhdHVzKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0IikucXVlcnlQYXJhbSgic3RhdHVzIiwgc3RhdHVzKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICAgICAgICAgIC5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEdlbmVyaWNTdGF0dXMoaW50IHN0YXR1cykgeworICAgICAgICBmaW5hbCBHZW5lcmljVHlwZTxSZXNwb25zZT4gZ2VuZXJpY1R5cGUgPSBuZXcgR2VuZXJpY1R5cGU8PihSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0IikucXVlcnlQYXJhbSgic3RhdHVzIiwgc3RhdHVzKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICAgICAgICAgIC5nZXQoZ2VuZXJpY1R5cGUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENsaWVudCBzZW5kIHJlcXVlc3QgdG8gYSByZXNvdXJjZSwKKyAgICAgKiB2ZXJpZnkgdGhhdCBjb3JyZWN0IHN0YXR1cyBjb2RlIHJldHVybmVkCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdHVzZXMoKSB7CisgICAgICAgIGZpbmFsIGludFtdIHN0YXR1c2VzID0gbmV3IGludFtdIHsKKyAgICAgICAgICAgICAgICAyMDAsCisgICAgICAgICAgICAgICAgMjAxLAorICAgICAgICAgICAgICAgIDIwMiwKKyAgICAgICAgICAgICAgICAyMDQsCisgICAgICAgICAgICAgICAgMzAzLAorICAgICAgICAgICAgICAgIDMwNCwKKyAgICAgICAgICAgICAgICAzMDcsCisgICAgICAgICAgICAgICAgNDAxLAorICAgICAgICAgICAgICAgIDQwMywKKyAgICAgICAgICAgICAgICA0MDQsCisgICAgICAgICAgICAgICAgNDA2LAorICAgICAgICAgICAgICAgIDQwOSwKKyAgICAgICAgICAgICAgICA0MTAsCisgICAgICAgICAgICAgICAgNDExLAorICAgICAgICAgICAgICAgIDQxMiwKKyAgICAgICAgICAgICAgICA0MTUsCisgICAgICAgICAgICAgICAgNTAwLAorICAgICAgICAgICAgICAgIDUwMworICAgICAgICB9OworCisgICAgICAgIGZvciAoSW50ZWdlciBpIDogc3RhdHVzZXMpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIFRlc3Rpbmcgc3RhdHVzOiAiICsgaSk7CisgICAgICAgICAgICB0ZXN0U3RhdHVzKGkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDbGllbnQgc2VuZCByZXF1ZXN0IHRvIGEgcmVzb3VyY2UsCisgICAgICogdmVyaWZ5IHRoYXQgY29ycmVjdCBzdGF0dXMgY29kZSByZXR1cm5lZAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNTdGF0dXNlcygpIHsKKyAgICAgICAgZmluYWwgaW50W10gc3RhdHVzZXMgPSBuZXcgaW50W10geworICAgICAgICAgICAgICAgIDIwMCwKKyAgICAgICAgICAgICAgICAyMDEsCisgICAgICAgICAgICAgICAgMjAyLAorICAgICAgICAgICAgICAgIDIwNCwKKyAgICAgICAgICAgICAgICAzMDMsCisgICAgICAgICAgICAgICAgMzA0LAorICAgICAgICAgICAgICAgIDMwNywKKyAgICAgICAgICAgICAgICA0MDEsCisgICAgICAgICAgICAgICAgNDAzLAorICAgICAgICAgICAgICAgIDQwNCwKKyAgICAgICAgICAgICAgICA0MDYsCisgICAgICAgICAgICAgICAgNDA5LAorICAgICAgICAgICAgICAgIDQxMCwKKyAgICAgICAgICAgICAgICA0MTEsCisgICAgICAgICAgICAgICAgNDEyLAorICAgICAgICAgICAgICAgIDQxNSwKKyAgICAgICAgICAgICAgICA1MDAsCisgICAgICAgICAgICAgICAgNTAzCisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChJbnRlZ2VyIGkgOiBzdGF0dXNlcykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgVGVzdGluZyBzdGF0dXM6ICIgKyBpKTsKKyAgICAgICAgICAgIHRlc3RHZW5lcmljU3RhdHVzKGkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzcG9uc2VUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzcG9uc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwMThjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNwb25zZVRlc3QuamF2YQpAQCAtMCwwICsxLDUwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5OZXdDb29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlZhcmlhbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IZWFkZXJVdGlsczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VUZXN0IHsKKworICAgIC8qCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlIHVzaW5nIFJlc3BvbnNlLm9rKFN0cmluZywgVmFyaWFudCkuYnVpbGQoKQorICAgICAqIHZlcmlmeSB0aGF0IGNvcnJlY3Qgc3RhdHVzIGNvZGUgaXMgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIE9rVGVzdDUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3A7CisgICAgICAgIGludCBzdGF0dXMgPSAyMDA7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gIlRlc3QgT25seSI7CisgICAgICAgIExpc3Q8U3RyaW5nPiBlbmNvZGluZyA9IEFycmF5cy5hc0xpc3QoImd6aXAiLCAiY29tcHJlc3MiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxhbmcgPSBBcnJheXMuYXNMaXN0KCJlbi1VUyIsICJlbi1HQiIsICJ6aC1DTiIpOworCisgICAgICAgIE1lZGlhVHlwZSBtdCA9IG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKTsKKyAgICAgICAgTGlzdDxWYXJpYW50PiB2dHMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpLm1lZGlhVHlwZXMobXQpCisgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIsICJVUyIpLCBuZXcgTG9jYWxlKCJlbiIsICJHQiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2FsZSgiemgiLCAiQ04iKSkuZW5jb2RpbmdzKChTdHJpbmdbXSkgZW5jb2RpbmcudG9BcnJheSgpKQorICAgICAgICAgICAgICAgIC5hZGQoKS5idWlsZCgpOworCisgICAgICAgIFN0cmluZyB0bXA7CisgICAgICAgIGZvciAoVmFyaWFudCB2dCA6IHZ0cykgeworICAgICAgICAgICAgcmVzcCA9IFJlc3BvbnNlLm9rKGNvbnRlbnQsIHZ0KS5idWlsZCgpOworICAgICAgICAgICAgdG1wID0gdmVyaWZ5UmVzcG9uc2UocmVzcCwgY29udGVudCwgc3RhdHVzLCBlbmNvZGluZywgbGFuZywgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgIiArIHRtcCk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgUmVzcG9uc2UgdXNpbmcKKyAgICAgKiBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIuY2xvbmUoKQorICAgICAqIHZlcmlmeSB0aGF0IGNvcnJlY3Qgc3RhdHVzIGNvZGUgaXMgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNsb25lVGVzdCgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGludCBzdGF0dXMgPSAyMDA7CisgICAgICAgIExpc3Q8U3RyaW5nPiB0eXBlID0gQXJyYXlzLmFzTGlzdCgidGV4dC9wbGFpbiIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGVuY29kaW5nID0gQXJyYXlzLmFzTGlzdCgiZ3ppcCIsICJjb21wcmVzcyIpOworICAgICAgICBMaXN0PFN0cmluZz4gbGFuZyA9IEFycmF5cy5hc0xpc3QoImVuLVVTIiwgImVuLUdCIiwgInpoLUNOIik7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAibmFtZV8xIjsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gInZhbHVlXzEiOworICAgICAgICBDb29raWUgY2sxID0gbmV3IENvb2tpZShuYW1lLCB2YWx1ZSk7CisgICAgICAgIE5ld0Nvb2tpZSBuY2sxID0gbmV3IE5ld0Nvb2tpZShjazEpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiBjb29raWVzID0gQXJyYXlzLmFzTGlzdChuY2sxLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7CisKKyAgICAgICAgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHJlc3BiMSA9IFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiQ29udGVudC10eXBlIiwgInRleHQvcGxhaW4iKS5oZWFkZXIoIkNvbnRlbnQtdHlwZSIsCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIpLmhlYWRlcigiQ29udGVudC1MYW5ndWFnZSIsICJlbi1VUyIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiQ29udGVudC1MYW5ndWFnZSIsICJlbi1HQiIpLmhlYWRlcigiQ29udGVudC1MYW5ndWFnZSIsCisgICAgICAgICAgICAgICAgInpoLUNOIikuaGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLXRyYW5zZm9ybSIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiU2V0LUNvb2tpZSIsICJuYW1lXzE9dmFsdWVfMTt2ZXJzaW9uPTEiKTsKKyAgICAgICAgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHJlc3BiMiA9IHJlc3BiMS5jbG9uZSgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3AyID0gcmVzcGIyLmJ1aWxkKCk7CisKKyAgICAgICAgU3RyaW5nIHRtcCA9IHZlcmlmeVJlc3BvbnNlKHJlc3AyLCBudWxsLCBzdGF0dXMsIGVuY29kaW5nLCBsYW5nLCB0eXBlLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGNvb2tpZXMpOworICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCJmYWxzZSIpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyAiICsgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKHRtcCkuYXBwZW5kKG5ld2xpbmUpOworCisgICAgICAgIFN0cmluZyBjb250ZW50ID0gIlRlc3RPbmx5IjsKKyAgICAgICAgUmVzcG9uc2UgcmVzcDEgPSByZXNwYjEuZW50aXR5KGNvbnRlbnQpLmNvb2tpZSgoTmV3Q29va2llKSBudWxsKS5idWlsZCgpOworICAgICAgICB0bXAgPSB2ZXJpZnlSZXNwb25zZShyZXNwMSwgY29udGVudCwgc3RhdHVzLCBlbmNvZGluZywgbGFuZywgdHlwZSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgiZmFsc2UiKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgIiArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdD4gbXZwID0KKyAgICAgICAgICAgICAgICByZXNwMS5nZXRNZXRhZGF0YSgpOworICAgICAgICBpZiAobXZwLmNvbnRhaW5zS2V5KCJTZXQtQ29va2llIikpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiUmVzcG9uc2UgY29udGFpbnMgdW5leHBlY3RlZCBTZXQtQ29va2llOiAiKS5hcHBlbmQobXZwLmdldEZpcnN0KCJTZXQtQ29va2llIikudG9TdHJpbmcoKSkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgIiArIHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCh0bXApLmFwcGVuZChuZXdsaW5lKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBSZXNwb25zZSB1c2luZworICAgICAqIFJlc3BvbnNlLmZyb21SZXNwb25zZShSZXNwb25zZSkuYnVpbGQoKQorICAgICAqIHZlcmlmeSB0aGF0IGNvcnJlY3Qgc3RhdHVzIGNvZGUgaXMgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZyb21SZXNwb25zZVRlc3QoKSB7CisgICAgICAgIGludCBzdGF0dXMgPSAyMDA7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gIlRlc3QgT25seSI7CisgICAgICAgIExpc3Q8U3RyaW5nPiB0eXBlID0gQXJyYXlzLmFzTGlzdCgidGV4dC9wbGFpbiIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGVuY29kaW5nID0gQXJyYXlzLmFzTGlzdCgiZ3ppcCIsICJjb21wcmVzcyIpOworICAgICAgICBMaXN0PFN0cmluZz4gbGFuZyA9IEFycmF5cy5hc0xpc3QoImVuLVVTIiwgImVuLUdCIiwgInpoLUNOIik7CisKKyAgICAgICAgTWVkaWFUeXBlIG10MSA9IG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKTsKKyAgICAgICAgTWVkaWFUeXBlIG10MiA9IG5ldyBNZWRpYVR5cGUoInRleHQiLCAiaHRtbCIpOworICAgICAgICBMaXN0PFZhcmlhbnQ+IHZ0cyA9IFZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyLm5ld0luc3RhbmNlKCkubWVkaWFUeXBlcyhtdDEsIG10MikKKyAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIiwgIlVTIiksIG5ldyBMb2NhbGUoImVuIiwgIkdCIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxlKCJ6aCIsICJDTiIpKS5lbmNvZGluZ3MoKFN0cmluZ1tdKSBlbmNvZGluZy50b0FycmF5KCkpCisgICAgICAgICAgICAgICAgLmFkZCgpLmJ1aWxkKCk7CisKKyAgICAgICAgU3RyaW5nIHRtcDsKKyAgICAgICAgZm9yIChWYXJpYW50IHZ0IDogdnRzKSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwMSA9IFJlc3BvbnNlLm9rKGNvbnRlbnQsIHZ0KS5idWlsZCgpOworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcCA9IFJlc3BvbnNlLmZyb21SZXNwb25zZShyZXNwMSkuYnVpbGQoKTsKKyAgICAgICAgICAgIHRtcCA9IHZlcmlmeVJlc3BvbnNlKHJlc3AsIGNvbnRlbnQsIHN0YXR1cywgZW5jb2RpbmcsIGxhbmcsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjICIgKyB0bXApOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlIHVzaW5nCisgICAgICogUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyLmhlYWRlcihTdHJpbmcsIE9iamVjdCkuYnVpbGQoKQorICAgICAqIHZlcmlmeSB0aGF0IGNvcnJlY3Qgc3RhdHVzIGNvZGUgaXMgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGhlYWRlclRlc3QoKSB7CisgICAgICAgIGludCBzdGF0dXMgPSAyMDA7CisgICAgICAgIExpc3Q8U3RyaW5nPiB0eXBlID0gQXJyYXlzLmFzTGlzdCgidGV4dC9wbGFpbiIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGVuY29kaW5nID0gQXJyYXlzLmFzTGlzdCgiZ3ppcCIsICJjb21wcmVzcyIpOworICAgICAgICBMaXN0PFN0cmluZz4gbGFuZyA9IEFycmF5cy5hc0xpc3QoImVuLVVTIiwgImVuLUdCIiwgInpoLUNOIik7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAibmFtZV8xIjsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gInZhbHVlXzEiOworICAgICAgICBDb29raWUgY2sxID0gbmV3IENvb2tpZShuYW1lLCB2YWx1ZSk7CisgICAgICAgIE5ld0Nvb2tpZSBuY2sxID0gbmV3IE5ld0Nvb2tpZShjazEpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiBjb29raWVzID0gQXJyYXlzLmFzTGlzdChuY2sxLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcCA9IFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLmhlYWRlcigiQ29udGVudC10eXBlIiwKKyAgICAgICAgICAgICAgICAidGV4dC9wbGFpbiIpLmhlYWRlcigiQ29udGVudC10eXBlIiwgInRleHQvaHRtbCIpLmhlYWRlcigiQ29udGVudC1MYW5ndWFnZSIsICJlbi1VUyIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiQ29udGVudC1MYW5ndWFnZSIsICJlbi1HQiIpLmhlYWRlcigiQ29udGVudC1MYW5ndWFnZSIsCisgICAgICAgICAgICAgICAgInpoLUNOIikuaGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLXRyYW5zZm9ybSIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiU2V0LUNvb2tpZSIsICJuYW1lXzE9dmFsdWVfMTt2ZXJzaW9uPTEiKS5idWlsZCgpOworICAgICAgICBTdHJpbmcgdG1wID0gdmVyaWZ5UmVzcG9uc2UocmVzcCwgbnVsbCwgc3RhdHVzLCBlbmNvZGluZywgbGFuZywgdHlwZSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBjb29raWVzKTsKKyAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgiZmFsc2UiKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgIiArIHRtcCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBSZXNwb25zZSB1c2luZworICAgICAqIFJlc3BvbnNlLnN0YXR1cyhpbnQpLnZhcmlhbnQoVmFyaWFudCkuYnVpbGQoKQorICAgICAqIHZlcmlmeSB0aGF0IGNvcnJlY3Qgc3RhdHVzIGNvZGUgaXMgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHZhcmlhbnRUZXN0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwOworICAgICAgICBpbnQgc3RhdHVzID0gMjAwOworICAgICAgICBMaXN0PFN0cmluZz4gZW5jb2RpbmcgPSBBcnJheXMuYXNMaXN0KCJnemlwIiwgImNvbXByZXNzIik7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsYW5nID0gQXJyYXlzLmFzTGlzdCgiZW4tVVMiLCAiZW4tR0IiLCAiemgtQ04iKTsKKworICAgICAgICBNZWRpYVR5cGUgbXQgPSBuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInBsYWluIik7CisgICAgICAgIExpc3Q8VmFyaWFudD4gdnRzID0gVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIubmV3SW5zdGFuY2UoKS5tZWRpYVR5cGVzKG10KQorICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iLCAiVVMiKSwgbmV3IExvY2FsZSgiZW4iLCAiR0IiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhbGUoInpoIiwgIkNOIikpLmVuY29kaW5ncygoU3RyaW5nW10pIGVuY29kaW5nLnRvQXJyYXkoKSkKKyAgICAgICAgICAgICAgICAuYWRkKCkuYnVpbGQoKTsKKworICAgICAgICBTdHJpbmcgdG1wOworICAgICAgICBmb3IgKFZhcmlhbnQgdnQgOiB2dHMpIHsKKyAgICAgICAgICAgIHJlc3AgPSBSZXNwb25zZS5zdGF0dXMoc3RhdHVzKS52YXJpYW50KHZ0KS5idWlsZCgpOworICAgICAgICAgICAgdG1wID0gdmVyaWZ5UmVzcG9uc2UocmVzcCwgbnVsbCwgc3RhdHVzLCBlbmNvZGluZywgbGFuZywgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgIiArIHRtcCk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGluZGVudCA9ICIgICAgIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbmV3bGluZSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdmVyaWZ5UmVzcG9uc2UoUmVzcG9uc2UgcmVzcCwgU3RyaW5nIGNvbnRlbnQsIGludCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGVuY29kaW5nLCBMaXN0PFN0cmluZz4gbGFuZ3VhZ2UsIExpc3Q8U3RyaW5nPiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YXIsIExpc3Q8U3RyaW5nPiBjY2wsIExpc3Q8U3RyaW5nPiBjb29raWVzKSB7CisgICAgICAgIGJvb2xlYW4gcGFzcyA9IHRydWU7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHNiLmFwcGVuZCgiPT09PT09PT09PSBWZXJpZnlpbmcgYSBSZXNwb25zZTogIikuYXBwZW5kKG5ld2xpbmUpOworCisgICAgICAgIFN0cmluZyB0bXAgPSB2ZXJpZnlSZXNwb25zZShyZXNwLCBjb250ZW50LCBzdGF0dXMsIG51bGwpOworICAgICAgICBzYi5hcHBlbmQoaW5kZW50KS5hcHBlbmQodG1wKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoImZhbHNlIikpIHsKKyAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtdnAgPSBIZWFkZXJVdGlscy5hc1N0cmluZ0hlYWRlcnMoCisgICAgICAgICAgICAgICAgcmVzcC5nZXRNZXRhZGF0YSgpKTsKKworICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBtdnAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyAiUHJvY2Vzc2luZyBLZXkgZm91bmQgaW4gcmVzcG9uc2U6ICIpLmFwcGVuZChrZXkpLmFwcGVuZCgiOiAiKS5hcHBlbmQobXZwLmdldChrZXkpKS5hcHBlbmQoIjsgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuZXdsaW5lKTsKKworICAgICAgICAgICAgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKCJWYXJ5IikpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IHZhcikgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsID0gbXZwLmdldChrZXkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3R1YWwuY29udGFpbnModmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIkV4cGVjdGVkIGhlYWRlciAiKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiIG5vdCBzZXQgaW4gVmFyeS4iKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIkZvdW5kIGV4cGVjdGVkIGhlYWRlciAiKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgiLiIpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtZW5jb2RpbmciKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBlbmMgOiBtdnAuZ2V0KGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5jb2RpbmcuY29udGFpbnMoZW5jLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJFbmNvZGluZyB0ZXN0IGZhaWxlZDogIikuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1sYW5ndWFnZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGxhbmcgOiBtdnAuZ2V0KGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFuZ3VhZ2UuY29udGFpbnMobGFuZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJsYW5ndWFnZSB0ZXN0IGZhaWxlZDogIikuYXBwZW5kKGxhbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgaXMgbm90IGV4cGVjdGVkIGluIFJlc3BvbnNlIikuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR0IDogbGFuZ3VhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJFeHBlY3RpbmcgQ29udGVudC1MYW5ndWFnZSAiKS5hcHBlbmQodHQpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtVHlwZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGxhbmcgOiBtdnAuZ2V0KGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHlwZS5jb250YWlucyhsYW5nLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJDb250ZW50LVR5cGUgdGVzdCBmYWlsZWQ6ICIpLmFwcGVuZChsYW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIGlzIG5vdCBleHBlY3RlZCBpbiBSZXNwb25zZSIpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNjbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHQgOiBjY2wpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJFeHBlY3RpbmcgQ2FjaGUtQ29udHJvbCAiKS5hcHBlbmQodHQpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKCJDYWNoZS1Db250cm9sIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgYWxsX2NjbCA6IG12cC5nZXQoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY2MgOiBjY2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhbGxfY2NsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5jb250YWlucyhjYy50b0xvd2VyQ2FzZSgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIkNhY2hlLUNvbnRyb2wgdGVzdCBmYWlsZWQ6ICIpLmFwcGVuZChjYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgaXMgbm90IGZvdW5kIGluIFJlc3BvbnNlLiIpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb29raWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0dCA6IGNvb2tpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJFeHBlY3RpbmcgU2V0LUNvb2tpZSIpLmFwcGVuZCh0dCkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoIlNldC1Db29raWUiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBuY2tfYWN0dWFsIDogbXZwLmdldChrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIlByb2Nlc3NpbmcgIikuYXBwZW5kKG5ja19hY3R1YWwudG9TdHJpbmcoKSkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb29raWVzLmNvbnRhaW5zKG5ja19hY3R1YWwudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCIgIiwgIiIpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIlNldC1Db29raWUgdGVzdCBmYWlsZWQ6ICIpLmFwcGVuZChuY2tfYWN0dWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIGlzIG5vdCBleHBlY3RlZCBpbiBSZXNwb25zZS4iKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiRXhwZWN0ZWQgU2V0LUNvb2tpZTogIikuYXBwZW5kKG5ja19hY3R1YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgaXMgZm91bmQgaW4gUmVzcG9uc2UuIikuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKGluZGVudCkuYXBwZW5kKHBhc3MpOworCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHZlcmlmeVJlc3BvbnNlKFJlc3BvbnNlIHJlc3AsIFN0cmluZyBjb250ZW50LCBpbnQgc3RhdHVzLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZF9tYXApIHsKKyAgICAgICAgYm9vbGVhbiBwYXNzID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgc2IuYXBwZW5kKCI9PT09PT09PT09IFZlcmlmeWluZyBhIFJlc3BvbnNlIHdpdGggTWFwOiAiKS5hcHBlbmQobmV3bGluZSk7CisKKyAgICAgICAgaWYgKChjb250ZW50ID09IG51bGwpIHx8IChjb250ZW50LmVxdWFscygiIikpKSB7CisgICAgICAgICAgICBpZiAoIShyZXNwLmdldEVudGl0eSgpID09IG51bGwpIHx8ICIiLmVxdWFscyhyZXNwLmdldEVudGl0eSgpKSkgeworICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgIkVudGl0eSB2ZXJpZmljYXRpb24gZmFpbGVkOiBleHBlY3Rpbmcgbm8gY29udGVudCwgZ290ICIpLmFwcGVuZCgoU3RyaW5nKSByZXNwLmdldEVudGl0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghY29udGVudC5lcXVhbHMocmVzcC5nZXRFbnRpdHkoKSkpIHsKKyAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyAiRW50aXR5IHZlcmlmaWNhdGlvbiBmYWlsZWQ6IGV4cGVjdGluZyAiKS5hcHBlbmQoY29udGVudCkuYXBwZW5kKCIsIGdvdCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKChTdHJpbmcpIHJlc3AuZ2V0RW50aXR5KCkpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyAiQ29ycmVjdCBjb250ZW50IGZvdW5kIGluIFJlc3BvbnNlOiAiKS5hcHBlbmQoKFN0cmluZykgcmVzcC5nZXRFbnRpdHkoKSkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3AuZ2V0U3RhdHVzKCkgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgIlN0YXR1cyBjb2RlIHZlcmlmaWNhdGlvbiBmYWlsZWQ6IGV4cGVjdGluZyAiKS5hcHBlbmQoc3RhdHVzKS5hcHBlbmQoIiwgZ290ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocmVzcC5nZXRTdGF0dXMoKSkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArICJDb3JyZWN0IHN0YXR1cyBmb3VuZCBpbiBSZXNwb25zZTogIikuYXBwZW5kKHN0YXR1cykuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICB9CisKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8amF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdD4gbXZwID0KKyAgICAgICAgICAgICAgICByZXNwLmdldE1ldGFkYXRhKCk7CisgICAgICAgIGlmIChleHBlY3RlZF9tYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArICJObyBrZXlzIHRvIHZlcmlmeSBvciBleHBlY3RlZCwgYnV0IGZvdW5kIHRoZSBmb2xsb3dpbmcga2V5cyBpbiBSZXNwb25zZToiKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBtdnAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIktleTogIikuYXBwZW5kKGtleSkuYXBwZW5kKCI7ICIpLmFwcGVuZChtdnAuZ2V0Rmlyc3Qoa2V5KSkuYXBwZW5kKCI7IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXlfYWN0dWFsIDogbXZwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArICJSZXNwb25zZSBjb250YWlucyBrZXk6ICIpLmFwcGVuZChrZXlfYWN0dWFsKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgIlZlcmlmeWluZyB0aGUgZm9sbG93aW5nIGtleXMgaW4gUmVzcG9uc2U6IikuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgU3RyaW5nIGFjdHVhbCwgZXhwZWN0ZWQ7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBleHBlY3RlZF9tYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW12cC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJLZXk6ICIpLmFwcGVuZChrZXkpLmFwcGVuZCgiIGlzIG5vdCBmb3VuZCBpbiBSZXNwb25zZTsiKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZSgibGFzdC1tb2RpZmllZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiS2V5IExhc3QtTW9kaWZpZWQgaXMgZm91bmQgaW4gcmVzcG9uc2UiKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZF9tYXAuZ2V0KGtleSkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsID0gbXZwLmdldEZpcnN0KGtleSkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwuc3RhcnRzV2l0aCgiXCIiKSAmJiBhY3R1YWwuZW5kc1dpdGgoIlwiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9IGFjdHVhbC5zdWJzdHJpbmcoMSwgYWN0dWFsLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbC5lcXVhbHMoZXhwZWN0ZWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIktleTogIikuYXBwZW5kKGtleSkuYXBwZW5kKCIgZm91bmQgaW4gUmVzcG9uc2UsIGJ1dCB3aXRoIGRpZmZlcmVudCB2YWx1ZTsiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJFeHBlY3RpbmcgIikuYXBwZW5kKGV4cGVjdGVkX21hcC5nZXQoa2V5KSkuYXBwZW5kKCI7IGdvdCAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG12cC5nZXRGaXJzdChrZXkpKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJQcm9jZXNzZWQga2V5ICIpLmFwcGVuZChrZXkpLmFwcGVuZCgiIHdpdGggZXhwZWN0ZWQgdmFsdWUgIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGV4cGVjdGVkX21hcC5nZXQoa2V5KSkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoaW5kZW50KS5hcHBlbmQocGFzcyk7CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93U3RyaW5nKCkgeworICAgICAgICBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmVzcG9uc2VCdWlsZGVyID0gUmVzcG9uc2Uub2soKTsKKworICAgICAgICByZXNwb25zZUJ1aWxkZXIgPSByZXNwb25zZUJ1aWxkZXIuYWxsb3coIkdFVCIpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlQnVpbGRlci5idWlsZCgpLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BTExPVykuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgcmVzcG9uc2VCdWlsZGVyID0gcmVzcG9uc2VCdWlsZGVyLmFsbG93KChTdHJpbmcpIG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlQnVpbGRlci5idWlsZCgpLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BTExPVykgPT0gbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dTZXQoKSB7CisgICAgICAgIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByZXNwb25zZUJ1aWxkZXIgPSBSZXNwb25zZS5vaygpOworCisgICAgICAgIHJlc3BvbnNlQnVpbGRlciA9IHJlc3BvbnNlQnVpbGRlci5hbGxvdyhuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoIkdFVCIpKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VCdWlsZGVyLmJ1aWxkKCkuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFMTE9XKS5jb250YWlucygiR0VUIikpOworICAgICAgICByZXNwb25zZUJ1aWxkZXIgPSByZXNwb25zZUJ1aWxkZXIuYWxsb3coKFNldDxTdHJpbmc+KSBudWxsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHJlc3BvbnNlQnVpbGRlci5idWlsZCgpLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BTExPVykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93VmFyaWFudCgpIHsKKyAgICAgICAgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHJlc3BvbnNlQnVpbGRlciA9IFJlc3BvbnNlLm9rKCk7CisKKyAgICAgICAgcmVzcG9uc2VCdWlsZGVyID0gcmVzcG9uc2VCdWlsZGVyLmFsbG93KG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgiR0VUIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZUJ1aWxkZXIuYnVpbGQoKS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUxMT1cpLmNvbnRhaW5zKCJHRVQiKSk7CisgICAgICAgIHJlc3BvbnNlQnVpbGRlciA9IHJlc3BvbnNlQnVpbGRlci5hbGxvdygoU3RyaW5nW10pIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcmVzcG9uc2VCdWlsZGVyLmJ1aWxkKCkuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFMTE9XKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBidWZmZXJFbnRpdHlUZXN0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gcmVhZGluZyBlbnRpdHkgYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldEVudGl0eVRlc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGVudGl0eSBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGFzRW50aXR5VGVzdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5oYXNFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgZW50aXR5IGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE1NTMKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYXJpYW50cygpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGVuY29kaW5nID0gQXJyYXlzLmFzTGlzdCgiZ3ppcCIsICJjb21wcmVzcyIpOworICAgICAgICBMaXN0PFZhcmlhbnQ+IGxpc3QgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlcgorICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgLm1lZGlhVHlwZXMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIiwgIlVTIiksIG5ldyBMb2NhbGUoImVuIiwgIkdCIikpCisgICAgICAgICAgICAgICAgLmVuY29kaW5ncyhlbmNvZGluZy50b0FycmF5KG5ldyBTdHJpbmdbZW5jb2Rpbmcuc2l6ZSgpXSkpLmFkZCgpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcjEgPSBSZXNwb25zZS5vaygpLnZhcmlhbnRzKGxpc3QpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocjEpOworICAgICAgICBhc3NlcnROb3ROdWxsKHIxLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5WQVJZKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcjIgPSBSZXNwb25zZS5vaygpLnZhcmlhbnRzKGxpc3QudG9BcnJheShuZXcgVmFyaWFudFtsaXN0LnNpemUoKV0pKS5idWlsZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKHIyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyMi5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuVkFSWSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXN0cmljdGVkSGVhZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Jlc3RyaWN0ZWRIZWFkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1NjhiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXN0cmljdGVkSGVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3Qgc2V0dGluZyBoZWFkZXJzIHRoYXQgYXJlIHJlc3RyaWN0ZWQgYnkge0BsaW5rIGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9ufS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXN0cmljdGVkSGVhZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVzdHJpY3RlZEhlYWRlclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldE9wdGlvbnMoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHJlcXVlc3RIZWFkZXJzID0gaGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWFkZXJzOiAiICsgcmVxdWVzdEhlYWRlcnMpOworICAgICAgICAgICAgaWYgKHJlcXVlc3RIZWFkZXJzLmNvbnRhaW5zS2V5KCJPcmlnaW4iKSB8fCByZXF1ZXN0SGVhZGVycy5jb250YWluc0tleSgiQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2QiKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJDT1JTIGhlYWRlcnMgZm91bmQuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJDT1JTIGhlYWRlcnMgYXJlIG1pc3NpbmcuICIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KCJDT1JTIGhlYWRlcnMgYXJlIG1pc3NpbmciKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzLCBMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQElnbm9yZSgiVGhlIHNldHRpbmcgb2YgYWxsb3dSZXN0cmljdGVkSGVhZGVycyBzeXN0ZW0gcHJvcGVydHkgaXMgZ2xvYmFsIGFuZCBjYWNoZWQuIE9ubHkgIgorICAgICAgICAgICAgKyAib25lIG9mIGJvdGggdGVzdEZvcmJpZGRlbkhlYWRlcnNOb3RBbGxvd2VkKCkgYW5kIHRlc3RGb3JiaWRkZW5IZWFkZXJzQWxsb3dlZCgpIGNhbiBiZSBydW4gZHVyaW5nIG9uZSB0ZXN0LiIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yYmlkZGVuSGVhZGVyc05vdEFsbG93ZWQoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RIZWFkZXJzKGNsaWVudCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgc2VuZGluZyBvZiByZXN0cmljdGVkIGhlYWRlcnMgKE9yaWdpbiBhbmQgQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2QpIHdoaWNoIGFyZQorICAgICAqIHVzZWQgZm9yIENPUlMuIFRoZXNlIGhlYWRlcnMgYXJlIGJ5IGRlZmF1bHQgc2tpcHBlZCBieSB0aGUge0BsaW5rIGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9ufS4KKyAgICAgKiBUaGUgc3lzdGVtIHByb3BlcnR5IHtAY29kZSBzdW4ubmV0Lmh0dHAuYWxsb3dSZXN0cmljdGVkSGVhZGVyc30gbXVzdCBiZSBkZWZpbmVkIGluIG9yZGVyIHRvCisgICAgICogYWxsb3cgdGhlc2UgaGVhZGVycy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JiaWRkZW5IZWFkZXJzQWxsb3dlZCgpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic3VuLm5ldC5odHRwLmFsbG93UmVzdHJpY3RlZEhlYWRlcnMiLCAidHJ1ZSIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEhlYWRlcnMoY2xpZW50KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI3Rlc3RGb3JiaWRkZW5IZWFkZXJzQWxsb3dlZCgpfSAoKX0gYnV0IHVzZXMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IKKyAgICAgKiAuQXBhY2hlQ29ubmVjdG9yfSBjb25uZWN0b3IKKyAgICAgKiB3aGljaCBhbGxvd3MgbW9kaWZpY2F0aW9uIG9mIHRoZXNlIGhlYWRlcnMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yYmlkZGVuSGVhZGVyc1dpdGhBcGFjaGVDb25uZWN0b3IoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjbGllbnRDb25maWcpOworICAgICAgICB0ZXN0SGVhZGVycyhjbGllbnQpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzcG9uc2UgdGVzdEhlYWRlcnMoQ2xpZW50IGNsaWVudCkgeworICAgICAgICBjbGllbnQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCIvIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiT3JpZ2luIiwgImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiQWNjZXNzLUNvbnRyb2wtUmVxdWVzdC1NZXRob2QiLCAiUE9TVCIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiVGVzdHVzIiwgIkhlbGxvIik7CisgICAgICAgIHJldHVybiBidWlsZGVyLmdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Tb3VyY2VFbnRpdHlQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Tb3VyY2VFbnRpdHlQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2I2MTczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1NvdXJjZUVudGl0eVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXM7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IG9mIHtAbGluayBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSBTb3VyY2V9IE1lc3NhZ2VCb2R5IFByb3ZpZGVyCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIFNvdXJjZUVudGl0eVByb3ZpZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHByZWZpeCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgeGRrUHJlZml4ID0gIjw/eG1sIHZlcnNpb24gPSAnMS4wJyBlbmNvZGluZyA9ICdVVEYtOCc/PiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVudGl0eSA9IHByZWZpeCArICI/Pjx0ZXN0PjxhYWEvPjwvdGVzdD4iOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBleHRyYWN0Q29udGVudChTb3VyY2Ugc291cmNlKSB0aHJvd3MgVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yLAorICAgICAgICAgICAgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7CisgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICAvLyBpZGVudGl0eSB0cmFuc2Zvcm1hdGlvbgorICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworCisgICAgICAgIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcik7CisgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNvdXJjZVByb3ZpZGVyVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsCisgICAgICAgICAgICBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7CisgICAgICAgIFNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbnRpdHkuZ2V0Qnl0ZXMoKSkpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoInNvdXJjZSIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eShzb3VyY2UsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLnN0YXJ0c1dpdGgoU3RyZWFtU291cmNlLmNsYXNzLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0cmVhbVByb3ZpZGVyVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmVhbVNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbnRpdHkuZ2V0Qnl0ZXMoKSkpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoInN0cmVhbSIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eShzb3VyY2UsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLnN0YXJ0c1dpdGgoU3RyZWFtU291cmNlLmNsYXNzLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNheFByb3ZpZGVyVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU0FYU291cmNlIHNvdXJjZSA9IGNyZWF0ZVNBWFNvdXJjZShlbnRpdHkpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoInNheCIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eShzb3VyY2UsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLnN0YXJ0c1dpdGgoU0FYU291cmNlLmNsYXNzLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRvbVByb3ZpZGVyVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRE9NU291cmNlIHNvdXJjZSA9IGNyZWF0ZURPTVNvcnVjZShlbnRpdHkpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoImRvbSIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eShzb3VyY2UsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLnN0YXJ0c1dpdGgoRE9NU291cmNlLmNsYXNzLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldFNvdXJjZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgic291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBTdHJpbmcgY29udGVudCA9IGV4dHJhY3RDb250ZW50KHJlc3BvbnNlLnJlYWRFbnRpdHkoU291cmNlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGVudC5zdGFydHNXaXRoKHByZWZpeCkgfHwgY29udGVudC5zdGFydHNXaXRoKHhka1ByZWZpeCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0U3RyZWFtU291cmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5wYXRoKCJzdHJlYW0iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gZXh0cmFjdENvbnRlbnQocmVzcG9uc2UucmVhZEVudGl0eShTdHJlYW1Tb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LnN0YXJ0c1dpdGgocHJlZml4KSB8fCBjb250ZW50LnN0YXJ0c1dpdGgoeGRrUHJlZml4KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRTYXhTb3VyY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoInNheCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBleHRyYWN0Q29udGVudChyZXNwb25zZS5yZWFkRW50aXR5KFNBWFNvdXJjZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKCJDb250ZW50ICciICsgY29udGVudCArICInIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGV4cGVjdGVkIHByZWZpeCAnIiArIHByZWZpeCArICInIiwKKyAgICAgICAgICAgICAgICBjb250ZW50LnN0YXJ0c1dpdGgocHJlZml4KSB8fCBjb250ZW50LnN0YXJ0c1dpdGgoeGRrUHJlZml4KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXREb21Tb3VyY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoImRvbSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBleHRyYWN0Q29udGVudChyZXNwb25zZS5yZWFkRW50aXR5KERPTVNvdXJjZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKCJDb250ZW50ICciICsgY29udGVudCArICInIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGV4cGVjdGVkIHByZWZpeCAnIiArIHByZWZpeCArICInIiwKKyAgICAgICAgICAgICAgICBjb250ZW50LnN0YXJ0c1dpdGgocHJlZml4KSB8fCBjb250ZW50LnN0YXJ0c1dpdGgoeGRrUHJlZml4KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU0FYU291cmNlIGNyZWF0ZVNBWFNvdXJjZShTdHJpbmcgY29udGVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4RmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTQVhTb3VyY2Uoc2F4RmFjdG9yeS5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKSwgbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBjb250ZW50LmdldEJ5dGVzKCkpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRE9NU291cmNlIGNyZWF0ZURPTVNvcnVjZShTdHJpbmcgY29udGVudCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIERvY3VtZW50IGQgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50LmdldEJ5dGVzKCkpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBET01Tb3VyY2UoZCk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAUFVUCisgICAgICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgICAgICBAUGF0aCgic291cmNlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXRTb3VyY2VBbmRSZXR1cm5TdHJpbmcoU291cmNlIHNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlLmdldENsYXNzKCkgKyBleHRyYWN0Q29udGVudChzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoInRleHQveG1sIikKKyAgICAgICAgQFBhdGgoInN0cmVhbSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHV0U3RyZWFtU291cmNlQW5kUmV0dXJuU3RyaW5nKFN0cmVhbVNvdXJjZSBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRDbGFzcygpICsgZXh0cmFjdENvbnRlbnQoc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgICAgIEBQYXRoKCJzYXgiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dFNheFNvdXJjZUFuZFJldHVyblN0cmluZyhTQVhTb3VyY2Ugc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzb3VyY2UuZ2V0Q2xhc3MoKSArIGV4dHJhY3RDb250ZW50KHNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBAUFVUCisgICAgICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgICAgICBAUGF0aCgiZG9tIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXREb21Tb3VyY2VBbmRSZXR1cm5TdHJpbmcoRE9NU291cmNlIHNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlLmdldENsYXNzKCkgKyBleHRyYWN0Q29udGVudChzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIEBQYXRoKCJzb3VyY2UiKQorICAgICAgICBwdWJsaWMgU3RyZWFtU291cmNlIGdldFNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbnRpdHkuZ2V0Qnl0ZXMoKSkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIEBQYXRoKCJzdHJlYW0iKQorICAgICAgICBwdWJsaWMgU3RyZWFtU291cmNlIGdldFN0cmVhbVNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbnRpdHkuZ2V0Qnl0ZXMoKSkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIEBQYXRoKCJzYXgiKQorICAgICAgICBwdWJsaWMgU0FYU291cmNlIGdldFNheFNvdXJjZSgpIHRocm93cyBTQVhFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNBWFNvdXJjZShlbnRpdHkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIEBQYXRoKCJkb20iKQorICAgICAgICBwdWJsaWMgRE9NU291cmNlIGdldERvbVNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURPTVNvcnVjZShlbnRpdHkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Vuc2FmZUNoYXJzSW5VcmlUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvVW5zYWZlQ2hhcnNJblVyaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVkZDNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Vuc2FmZUNoYXJzSW5VcmlUZXN0LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKKworLyoqCisgKiBUZXN0IGlmIFVSSSBjYW4gY29udGFpbiB1bnNhZmUgY2hhcmFjdGVycyBpbiB0aGUgcXVlcnkgcGFyYW1ldGVyLCBlLmcuIGZvciBzZW5kaW5nIEpTT04KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBVbnNhZmVDaGFyc0luVXJpVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFVuc2FmZUNoYXJzSW5VcmlUZXN0LlJlc3BvbnNlVGVzdC5jbGFzcyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlCisgICAgICovCisgICAgQFBhdGgodmFsdWUgPSAiL2FwcCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZVRlc3QgeworICAgICAgICAvKioKKyAgICAgICAgICogVGVzdCByZXNvdXJjZSBtZXRob2QgcmV0dXJuaW5nIHRoZSBjb250ZW50IG9mIHRoZSB7QGNvZGUgbXNnfSBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHtAY29kZSBtc2d9IHF1ZXJ5IHBhcmFtZXRlciAoYXMgcmVjZWl2ZWQpCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZXN0IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGpzb25RdWVyeVBhcmFtVGVzdChARGVmYXVsdFZhbHVlKCIiKSBAUXVlcnlQYXJhbSgibXNnIikgZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KG1zZykuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCwgdGhhdCBzZXJ2ZXIgY2FuIGNvbnN1bWUgSlNPTiAoY3VybHkgYnJhY2tldHMpIGFuZCBvdGhlciB1bnNhZmUgY2hhcmFjdGVycyBzZW50IGluIHRoZSBxdWVyeSBwYXJhbWV0ZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjQ2hhcnNJblVyaVdpdGhTb2NrZXRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcXVvdGVzIGFyZSBlbmNvZGVkIGJ5IGJyb3dzZXJzLCBjdXJseSBicmFja2V0cyBhcmUgbm90LCBzbyB0aGUgcXVvdGVzIHdpbGwgYmUgc2VudCBwcmUtZW5jb2RlZAorICAgICAgICAvLyBIVFRQIDEuMCBpcyB1c2VkIGZvciBzaW1wbGljaXR5CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHNlbmRHZXRSZXF1ZXN0T3ZlclNvY2tldChnZXRCYXNlVXJpKCksICJHRVQgL2FwcC90ZXN0P21zZz17JTIyZm9vJTIyOiUyMmJhciUyMn0gSFRUUC8xLjAiKTsKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoIntcImZvb1wiOlwiYmFyXCJ9Ii5nZXRCeXRlcyhDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKSksIHJlc3BvbnNlLmdldEJ5dGVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiSW5jb3JyZWN0bHkgd3JpdHRlbiB0ZXN0IChkb2Vzbid0IGRlYWwgd2l0aCBodHRwIGVuY29kaW5nKS4iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWNpYWxDaGFyc0luUXVlcnlQYXJhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHF1b3RlcyBhcmUgZW5jb2RlZCBieSBicm93c2VycywgY3VybHkgYnJhY2tldHMgYXJlIG5vdCwgc28gdGhlIHF1b3RlcyB3aWxsIGJlIHNlbnQgcHJlLWVuY29kZWQKKyAgICAgICAgLy8gSFRUUCAxLjAgaXMgdXNlZCBmb3Igc2ltcGxpY2l0eQorICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBzZW5kR2V0UmVxdWVzdE92ZXJTb2NrZXQoZ2V0QmFzZVVyaSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0VUIC9hcHAvdGVzdD9tc2c9SGVsbG9cXFdvcmxkK1dpdGgrU3BlY0NoYXJzK8KnKikkIcKxQC1fPTtgOlxcLH58IEhUVFAvMS4wIik7CisKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoIkhlbGxvXFxXb3JsZCBXaXRoIFNwZWNDaGFycyDCpyopJCHCsUAtXz07YDpcXCx+fCIuZ2V0Qnl0ZXMoQ2hhcnNldC5mb3JOYW1lKCJJU08tODg1OS0xIikpLAorICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VuZEdldFJlcXVlc3RPdmVyU29ja2V0KGZpbmFsIFVSSSBiYXNlVXJpLCBmaW5hbCBTdHJpbmcgcmVxdWVzdExpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIExvdyBsZXZlbCBhcHByb2FjaCB3aXRoIHNvY2tldHMgaXMgdXNlZCwgYmVjYXVzZSBjb21tb24gSmF2YSBIVFRQIGNsaWVudHMgYXJlIHVzaW5nIGphdmEubmV0LlVSSSwKKyAgICAgICAgLy8gd2hpY2ggZmFpbHMgd2hlbiB1bmVuY29kZWQgY3VybHkgYnJhY2tldCBpcyBwYXJ0IG9mIHRoZSBVUkkKKyAgICAgICAgZmluYWwgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoYmFzZVVyaS5nZXRIb3N0KCksIGJhc2VVcmkuZ2V0UG9ydCgpKTsKKyAgICAgICAgZmluYWwgUHJpbnRXcml0ZXIgcHcgPQorICAgICAgICAgICAgICAgIG5ldyBQcmludFdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgQ2hhcnNldC5mb3JOYW1lKCJJU08tODg1OS0xIikpKSk7CisKKyAgICAgICAgcHcucHJpbnRsbihyZXF1ZXN0TGluZSk7CisgICAgICAgIHB3LnByaW50bG4oKTsgLy8gaHR0cCByZXF1ZXN0IHNob3VsZCBlbmQgd2l0aCBhIGJsYW5rIGxpbmUKKyAgICAgICAgcHcuZmx1c2goKTsKKworICAgICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSwgQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKSk7CisKKyAgICAgICAgU3RyaW5nIGxhc3RMaW5lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIHJlc3BvbnNlIGFuZCByZW1lbWJlciB0aGUgbGFzdCBsaW5lCisgICAgICAgICAgICBsYXN0TGluZSA9IGxpbmU7CisgICAgICAgIH0KKyAgICAgICAgcHcuY2xvc2UoKTsKKyAgICAgICAgYnIuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gbGFzdExpbmU7CisgICAgfQorfQorCisKKworCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvVmFyaWFudHNUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvVmFyaWFudHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjMGY3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9WYXJpYW50c1Rlc3QuamF2YQpAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlZhcmlhbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lZGlhVHlwZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogU2VydmVyLXNpZGUgdmFyaWFudCBzZWxlY3Rpb24gJiBoYW5kbGluZyB0ZXN0LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBWYXJpYW50c1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQ29tcGxleFZhcmlhbnRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGVRdWFsaXR5U291cmNlUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvbHZyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExhbmd1YWdlVmFyaWFudFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkb0dldChAQ29udGV4dCBSZXF1ZXN0IHIpIHsKKyAgICAgICAgICAgIExpc3Q8VmFyaWFudD4gdnMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiemgiKSkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJmciIpKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIikpCisgICAgICAgICAgICAgICAgICAgIC5hZGQoKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgVmFyaWFudCB2ID0gci5zZWxlY3RWYXJpYW50KHZzKTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90QWNjZXB0YWJsZSh2cykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHYuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpLCB2KS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGFuZ3VhZ2VFbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBycCA9IHRhcmdldCgiL2x2ciIpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSBycC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2NlcHQtTGFuZ3VhZ2UiLCAiZW4iKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIHIuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHZhcnkgPSByLmdldEhlYWRlclN0cmluZygiVmFyeSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZhcnkpOworICAgICAgICBhc3NlcnRUcnVlKCFjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQtTGFuZ3VhZ2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGFuZ3VhZ2VaaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBycCA9IHRhcmdldCgiL2x2ciIpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSBycC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2NlcHQtTGFuZ3VhZ2UiLCAiemgiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ6aCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ6aCIsIHIuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHIuZ2V0TWV0YWRhdGEoKS5nZXRGaXJzdCgiVmFyeSIpKTsKKyAgICAgICAgU3RyaW5nIHZhcnkgPSByLmdldEhlYWRlclN0cmluZygiVmFyeSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZhcnkpOworICAgICAgICBhc3NlcnRUcnVlKCFjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQtTGFuZ3VhZ2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGFuZ3VhZ2VNdWx0aXBsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBycCA9IHRhcmdldCgiL2x2ciIpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSBycAorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2NlcHQtTGFuZ3VhZ2UiLCAiZW47cT0wLjMsIHpoO3E9MC40LCBmciIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyIiwgci5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBTdHJpbmcgdmFyeSA9IHIuZ2V0SGVhZGVyU3RyaW5nKCJWYXJ5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyeSk7CisgICAgICAgIGFzc2VydFRydWUoIWNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdC1MYW5ndWFnZSIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2N2ciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21wbGV4VmFyaWFudFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkb0dldChAQ29udGV4dCBSZXF1ZXN0IHIpIHsKKyAgICAgICAgICAgIExpc3Q8VmFyaWFudD4gdnMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJpbWFnZS9qcGVnIikpCisgICAgICAgICAgICAgICAgICAgIC5hZGQoKQorICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24veG1sIikpCisgICAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iLCAidXMiKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZCgpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L3htbCIpKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIikpCisgICAgICAgICAgICAgICAgICAgIC5hZGQoKQorICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUudmFsdWVPZigidGV4dC94bWwiKSkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIsICJ1cyIpKQorICAgICAgICAgICAgICAgICAgICAuYWRkKCkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIFZhcmlhbnQgdiA9IHIuc2VsZWN0VmFyaWFudCh2cyk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vdEFjY2VwdGFibGUodnMpLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiR0VUIiwgdikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbXBsZXgxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHJwID0gdGFyZ2V0KCIvY3ZyIik7CisKKyAgICAgICAgUmVzcG9uc2UgciA9IHJwLnJlcXVlc3QoInRleHQveG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKKyAgICAgICAgICAgICAgICAiaW1hZ2UvcG5nIiwKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sO3E9MC45IiwKKyAgICAgICAgICAgICAgICAidGV4dC9wbGFpbjtxPTAuOCIsCisgICAgICAgICAgICAgICAgIiovKjtxPTAuNSIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiQWNjZXB0LUxhbmd1YWdlIiwgImVuLXVzLGVuO3E9MC41IikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLnZhbHVlT2YoInRleHQveG1sIiksIHIuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgci5nZXRMYW5ndWFnZSgpLmdldExhbmd1YWdlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVTIiwgci5nZXRMYW5ndWFnZSgpLmdldENvdW50cnkoKSk7CisgICAgICAgIFN0cmluZyB2YXJ5ID0gci5nZXRIZWFkZXJTdHJpbmcoIlZhcnkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQtTGFuZ3VhZ2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcGxleDIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgcnAgPSB0YXJnZXQoIi9jdnIiKTsKKworICAgICAgICBSZXNwb25zZSByID0gcnAucmVxdWVzdCgidGV4dC94bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLAorICAgICAgICAgICAgICAgICJpbWFnZS9wbmciLAorICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWw7cT0wLjkiLAorICAgICAgICAgICAgICAgICJ0ZXh0L3BsYWluO3E9MC44IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC41IikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2NlcHQtTGFuZ3VhZ2UiLCAiZW4sZW4tdXMiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigidGV4dC94bWwiKSwgci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCByLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZyB2YXJ5ID0gci5nZXRIZWFkZXJTdHJpbmcoIlZhcnkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQtTGFuZ3VhZ2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcGxleDMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgcnAgPSB0YXJnZXQoIi9jdnIiKTsKKworICAgICAgICBSZXNwb25zZSByID0gcnAucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIiwKKyAgICAgICAgICAgICAgICAidGV4dC94bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLAorICAgICAgICAgICAgICAgICJpbWFnZS9wbmciLAorICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWw7cT0wLjkiLAorICAgICAgICAgICAgICAgICJ0ZXh0L3BsYWluO3E9MC44IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC41IikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2NlcHQtTGFuZ3VhZ2UiLCAiZW4tdXMsZW47cT0wLjUiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24veG1sIiksIHIuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgci5nZXRMYW5ndWFnZSgpLmdldExhbmd1YWdlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVTIiwgci5nZXRMYW5ndWFnZSgpLmdldENvdW50cnkoKSk7CisgICAgICAgIFN0cmluZyB2YXJ5ID0gci5nZXRIZWFkZXJTdHJpbmcoIlZhcnkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQtTGFuZ3VhZ2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcGxleE5vdEFjY2VwdGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgcnAgPSB0YXJnZXQoIi9jdnIiKTsKKworICAgICAgICBSZXNwb25zZSByID0gcnAucmVxdWVzdCgiYXBwbGljYXRpb24vYXRvbSt4bWwiKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdC1MYW5ndWFnZSIsICJlbi11cyxlbiIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBTdHJpbmcgdmFyeSA9IHIuZ2V0SGVhZGVyU3RyaW5nKCJWYXJ5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyeSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0LUxhbmd1YWdlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA2LCByLmdldFN0YXR1cygpKTsKKworICAgICAgICByID0gcnAucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2NlcHQtTGFuZ3VhZ2UiLCAiZnIiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgdmFyeSA9IHIuZ2V0SGVhZGVyU3RyaW5nKCJWYXJ5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyeSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0LUxhbmd1YWdlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA2LCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL210cXNyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhVHlwZVF1YWxpdHlTb3VyY2VSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZG9HZXQoQENvbnRleHQgUmVxdWVzdCByKSB7CisgICAgICAgICAgICBMaXN0PFZhcmlhbnQ+IHZzID0gVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24veG1sO3FzPTAuOCIpKQorICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUudmFsdWVPZigidGV4dC9odG1sO3FzPTEuMCIpKQorICAgICAgICAgICAgICAgICAgICAuYWRkKCkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIFZhcmlhbnQgdiA9IHIuc2VsZWN0VmFyaWFudCh2cyk7CisgICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vdEFjY2VwdGFibGUodnMpLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiR0VUIiwgdikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVF1YWxpdHlTb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgcnAgPSB0YXJnZXQoIi9tdHFzciIpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSBycC5yZXF1ZXN0KAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWwiLAorICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWw7cT0wLjkiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShNZWRpYVR5cGVzLnR5cGVFcXVhbChNZWRpYVR5cGUudmFsdWVPZigidGV4dC9odG1sIiksIHIuZ2V0TWVkaWFUeXBlKCkpKTsKKyAgICAgICAgU3RyaW5nIHZhcnkgPSByLmdldEhlYWRlclN0cmluZygiVmFyeSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZhcnkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisKKyAgICAgICAgciA9IHJwLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKE1lZGlhVHlwZXMudHlwZUVxdWFsKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWwiKSwgci5nZXRNZWRpYVR5cGUoKSkpOworICAgICAgICB2YXJ5ID0gci5nZXRIZWFkZXJTdHJpbmcoIlZhcnkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworCisgICAgICAgIHIgPSBycC5yZXF1ZXN0KAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWwiLAorICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWwiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShNZWRpYVR5cGVzLnR5cGVFcXVhbChNZWRpYVR5cGUudmFsdWVPZigidGV4dC9odG1sIiksIHIuZ2V0TWVkaWFUeXBlKCkpKTsKKyAgICAgICAgdmFyeSA9IHIuZ2V0SGVhZGVyU3RyaW5nKCJWYXJ5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyeSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdCIpKTsKKworICAgICAgICByID0gcnAucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoTWVkaWFUeXBlcy50eXBlRXF1YWwoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL3htbCIpLCByLmdldE1lZGlhVHlwZSgpKSk7CisgICAgICAgIHZhcnkgPSByLmdldEhlYWRlclN0cmluZygiVmFyeSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZhcnkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBsLCBTdHJpbmcgdikgeworICAgICAgICBTdHJpbmdbXSB2cyA9IGwuc3BsaXQoIiwiKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IHZzKSB7CisgICAgICAgICAgICBzID0gcy50cmltKCk7CisgICAgICAgICAgICBpZiAocy5lcXVhbHNJZ25vcmVDYXNlKHYpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0NsaWVudFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9DbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlZGI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9DbGllbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5WYXJpYW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENsaWVudFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJoZWxsb3dvcmxkIikKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRSA9ICJIZWxsbyB3b3JsZCEiOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDbGljaGVkTWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBNRVNTQUdFOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImhlYWRlcnMiKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlcnNUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjb250ZW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBjb250ZW50SGVhZGVycyhASGVhZGVyUGFyYW0oImN1c3RvbS1oZWFkZXIiKSBmaW5hbCBTdHJpbmcgY3VzdG9tSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIEh0dHBIZWFkZXJzIGhlYWRlcnMsIGZpbmFsIFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihlbnRpdHkpLmFwcGVuZCgnXG4nKTsKKworICAgICAgICAgICAgc2IuYXBwZW5kKCJjdXN0b20taGVhZGVyOiIpLmFwcGVuZChjdXN0b21IZWFkZXIpLmFwcGVuZCgnXG4nKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlciA6IGhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcnMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGhlYWRlci5nZXRLZXkoKSkuYXBwZW5kKCc6JykuYXBwZW5kKGhlYWRlci5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcywgSGVhZGVyc1Rlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNpbmdIZWxsb3dvcmxkUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IHJlc291cmNlLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlTWVzc2FnZSA9IHJlc291cmNlLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5NRVNTQUdFLCByZXNwb25zZU1lc3NhZ2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VzaW5nTWlzc2luZ1Jlc291cmNlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgbWlzc2luZ1Jlc291cmNlID0gdGFyZ2V0KCkucGF0aCgibWlzc2luZyIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gbWlzc2luZ1Jlc291cmNlLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5nZXRTdGF0dXMoKSk7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWlzc2luZ1Jlc291cmNlLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIGV4LmdldFJlc3BvbnNlKCkuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmFpbCgiRXhwZWN0ZWQgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93bi4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIC8vIEluc3BpcmVkIGJ5IEpFUlNFWS0xNTAyCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRIZWFkZXJzKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiaGVhZGVycyIpLnBhdGgoImNvbnRlbnQiKTsKKworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgaWI7CisgICAgICAgIEludm9jYXRpb24gaTsKKyAgICAgICAgUmVzcG9uc2UgcjsKKyAgICAgICAgU3RyaW5nIHJlcUhlYWRlcnM7CisKKyAgICAgICAgaWIgPSB0YXJnZXQucmVxdWVzdCgiKi8qIik7CisgICAgICAgIGliLmhlYWRlcigiY3VzdG9tLWhlYWRlciIsICJjdXN0b20tdmFsdWUiKTsKKyAgICAgICAgaWIuaGVhZGVyKCJjb250ZW50LWVuY29kaW5nIiwgImRlZmxhdGUiKTsKKyAgICAgICAgaSA9IGliLmJ1aWxkKCJQT1NUIiwgRW50aXR5LmVudGl0eSgiYWFhIiwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpKTsKKyAgICAgICAgciA9IGkuaW52b2tlKCk7CisKKyAgICAgICAgcmVxSGVhZGVycyA9IHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGV4cGVjdGVkIDogbmV3IFN0cmluZ1tdIHsiY3VzdG9tLWhlYWRlcjpbY3VzdG9tLXZhbHVlXSIsICJjdXN0b20taGVhZGVyOmN1c3RvbS12YWx1ZSJ9KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIlJlcXVlc3QgaGVhZGVycyBkbyBub3QgY29udGFpbiBleHBlY3RlZCAnJXMnIGVudHJ5OlxuJXMiLCBleHBlY3RlZCwgcmVxSGVhZGVycyksCisgICAgICAgICAgICAgICAgICAgIHJlcUhlYWRlcnMuY29udGFpbnMoZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgdW5leHBlY3RlZCA9ICJjb250ZW50LWVuY29kaW5nIjsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyaW5nLmZvcm1hdCgiUmVxdWVzdCBoZWFkZXJzIGNvbnRhaW5zIHVuZXhwZWN0ZWQgJyVzJyBlbnRyeTpcbiVzIiwgdW5leHBlY3RlZCwgcmVxSGVhZGVycyksCisgICAgICAgICAgICAgICAgcmVxSGVhZGVycy5jb250YWlucyh1bmV4cGVjdGVkKSk7CisKKyAgICAgICAgaWIgPSB0YXJnZXQucmVxdWVzdCgiKi8qIik7CisgICAgICAgIGkgPSBpYi5idWlsZCgiUE9TVCIsCisgICAgICAgICAgICAgICAgRW50aXR5LmVudGl0eSgiYWFhIiwgVmFyaWFudC5tZWRpYVR5cGVzKE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKS5lbmNvZGluZ3MoImRlZmxhdGUiKS5idWlsZCgpLmdldCgwKSkpOworICAgICAgICByID0gaS5pbnZva2UoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQgPSAiY29udGVudC1lbmNvZGluZzpbZGVmbGF0ZV0iOworICAgICAgICByZXFIZWFkZXJzID0gci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJSZXF1ZXN0IGhlYWRlcnMgZG8gbm90IGNvbnRhaW4gZXhwZWN0ZWQgJyVzJyBlbnRyeTpcbiVzIiwgZXhwZWN0ZWQsIHJlcUhlYWRlcnMpLAorICAgICAgICAgICAgICAgIHJlcUhlYWRlcnMuY29udGFpbnMoZXhwZWN0ZWQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3ZjU3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9FeGVjdXRvclNlcnZpY2VQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRBc3luY0V4ZWN1dG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmNFeGVjdXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gRTJFIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjdXRvclNlcnZpY2VQcm92aWRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZUEgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTeW5jKCkgeworICAgICAgICAgICAgcmV0dXJuICJyZXNvdXJjZSI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhc3luYyIpCisgICAgICAgIEBNYW5hZ2VkQXN5bmMKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBc3luYygpIHsKKyAgICAgICAgICAgIHJldHVybiAiYXN5bmMtcmVzb3VyY2UtIiArIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyVGVzdC5nZXRSZXNwb25zZU9uVGhyZWFkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBIHNlcGFyYXRlIHJlc291cmNlIGNsYXNzIGZvciB0aGUgY3VzdG9tLWFzeW5jIHN1Yi1wYXRoIHRvIGVuc3VyZSB0aGF0CisgICAgLy8gdGhlIG5hbWVkIEV4ZWN1dG9yU2VydmljZSBpbmplY3Rpb24gaXMgb25seSBwZXJmb3JtZWQgZm9yIHRoZSAiL3Jlc291cmNlL2N1c3RvbS1hc3luYyIgcGF0aC4KKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2VCIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIEBOYW1lZCgiY3VzdG9tIikKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZTsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjdXN0b20tYXN5bmMiKQorICAgICAgICBwdWJsaWMgdm9pZCBnZXRDdXN0b21Bc3luYyhAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZSgiY3VzdG9tLWFzeW5jLXJlc291cmNlLSIgKyBFeGVjdXRvclNlcnZpY2VQcm92aWRlclRlc3QuZ2V0UmVzcG9uc2VPblRocmVhZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0UmVzcG9uc2VPblRocmVhZCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRocmVhZE5hbWUgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHRocmVhZE5hbWUuc3RhcnRzV2l0aCgiYXN5bmMtcmVxdWVzdC0iKSkgeworICAgICAgICAgICAgcmV0dXJuICJwYXNzZWQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICJlcnJvciAtIHVuZXhwZWN0ZWQgY3VzdG9tIHRocmVhZCBuYW1lOiAiICsgdGhyZWFkTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDbGllbnRBc3luY0V4ZWN1dG9yCisgICAgQE1hbmFnZWRBc3luY0V4ZWN1dG9yCisgICAgQE5hbWVkKCJjdXN0b20iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tRXhlY3V0b3JQcm92aWRlciBpbXBsZW1lbnRzIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxFeGVjdXRvclNlcnZpY2U+IGV4ZWN1dG9ycyA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCBleGVjdXRvckNyZWF0aW9uQ291bnQgPSAwOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCBleGVjdXRvclJlbGVhc2VDb3VudCA9IDA7CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBmb3IgKEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA6IGV4ZWN1dG9ycykgeworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGV4ZWN1dG9ycy5jbGVhcigpOworICAgICAgICAgICAgZXhlY3V0b3JDcmVhdGlvbkNvdW50ID0gMDsKKyAgICAgICAgICAgIGV4ZWN1dG9yUmVsZWFzZUNvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tRXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ3VzdG9tRXhlY3V0b3JTZXJ2aWNlIGltcGxlbWVudHMgRXhlY3V0b3JTZXJ2aWNlIHsKKworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZGVsZWdhdGU7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNDbGVhbmVkVXA7CisKKyAgICAgICAgICAgIHB1YmxpYyBDdXN0b21FeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgICAgICAgICAgdGhpcy5pc0NsZWFuZWRVcCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiYXN5bmMtcmVxdWVzdC0lZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICBleGVjdXRvckNyZWF0aW9uQ291bnQrKzsKKyAgICAgICAgICAgICAgICBleGVjdXRvcnMuYWRkKHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICAgICAgICAgIHRyeUNsZWFuVXAoKTsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5zaHV0ZG93bigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFJ1bm5hYmxlPiBzaHV0ZG93bk5vdygpIHsKKyAgICAgICAgICAgICAgICB0cnlDbGVhblVwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTaHV0ZG93bigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNTaHV0ZG93bigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVGVybWluYXRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNUZXJtaW5hdGVkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYXdhaXRUZXJtaW5hdGlvbihsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmF3YWl0VGVybWluYXRpb24odGltZW91dCwgdW5pdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gc3VibWl0KENhbGxhYmxlPFQ+IHRhc2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuc3VibWl0KHRhc2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHN1Ym1pdChSdW5uYWJsZSB0YXNrLCBUIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5zdWJtaXQodGFzaywgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRnV0dXJlPD8+IHN1Ym1pdChSdW5uYWJsZSB0YXNrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnN1Ym1pdCh0YXNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgPFQ+IExpc3Q8RnV0dXJlPFQ+PiBpbnZva2VBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2FsbGFibGU8VD4+IHRhc2tzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VBbGwodGFza3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8VD4gTGlzdDxGdXR1cmU8VD4+IGludm9rZUFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDYWxsYWJsZTxUPj4gdGFza3MsIGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuaW52b2tlQWxsKHRhc2tzLCB0aW1lb3V0LCB1bml0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgPFQ+IFQgaW52b2tlQW55KENvbGxlY3Rpb248PyBleHRlbmRzIENhbGxhYmxlPFQ+PiB0YXNrcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VBbnkodGFza3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8VD4gVCBpbnZva2VBbnkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2FsbGFibGU8VD4+IHRhc2tzLCBsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuaW52b2tlQW55KHRhc2tzLCB0aW1lb3V0LCB1bml0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHRyeUNsZWFuVXAoKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2xlYW5lZFVwLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9ycy5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yUmVsZWFzZUNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgY29tbWFuZCkgeworICAgICAgICAgICAgICAgIGRlbGVnYXRlLmV4ZWN1dGUoY29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDdXN0b21FeGVjdXRvclByb3ZpZGVyIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIgPSBuZXcgQ3VzdG9tRXhlY3V0b3JQcm92aWRlcigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgLy8gZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2VBLmNsYXNzLCBUZXN0UmVzb3VyY2VCLmNsYXNzKS5yZWdpc3RlcihzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjIwNSAoY2xpZW50LXNpZGUpLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ2xpZW50RXhlY3V0b3JzSW5qZWN0aW9uQW5kUmVsZWFzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQ3VzdG9tRXhlY3V0b3JQcm92aWRlcigpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS5yZWdpc3Rlcihwcm92aWRlcik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlc291cmNlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICAvLyBubyBleGVjdXRvcnMgc2hvdWxkIGJlIGNyZWF0ZWQgb3IgcmVsZWFzZWQgYXQgdGhpcyBwb2ludCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjcmVhdGVkIGNsaWVudCBleGVjdXRvcnMiLCAwLCBwcm92aWRlci5leGVjdXRvckNyZWF0aW9uQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJlbGVhc2VkIGNsaWVudCBleGVjdXRvcnMiLCAwLCBwcm92aWRlci5leGVjdXRvclJlbGVhc2VDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgY2xpZW50IGV4ZWN1dG9ycyBzdG9yZWQgaW4gdGhlIHNldC4iLAorICAgICAgICAgICAgICAgIDAsIHByb3ZpZGVyLmV4ZWN1dG9ycy5zaXplKCkpOworCisgICAgICAgIEZ1dHVyZTxSZXNwb25zZT4gZnIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgcmVzcG9uc2UgPSBmci5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVzb3VyY2UiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIC8vIHNpbmdsZSBleGVjdXRvciBzaG91bGQgYmUgY3JlYXRlZCBidXQgbm90IHJlbGVhc2VkIGF0IHRoaXMgcG9pbnQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgY3JlYXRlZCBjbGllbnQgZXhlY3V0b3JzIiwgMSwgcHJvdmlkZXIuZXhlY3V0b3JDcmVhdGlvbkNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZWxlYXNlZCBjbGllbnQgZXhlY3V0b3JzIiwgMCwgcHJvdmlkZXIuZXhlY3V0b3JSZWxlYXNlQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNsaWVudCBleGVjdXRvcnMgc3RvcmVkIGluIHRoZSBzZXQuIiwKKyAgICAgICAgICAgICAgICAxLCBwcm92aWRlci5leGVjdXRvcnMuc2l6ZSgpKTsKKworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKworICAgICAgICAvLyB0aGUgY3JlYXRlZCBleGVjdXRvciBuZWVkcyB0byBiZSByZWxlYXNlZCBieSBub3c7IG5vIG1vcmUgZXhlY3V0b3JzIHNob3VsZCBiZSBjcmVhdGVkCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgY3JlYXRlZCBjbGllbnQgZXhlY3V0b3JzIiwgMSwgcHJvdmlkZXIuZXhlY3V0b3JDcmVhdGlvbkNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZWxlYXNlZCBjbGllbnQgZXhlY3V0b3JzIiwgMSwgcHJvdmlkZXIuZXhlY3V0b3JSZWxlYXNlQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNsaWVudCBleGVjdXRvcnMgc3RvcmVkIGluIHRoZSBzZXQuIiwKKyAgICAgICAgICAgICAgICAwLCBwcm92aWRlci5leGVjdXRvcnMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjIwNSAoc2VydmVyLXNpZGUpLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tU2VydmVyRXhlY3V0b3JzSW5qZWN0aW9uQW5kUmVsZWFzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJlc2V0IHNlcnZlciBleGVjdXRvciBzdGF0aXN0aWNzIHRvIGF2b2lkIGRhdGEgcG9sbHV0aW9uIGZyb20gb3RoZXIgdGVzdCBtZXRob2RzCisgICAgICAgIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIucmVzZXQoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlc291cmNlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICAvLyBubyBleGVjdXRvcnMgc2hvdWxkIGJlIGNyZWF0ZWQgb3IgcmVsZWFzZWQgYXQgdGhpcyBwb2ludCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjcmVhdGVkIHNlcnZlciBleGVjdXRvcnMiLCAwLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9yQ3JlYXRpb25Db3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVsZWFzZWQgc2VydmVyIGV4ZWN1dG9ycyIsIDAsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JSZWxlYXNlQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHNlcnZlciBleGVjdXRvcnMgc3RvcmVkIGluIHRoZSBzZXQuIiwKKyAgICAgICAgICAgICAgICAwLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9ycy5zaXplKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZS9hc3luYyIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXN5bmMtcmVzb3VyY2UtcGFzc2VkIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICAvLyBzaW5nbGUgZXhlY3V0b3Igc2hvdWxkIGJlIGNyZWF0ZWQgYnV0IG5vdCByZWxlYXNlZCBhdCB0aGlzIHBvaW50IHlldAorICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNyZWF0ZWQgc2VydmVyIGV4ZWN1dG9ycyIsIDEsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JDcmVhdGlvbkNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZWxlYXNlZCBzZXJ2ZXIgZXhlY3V0b3JzIiwgMCwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvclJlbGVhc2VDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2Ygc2VydmVyIGV4ZWN1dG9ycyBzdG9yZWQgaW4gdGhlIHNldC4iLAorICAgICAgICAgICAgICAgIDEsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JzLnNpemUoKSk7CisKKyAgICAgICAgdGVhckRvd24oKTsgLy8gc3RvcHBpbmcgdGVzdCBjb250YWluZXIKKworICAgICAgICAvLyB0aGUgY3JlYXRlZCBleGVjdXRvciBuZWVkcyB0byBiZSByZWxlYXNlZCBieSBub3c7IG5vIG1vcmUgZXhlY3V0b3JzIHNob3VsZCBiZSBjcmVhdGVkCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgY3JlYXRlZCBzZXJ2ZXIgZXhlY3V0b3JzIiwgMSwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvckNyZWF0aW9uQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJlbGVhc2VkIHNlcnZlciBleGVjdXRvcnMiLCAxLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9yUmVsZWFzZUNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBzZXJ2ZXIgZXhlY3V0b3JzIHN0b3JlZCBpbiB0aGUgc2V0LiIsCisgICAgICAgICAgICAgICAgMCwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvcnMuc2l6ZSgpKTsKKworICAgICAgICBzZXRVcCgpOyAvLyByZS1zdGFydGluZyB0ZXN0IGNvbnRhaW5lciB0byBlbnN1cmUgcHJvcGVyIHBvc3QtdGVzdCB0ZWFyRG93bi4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG5hbWVkIGN1c3RvbSBleGVjdXRvciBpbmplY3Rpb24gYW5kIHJlbGVhc2UgbWVjaGFuaXNtLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTmFtZWRTZXJ2ZXJFeGVjdXRvcnNJbmplY3Rpb25BbmRSZWxlYXNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2VydmVyRXhlY3V0b3JQcm92aWRlci5yZXNldCgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZS9jdXN0b20tYXN5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbS1hc3luYy1yZXNvdXJjZS1wYXNzZWQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIC8vIHNpbmdsZSBleGVjdXRvciBzaG91bGQgYmUgY3JlYXRlZCBidXQgbm90IHJlbGVhc2VkIGF0IHRoaXMgcG9pbnQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgY3JlYXRlZCBzZXJ2ZXIgZXhlY3V0b3JzIiwgMSwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvckNyZWF0aW9uQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJlbGVhc2VkIHNlcnZlciBleGVjdXRvcnMiLCAwLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9yUmVsZWFzZUNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBzZXJ2ZXIgZXhlY3V0b3JzIHN0b3JlZCBpbiB0aGUgc2V0LiIsCisgICAgICAgICAgICAgICAgMSwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvcnMuc2l6ZSgpKTsKKworICAgICAgICB0ZWFyRG93bigpOyAvLyBzdG9wcGluZyB0ZXN0IGNvbnRhaW5lcgorCisgICAgICAgIC8vIHRoZSBjcmVhdGVkIGV4ZWN1dG9yIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJ5IG5vdzsgbm8gbW9yZSBleGVjdXRvcnMgc2hvdWxkIGJlIGNyZWF0ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjcmVhdGVkIHNlcnZlciBleGVjdXRvcnMiLCAxLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9yQ3JlYXRpb25Db3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVsZWFzZWQgc2VydmVyIGV4ZWN1dG9ycyIsIDEsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JSZWxlYXNlQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHNlcnZlciBleGVjdXRvcnMgc3RvcmVkIGluIHRoZSBzZXQuIiwKKyAgICAgICAgICAgICAgICAwLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9ycy5zaXplKCkpOworCisgICAgICAgIHNldFVwKCk7IC8vIHJlLXN0YXJ0aW5nIHRlc3QgY29udGFpbmVyIHRvIGVuc3VyZSBwcm9wZXIgcG9zdC10ZXN0IHRlYXJEb3duLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9JbnRlcmNlcHRvckN1c3RvbVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9JbnRlcmNlcHRvckN1c3RvbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmFhYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0ludGVyY2VwdG9yQ3VzdG9tVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuSW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLkludGVyY2VwdG9yR3ppcFRlc3QuR1pJUFJlYWRlclRlc3RJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuSW50ZXJjZXB0b3JHemlwVGVzdC5HWklQV3JpdGVyVGVzdEludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0cyBpbnRlcmNlcHRvcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcmNlcHRvckN1c3RvbVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUk9NX1JFU09VUkNFID0gIi1mcm9tX3Jlc291cmNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gImhlbGxvLCB0aGlzIGlzIHRleHQgZW50aXR5IjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzLCBHWklQV3JpdGVyVGVzdEludGVyY2VwdG9yLmNsYXNzLCBHWklQUmVhZGVyVGVzdEludGVyY2VwdG9yLmNsYXNzLAorICAgICAgICAgICAgICAgIFBsdXNPbmVXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgTWludXNPbmVSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgQW5ub3RhdGlvbnNSZWFkZXJXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEdaSVBSZWFkZXJUZXN0SW50ZXJjZXB0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEdaSVBXcml0ZXJUZXN0SW50ZXJjZXB0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFBsdXNPbmVXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTWludXNPbmVSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQW5ub3RhdGlvbnNSZWFkZXJXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9yZUludGVyY2VwdG9yc0FuZEZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KEVOVElUWSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoRU5USVRZICsgRlJPTV9SRVNPVVJDRSwgc3RyKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQVVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXNvdXJjZTogIiArIHN0cik7CisgICAgICAgICAgICByZXR1cm4gc3RyICsgRlJPTV9SRVNPVVJDRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyY2VwdG9yIHdoaWNoIGFkZHMgKzEgdG8gZWFjaCBieXRlIHdyaXR0ZW4gaW50byB0aGUgc3RyZWFtLgorICAgICAqLworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSgzMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQbHVzT25lV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG9sZCA9IGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBjb250ZXh0LnNldE91dHB1dFN0cmVhbShuZXcgT3V0cHV0U3RyZWFtKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiID09IDI1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2xkLndyaXRlKDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb2xkLndyaXRlKGIgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmNlcHRvciB3aGljaCBhZGRzICsxIHRvIGVhY2ggYnl0ZSByZWFkIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoMzAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWludXNPbmVSZWFkZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBvbGQgPSBjb250ZXh0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG5ldyBJbnB1dFN0cmVhbSgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGludCBiID0gb2xkLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiAtIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJjZXB0b3IgdGhhdCB0cmllcyB0byBzZXQgYW5ub3RhdGlvbnMgb2Yge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gdG8ge0Bjb2RlIG51bGx9LAorICAgICAqIGVtcHR5IGFycmF5IGFuZCBmaW5hbGx5IHRvIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKyAgICAgKi8KKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoMzAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbnNSZWFkZXJXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yLCBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gY29udGV4dC5nZXRBbm5vdGF0aW9ucygpOworCisgICAgICAgICAgICAvLyBGYWlscyBpZiBubyBOUEUgaXMgdGhyb3duLgorICAgICAgICAgICAgdW5zZXRBbm5vdGF0aW9ucyhjb250ZXh0KTsKKyAgICAgICAgICAgIC8vIE9rLgorICAgICAgICAgICAgc2V0QW5ub3RhdGlvbnMoY29udGV4dCwgbmV3IEFubm90YXRpb25bMF0pOworICAgICAgICAgICAgLy8gT2suCisgICAgICAgICAgICBzZXRBbm5vdGF0aW9ucyhjb250ZXh0LCBhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGNvbnRleHQuZ2V0QW5ub3RhdGlvbnMoKTsKKworICAgICAgICAgICAgLy8gRmFpbHMgaWYgbm8gTlBFIGlzIHRocm93bi4KKyAgICAgICAgICAgIHVuc2V0QW5ub3RhdGlvbnMoY29udGV4dCk7CisgICAgICAgICAgICAvLyBPay4KKyAgICAgICAgICAgIHNldEFubm90YXRpb25zKGNvbnRleHQsIG5ldyBBbm5vdGF0aW9uWzBdKTsKKyAgICAgICAgICAgIC8vIE9rLgorICAgICAgICAgICAgc2V0QW5ub3RhdGlvbnMoY29udGV4dCwgYW5ub3RhdGlvbnMpOworCisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRBbm5vdGF0aW9ucyhmaW5hbCBJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRBbm5vdGF0aW9ucygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB1bnNldEFubm90YXRpb25zKGZpbmFsIEludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QW5ub3RhdGlvbnMobnVsbCk7CisKKyAgICAgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgICAgIC8vIE9LLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByaW9yaXR5KDEwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElPRXhjZXB0aW9uUmVhZGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJjbGllbnQgaW8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElPRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xpZW50KCkucmVnaXN0ZXIoSU9FeGNlcHRpb25SZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucHV0KEVudGl0eS5lbnRpdHkoRU5USVRZLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIlByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9JbnRlcmNlcHRvckd6aXBUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvSW50ZXJjZXB0b3JHemlwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDc1YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvSW50ZXJjZXB0b3JHemlwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGd6aXAgaW50ZXJjZXB0b3JzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcmNlcHRvckd6aXBUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJPTV9SRVNPVVJDRSA9ICItZnJvbV9yZXNvdXJjZSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcywgR1pJUFdyaXRlclRlc3RJbnRlcmNlcHRvci5jbGFzcywKKyAgICAgICAgICAgICAgICBHWklQUmVhZGVyVGVzdEludGVyY2VwdG9yLmNsYXNzKTsgLy8gR1pJUEludGVyY2VwdG9yLmNsYXNzCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3ppcEludGVyY2VwdG9yT25seU9uU2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xpZW50KCkucmVnaXN0ZXIoR1pJUFdyaXRlclRlc3RJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFN0cmluZyBlbnRpdHkgPSAiaGVsbG8sIHRoaXMgaXMgdGV4dCBlbnRpdHkiOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucHV0KEVudGl0eS5lbnRpdHkoZW50aXR5LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIElucHV0U3RyZWFtIGlzID0gcmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgICAgIEdaSVBJbnB1dFN0cmVhbSBnemlwSXMgPSBuZXcgR1pJUElucHV0U3RyZWFtKGlzKTsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGd6aXBJcykpOworICAgICAgICBTdHJpbmcgc3RyID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVudGl0eSArIEZST01fUkVTT1VSQ0UsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3ppcEludGVyY2VwdG9yT25TZXJ2ZXJhbmRDbGllbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbGllbnQoKS5yZWdpc3RlcihHWklQUmVhZGVyVGVzdEludGVyY2VwdG9yLmNsYXNzKS5yZWdpc3RlcihHWklQV3JpdGVyVGVzdEludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9ICJoZWxsbywgdGhpcyBpcyB0ZXh0IGVudGl0eSI7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVudGl0eSArIEZST01fUkVTT1VSQ0UsIHN0cik7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAUFVUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIEBDb25zdW1lcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHV0KFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVzb3VyY2U6ICIgKyBzdHIpOworICAgICAgICAgICAgcmV0dXJuIHN0ciArIEZST01fUkVTT1VSQ0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoMjAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG9sZCA9IGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gbmV3T3V0ID0gbmV3IE91dHB1dFN0cmVhbSgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSBCeXRlLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2xkLndyaXRlKEJ5dGUuTUlOX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZC53cml0ZShiICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0obmV3T3V0KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKG9sZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoMjAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR1pJUFdyaXRlclRlc3RJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb2xkID0gY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEdaSVBPdXRwdXRTdHJlYW0gbmV3U3RyZWFtID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0ob2xkKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKG5ld1N0cmVhbSk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpKSB7CisgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGNsZW4gPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBjbGVuLmFkZCgtMUwpOworICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0SGVhZGVycygpLnB1dChIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgY2xlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBuZXdTdHJlYW0uZmluaXNoKCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0ob2xkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSgyMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHWklQUmVhZGVyVGVzdEludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIG9sZCA9IGNvbnRleHQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0SW5wdXRTdHJlYW0obmV3IEdaSVBJbnB1dFN0cmVhbShvbGQpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG9sZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9MaW5rVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0xpbmtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwMzNlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9MaW5rVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaVRlbXBsYXRlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIExpbmtUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcyh7CisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hIVE1MX1hNTCwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fQVRPTV9YTUwsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1NWR19YTUwKKyAgICAgICAgfSkKKyAgICAgICAgQFBhdGgoInByb2R1Y2VzeG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwcm9kdWNlc1htbCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIExpbmtUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKKyAgICAgICAgTGluayBsaW5rID0gTGluay5mcm9tTWV0aG9kKFJlc291cmNlLmNsYXNzLCAicHJvZHVjZXNYbWwiKS5idWlsZCgpOworICAgICAgICBTdHJpbmcgc3RyaW5nID0gbGluay50b1N0cmluZygpOworICAgICAgICBMaW5rIGZyb21WYWx1ZU9mID0gTGluay52YWx1ZU9mKHN0cmluZyk7CisgICAgICAgIGFzc2VydEVxdWFscyhsaW5rLCBmcm9tVmFsdWVPZik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbVJlc291cmNlTWV0aG9kKCkgeworICAgICAgICBMaW5rIGxpbmsgPSBMaW5rLmZyb21NZXRob2QoUmVzb3VyY2UuY2xhc3MsICJwcm9kdWNlc1htbCIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJvZHVjZXN4bWwiLCBsaW5rLmdldFVyaSgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbGltaXRlcnMoKSB7CisgICAgICAgIExpbmsuQnVpbGRlciBidWlsZGVyID0gTGluay5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwIik7CisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9ICJwYXJhbTF2YWx1ZTEgICAgcGFyYW0xdmFsdWUyIjsKKyAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIucGFyYW0oInBhcmFtMSIsIHZhbHVlKTsKKyAgICAgICAgTGluayBsaW5rID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IGxpbmsuZ2V0UGFyYW1zKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgcGFyYW1zLmdldCgicGFyYW0xIikpOworICAgIH0KKworICAgIEBQYXRoKCJsaW5rdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5rVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFVSSSB0ZXN0MSA9IFVSSS5jcmVhdGUodXJpSW5mby5nZXRBYnNvbHV0ZVBhdGgoKS50b1N0cmluZygpICsgInRlc3QxIik7CisgICAgICAgICAgICBVUkkgdGVzdDIgPSBVUkkuY3JlYXRlKHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoKCkudG9TdHJpbmcoKSArICJ0ZXN0MiIpOworCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKQorICAgICAgICAgICAgICAgICAgICAubGluaygiaHR0cDovL29yYWNsZS5jb20iLCAicGFyZW50IikKKyAgICAgICAgICAgICAgICAgICAgLmxpbmsobmV3IFVSSSgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpLCAiZnJhbWV3b3JrIikKKyAgICAgICAgICAgICAgICAgICAgLmxpbmtzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmsuZnJvbVVyaSh1cmlJbmZvLnJlbGF0aXZpemUodGVzdDEpKS5yZWwoInRlc3QxIikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rLmZyb21VcmkodGVzdDIpLnJlbCgidGVzdDIiKS5idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmsuZnJvbVVyaSh1cmlJbmZvLnJlbGF0aXZpemUoVVJJLmNyZWF0ZSgibGlua3Rlc3QvdGVzdDMiKSkpLnJlbCgidGVzdDMiKS5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgICkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2ltcGxlTGlua1Rlc3QoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIi9saW5rdGVzdC8iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworCisgICAgICAgIGZpbmFsIFVSSSB0YXJnZXRVcmkgPSB0YXJnZXQuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TGluaygicGFyZW50IikuZ2V0VXJpKCksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL29yYWNsZS5jb20iKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldExpbmsoImZyYW1ld29yayIpLmdldFVyaSgpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TGluaygidGVzdDEiKS5nZXRVcmkoKSwgZXF1YWxUbyhVcmlUZW1wbGF0ZS5yZXNvbHZlKHRhcmdldFVyaSwgInRlc3QxIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRMaW5rKCJ0ZXN0MiIpLmdldFVyaSgpLCBlcXVhbFRvKFVyaVRlbXBsYXRlLnJlc29sdmUodGFyZ2V0VXJpLCAidGVzdDIiKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldExpbmsoInRlc3QzIikuZ2V0VXJpKCksIGVxdWFsVG8oVXJpVGVtcGxhdGUucmVzb2x2ZSh0YXJnZXRVcmksICJ0ZXN0MyIpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL01lc3NhZ2VCb2R5RXhjZXB0aW9uV3JhcHBpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvTWVzc2FnZUJvZHlFeGNlcHRpb25XcmFwcGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVkMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL01lc3NhZ2VCb2R5RXhjZXB0aW9uV3JhcHBpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVNvdXJjZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IHN0YXRpYyBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5LmVudGl0eTsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keUV4Y2VwdGlvbldyYXBwaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgZmFpbCBvZiBtZXNzYWdlIGJvZHkgd3JpdGVyIGNhdXNlcyB0aHJvd2luZyBleGNlcHRpb24uIFByZXZpb3VzbHkgdGhlCisgICAgICogZXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIGFuZCA1MDAgc3RhdHVzIGNvZGUgd2FzIHJldHVybmVkIGluIHRoZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcmFwcGluZygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBTdHJlYW1Tb3VyY2Ugc291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig1NTUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNvdXJjZS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHNvdXJjZSwgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpKTsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiBleHBlY3RlZCwgaW5zdGVhZCByZXNwb25zZSB3aXRoICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSArICIgc3RhdHVzIGhhcyBiZWVuIHJldHVybmVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jbGFzcywgZS5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDU1NSwgKChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgZS5nZXRDYXVzZSgpKS5nZXRSZXNwb25zZSgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciByZXByb2R1Y2luZyBKRVJTRVktMTk5MC4KKyAgICAgKi8KKyAgICBAUHJvZHVjZXMoInRleHQvZm9vIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRocm93aW5nVXBQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4sIE1lc3NhZ2VCb2R5UmVhZGVyPFN0cmluZz4geworICAgICAgICBwdWJsaWMgdm9sYXRpbGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SW52b2NhdGlvbkNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgICAgICBmaW5hbCBSdW50aW1lRXhjZXB0aW9uIHVwID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oImx1bmNoIik7CisgICAgICAgICAgICB0aHJvdyB1cDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGhhdmUgZXZlciBiZWVuIGNhbGxlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAgICAgZmluYWwgUnVudGltZUV4Y2VwdGlvbiB1cCA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJkaW5uZXIiKTsKKyAgICAgICAgICAgIHRocm93IHVwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZyb20oQ2xhc3M8U3RyaW5nPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgaGF2ZSBldmVyIGJlZW4gY2FsbGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE5OTAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWJ3SGFuZGxpbmdFeGNlcHRpb25JbklzUmVhZGFibGVXcml0YWJsZSgpIHsKKyAgICAgICAgVGhyb3dpbmdVcFByb3ZpZGVyIHRocm93aW5nVXBQcm92aWRlciA9IG5ldyBUaHJvd2luZ1VwUHJvdmlkZXIoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPQorICAgICAgICAgICAgICAgIHRhcmdldCgidGVzdCIpLnJlZ2lzdGVyKHRocm93aW5nVXBQcm92aWRlcikucmVxdWVzdCgidGV4dC9mb28iKS5wb3N0KGVudGl0eSgiaGVsbG8iLCAidGV4dC9mb28iKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdGhyb3dpbmdVcFByb3ZpZGVyLmdldEludm9jYXRpb25Db3VudCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL0h1Z2VFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9IdWdlRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmUwYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9IdWdlRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LlJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuSmRrQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCB0byBtYWtlIHN1cmUgaHVnZSBlbnRpdHkgZ2V0cyBjaHVuay1lbmNvZGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSHVnZUVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfTEVOR1RIID0gMTAyNCAqIDEwMjQ7IC8vIDFNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBIVUdFX0RBVEFfTEVOR1RIID0gMjBMICogMTAyNEwgKiAxMDI0TCAqIDEwMjRMOyAvLyAyMEcgc2VlbXMgc3VmZmljaWVudAorCisgICAgLyoqCisgICAgICogSkVSU0VZLTIzMzcgcmVwcm9kdWNlci4gVGhlIHJlc291cmNlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHJpZ2h0IGFtb3VudCBvZiBkYXRhCisgICAgICogaXMgYmVpbmcgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50IGFuZCBhbHNvIGdpdmVzIHVzIGFiaWxpdHkgdG8gY2hlY2sgd2UgcmVjZWl2ZQorICAgICAqIGNvcnJlY3QgZGF0YS4KKyAgICAgKi8KKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25zdW1lclJlc291cmNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGJhY2sgdGhlIGNvdW50IG9mIGJ5dGVzIHJlY2VpdmVkLgorICAgICAgICAgKiBUaGlzIHdheSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gY29uc3VtZSBhIGh1Z2UgYW1vdW50IG9mIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic2l6ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgbG9uZyB0b3RhbEJ5dGVzUmVhZCA9IDBMOworCisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX0xFTkdUSF07CisgICAgICAgICAgICBpbnQgcmVhZDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZWFkID0gaW4ucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChyZWFkID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSByZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHJlYWQgIT0gLTEpOworCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodG90YWxCeXRlc1JlYWQpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImVjaG8iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlcjsKKworICAgIHB1YmxpYyBIdWdlRW50aXR5VGVzdChDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlcikgeworICAgICAgICB0aGlzLmNvbm5lY3RvclByb3ZpZGVyID0gY29ubmVjdG9yUHJvdmlkZXI7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDw/IGV4dGVuZHMgQ29ubmVjdG9yUHJvdmlkZXI+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCksIG5ldyBKZGtDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENvbnN1bWVyUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihUZXN0RW50aXR5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORywgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQ0hVTktFRCk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RW50aXR5IHsKKworICAgICAgICBmaW5hbCBsb25nIHNpemU7CisKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkobG9uZyBzaXplKSB7CisgICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSB3cml0ZXIgdGhhdCBnZW5lcmF0ZXMgdGhhdCBtYW55IHplcm8gYnl0ZXMgYXMgZ2l2ZW4gYnkgdGhlIGlucHV0IGVudGl0eSBzaXplIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEVudGl0eVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFRlc3RFbnRpdHk+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBUZXN0RW50aXR5LmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoVGVzdEVudGl0eSB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsgLy8gbm8gbWF0dGVyIHdoYXQgd2UgcmV0dXJuIGhlcmUsIHRoZSBvdXRwdXQgd2lsbCBnZXQgY2h1bmstZW5jb2RlZAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oVGVzdEVudGl0eSB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfTEVOR1RIXTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyQ291bnQgPSB0LnNpemUgLyBCVUZGRVJfTEVOR1RIOworICAgICAgICAgICAgZmluYWwgaW50IHJlbWFpbmRlciA9IChpbnQpICh0LnNpemUgJSBCVUZGRVJfTEVOR1RIKTsKKworICAgICAgICAgICAgZm9yIChsb25nIGIgPSAwOyBiIDwgYnVmZmVyQ291bnQ7IGIrKykgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShidWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVtYWluZGVyID4gMCkgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShidWZmZXIsIDAsIHJlbWFpbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMjMzNyByZXByb2R1Y2VyLiBXZSBhcmUgZ29pbmcgdG8gc2VuZCBodWdlIGFtb3VudCBvZiBkYXRhIG92ZXIgdGhlIHdpcmUuCisgICAgICogU2hvdWxkIG5vdCB0aGUgZGF0YSBoYXZlIGJlZW4gY2h1bmstZW5jb2RlZCwgd2Ugd291bGQgZWFzaWx5IHJ1biBvdXQgb2YgbWVtb3J5LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3NpemUiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBUZXN0RW50aXR5KEhVR0VfREFUQV9MRU5HVEgpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUpKTsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoTG9uZy5wYXJzZUxvbmcoY29udGVudCksIGVxdWFsVG8oSFVHRV9EQVRBX0xFTkdUSCkpOworCisgICAgICAgIC8vIGp1c3QgdG8gY2hlY2sgdGhlIHJpZ2h0IGRhdGEgaGF2ZSBiZWVuIHRyYW5zZmVyZWQuCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCIvZWNobyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJIZXkgU3luYyEiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJIZXkgU3luYyEiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkVSU0VZLTIzMzcgcmVwcm9kdWNlci4gV2UgYXJlIGdvaW5nIHRvIHNlbmQgaHVnZSBhbW91bnQgb2YgZGF0YSBvdmVyIHRoZSB3aXJlLiBUaGlzIHRpbWUgaW4gYW4gYXN5bmMgZmFzaGlvbi4KKyAgICAgKiBTaG91bGQgbm90IHRoZSBkYXRhIGhhdmUgYmVlbiBjaHVuay1lbmNvZGVkLCB3ZSB3b3VsZCBlYXNpbHkgcnVuIG91dCBvZiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1Bvc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRnV0dXJlPFJlc3BvbnNlPiByZXNwb25zZSA9IHRhcmdldCgiL3NpemUiKS5yZXF1ZXN0KCkuYXN5bmMoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IFRlc3RFbnRpdHkoSFVHRV9EQVRBX0xFTkdUSCksIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudCA9IHJlc3BvbnNlLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChMb25nLnBhcnNlTG9uZyhjb250ZW50KSwgZXF1YWxUbyhIVUdFX0RBVEFfTEVOR1RIKSk7CisKKyAgICAgICAgLy8ganVzdCB0byBjaGVjayB0aGUgcmlnaHQgZGF0YSBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoIi9lY2hvIikucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkudGV4dCgiSGV5IEFzeW5jISIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIkhleSBBc3luYyEiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3IvTWV0aG9kVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3IvTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZDJkMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9NZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhlIEh0dHAgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBLb3ByaXZhCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTWV0aG9kVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAidGVzdCI7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHR0cE1ldGhvZFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAUFVUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHV0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAREVMRVRFCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVsZXRlKCkgeworICAgICAgICAgICAgcmV0dXJuICJERUxFVEUiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlcjsKKworICAgIHB1YmxpYyBNZXRob2RUZXN0KENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyKSB7CisgICAgICAgIHRoaXMuY29ubmVjdG9yUHJvdmlkZXIgPSBjb25uZWN0b3JQcm92aWRlcjsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PD8gZXh0ZW5kcyBDb25uZWN0b3JQcm92aWRlcj4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSwgbmV3IEpka0Nvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSHR0cE1ldGhvZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIoY29ubmVjdG9yUHJvdmlkZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiUE9TVCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUE9TVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5lbnRpdHkoIlBVVCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUFVUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5kZWxldGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJERUxFVEUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vQXV0b0Rpc2NvdmVyYWJsZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vQXV0b0Rpc2NvdmVyYWJsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzBiN2MzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9BdXRvRGlzY292ZXJhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogTm90ZTogQXV0by1kaXNjb3ZlcmFibGVzIGZyb20gdGhpcyB0ZXN0ICJhZmZlY3RzIiBhbGwgb3RoZXIgdGVzdHMgaW4gc3VpdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEF1dG9EaXNjb3ZlcmFibGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFkgPSAiQXV0b0Rpc2NvdmVyYWJsZVRlc3QiOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tb25BdXRvRGlzY292ZXJhYmxlIGltcGxlbWVudHMgQXV0b0Rpc2NvdmVyYWJsZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICAvLyBSZXR1cm4gaWYgUFJPUEVSVFkgaXMgbm90IHRydWUgLSBhcHBsaWNhYmxlIGZvciBvdGhlciB0ZXN0cy4KKyAgICAgICAgICAgIGlmICghUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KFBST1BFUlRZKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IFdyaXRlckludGVyY2VwdG9yKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1jb21tb24iKTsKKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLkNMSUVOVCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEF1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBBdXRvRGlzY292ZXJhYmxlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIFJldHVybiBpZiBQUk9QRVJUWSBpcyBub3QgdHJ1ZSAtIGFwcGxpY2FibGUgZm9yIG90aGVyIHRlc3RzLgorICAgICAgICAgICAgaWYgKCFQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWNsaWVudCIpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcnZlckF1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBBdXRvRGlzY292ZXJhYmxlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIFJldHVybiBpZiBQUk9QRVJUWSBpcyBub3QgdHJ1ZSAtIGFwcGxpY2FibGUgZm9yIG90aGVyIHRlc3RzLgorICAgICAgICAgICAgaWYgKCFQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLXNlcnZlciIpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKS5wcm9wZXJ0eShQUk9QRVJUWSwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KFBST1BFUlRZLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlQ29uc3RyYWluZWRUbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJ2YWx1ZSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlLWNvbW1vbi1jbGllbnQtY29tbW9uLXNlcnZlciIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Db25zdHJhaW5lZFRvVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Db25zdHJhaW5lZFRvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YmJjNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0NvbnN0cmFpbmVkVG9UZXN0LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBwcm92aWRlcnMgYXJlIGNvcnJlY3RseSB2YWxpZGF0ZWQgaW4gdGhlIGNsaWVudCBydW50aW1lIChmb3IgZXhhbXBsZSBpZiBwcm92aWRlciBjb25zdHJhaW5lZCB0bworICogc2VydmVyIHJ1bnRpbWUgaXMgc2tpcHBlZCBpbiB0aGUgY2xpZW50KS4KKworICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIENvbnN0cmFpbmVkVG9UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRXaXRoUHJvdmlkZXJDbGFzc2VzKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZyhDbGllbnRGaWx0ZXJDb25zdHJhaW5lZFRvU2VydmVyLmNsYXNzLAorICAgICAgICAgICAgICAgIENsaWVudEZpbHRlckNvbnN0cmFpbmVkVG9DbGllbnQuY2xhc3MsIENsaWVudEZpbHRlci5jbGFzcykpOworCisgICAgICAgIF90ZXN0RmlsdGVycyhjbGllbnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFdpdGhQcm92aWRlckluc3RhbmNlcygpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcobmV3IENsaWVudEZpbHRlckNvbnN0cmFpbmVkVG9TZXJ2ZXIoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb0NsaWVudCgpLCBuZXcgQ2xpZW50RmlsdGVyKCkpKTsKKworICAgICAgICBfdGVzdEZpbHRlcnMoY2xpZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RGaWx0ZXJzKENsaWVudCBjbGllbnQpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImNhbGxlZCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb0NsaWVudCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiY2FsbGVkIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJDbGllbnRGaWx0ZXIiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKCJUaGUgQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb1NlcnZlciBzaG91bGQgbm90IGJlIGNhbGxlZCBhcyBpdCBpcyBjb25zdHJhaW5lZCB0byBzZXJ2ZXIuIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkNsaWVudEZpbHRlckNvbnN0cmFpbmVkVG9TZXJ2ZXIiKSk7CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuQ0xJRU5UKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb0NsaWVudCBpbXBsZW1lbnRzIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIkNsaWVudEZpbHRlckNvbnN0cmFpbmVkVG9DbGllbnQiLCAiY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIkNsaWVudEZpbHRlciIsICJjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyb25nIGNvbmZpZ3VyYXRpb24gb2YgQ2xpZW50IGZpbHRlciB3aGljaCBpcyBjb25zdHJhaW5lZCB0byBzZXJ2ZXIuIFRoaXMgZmlsdGVyIHdpbGwgYmUgbmV2ZXIgY2FsbGVkLgorICAgICAqLworICAgIEBDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEZpbHRlckNvbnN0cmFpbmVkVG9TZXJ2ZXIgaW1wbGVtZW50cyBDbGllbnRSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJDbGllbnRGaWx0ZXJDb25zdHJhaW5lZFRvU2VydmVyIiwgImNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vQ29udGVudExlbmd0aFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vQ29udGVudExlbmd0aFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTg3ODVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Db250ZW50TGVuZ3RoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29udGVudExlbmd0aFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNUUiA9ICJzdHJpbmciOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmMucmVnaXN0ZXJDbGFzc2VzKE15VHlwZVJlc291cmNlLmNsYXNzLCBNeVR5cGVXcml0ZXIuY2xhc3MsIFJlc291cmNlR2V0Qnl0ZU5vSGVhZC5jbGFzcyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VHlwZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBzID0gU1RSOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VHlwZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBNeVR5cGUgZ2V0TXlUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNeVR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUeXBlV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TXlUeXBlPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IGFDbGFzcywgVHlwZSB0eXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBhQ2xhc3MuZXF1YWxzKE15VHlwZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShNeVR5cGUgbXlUeXBlLCBDbGFzczw/PiBhQ2xhc3MsIFR5cGUgdHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gbXlUeXBlLnMubGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhNeVR5cGUgbXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGFDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IHN0cmluZ09iamVjdE11bHRpdmFsdWVkTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKG15VHlwZS5zLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudExlbmd0aEN1c3RvbVdyaXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFIubGVuZ3RoKCksIEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKSkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkQ29udGVudExlbmd0aEN1c3RvbVdyaXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5oZWFkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUi5sZW5ndGgoKSwgSW50ZWdlci5wYXJzZUludChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2J5dGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VHZXRCeXRlTm9IZWFkIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiLmdldEJ5dGVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCeXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYnl0ZSIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBJbnRlZ2VyLnBhcnNlSW50KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZEJ5dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJieXRlIikucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgSW50ZWdlci5wYXJzZUludChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0NvbnRlbnRUeXBlVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Db250ZW50VHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDY1ZjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Db250ZW50VHlwZVRlc3QuamF2YQpAQCAtMCwwICsxLDI1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZW50VHlwZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbnRlbnRUeXBlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFBhdGgodmFsdWUgPSAiL0NvbnRlbnRUeXBlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRlbnRUeXBlUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWRQYXJhbWV0ZXJzIikKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdFRlc3QoZmluYWwgU3RyaW5nIHN0cikgeworICAgICAgICAgICAgLy8gSWdub3JlIHRvIGdlbmVyYXRlIHJlc3BvbnNlIDIwNCAtIE5vQ29udGVudC4KKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjaGFuZ2VUZXN0IikKKyAgICAgICAgQFByb2R1Y2VzKCJmb28vYmFyIikKKyAgICAgICAgQEN0Rml4KENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2hhbmdlQ29udGVudFR5cGVUZXN0KFN0cmluZyBlY2hvKSB7CisgICAgICAgICAgICByZXR1cm4gZWNobzsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJudWxsLWNvbnRlbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHByb2Nlc3MoQEhlYWRlclBhcmFtKEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSkgU3RyaW5nIG1lZGlhVHlwZSwgQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICByZXR1cm4gbWVkaWFUeXBlICsgIi0iICsgcmVxdWVzdC5oYXNFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBpbnRlcmZhY2UgQ3RGaXggeworCisgICAgICAgIENsYXNzPD8gc3VwZXIgQ29udGVudFR5cGVGaXhQcm92aWRlcj4gdmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRlbnRUeXBlRml4UHJvdmlkZXIKKyAgICAgICAgICAgIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaWx0ZXIxIik7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VDb250ZXh0LmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmb28vYmFyIikpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIE1lZGlhVHlwZS5URVhUX1BMQUlOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmlsdGVyMiIpOworICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoImZvby9iYXIiKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIE1lZGlhVHlwZS5URVhUX1BMQUlOKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVhZGVyIik7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpLmVxdWFscygiZm9vL2JhciIpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRlbnRUeXBlRml4RmVhdHVyZSBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbmFsIEN0Rml4IGFubm90YXRpb24gPSByZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKS5nZXRBbm5vdGF0aW9uKEN0Rml4LmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKENvbnRlbnRUeXBlRml4UHJvdmlkZXIuY2xhc3MsIGFubm90YXRpb24udmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImZvby9iYXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vQmFyU3RyaW5nV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzICYmIG1lZGlhVHlwZS50b1N0cmluZygpLmVxdWFscygiZm9vL2JhciIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHMubGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTdHJpbmcgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUocy5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ2xhc3NlcyhDb250ZW50VHlwZVJlc291cmNlLmNsYXNzLCBDb250ZW50VHlwZUZpeEZlYXR1cmUuY2xhc3MsIEZvb0JhclN0cmluZ1dyaXRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJJbnN0YW5jZXMobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudFR5cGVIZWFkZXJGb3JOb0NvbnRlbnRSZXNwb25zZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJDb250ZW50VHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydE51bGwocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJDb250ZW50LVR5cGUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENvbnRlbnRUeXBlSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKGdldEJhc2VVcmkoKS50b1N0cmluZygpICsgIkNvbnRlbnRUeXBlIik7CisgICAgICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgInRleHQvcGxhaW4iKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJeXl4iKTsKKworICAgICAgICBjb25uZWN0aW9uLnNldERvT3V0cHV0KHRydWUpOworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCJIZWxsb1dvcmxkISIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQ29udGVudFR5cGVIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldDsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgLy8gZmlsdGVyIHRlc3QKKyAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiQ29udGVudFR5cGUiKS5wYXRoKCJjaGFuZ2VUZXN0Iik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihDb250ZW50VHlwZUZpeFByb3ZpZGVyLmNsYXNzLCBDbGllbnRSZXNwb25zZUZpbHRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRm9vQmFyU3RyaW5nV3JpdGVyLmNsYXNzKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldAorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ0ZXN0IiwgImZvby9iYXIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIC8vIGludGVyY2VwdG9yIHRlc3QKKyAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiQ29udGVudFR5cGUiKS5wYXRoKCJjaGFuZ2VUZXN0Iik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihDb250ZW50VHlwZUZpeFByb3ZpZGVyLmNsYXNzLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRm9vQmFyU3RyaW5nV3JpdGVyLmNsYXNzKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldAorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ0ZXN0IiwgImZvby9iYXIiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLnZhbHVlT2YoImZvby9iYXIiKSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5UG9zdFJlcXVlc3RXaXRoQ29udGVudFR5cGUoKSB7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIkNvbnRlbnRUeXBlL251bGwtY29udGVudCIpLnJlcXVlc3QoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImZvby9iYXIiKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImZvby9iYXItZmFsc2UiLCByZXNwb25zZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9EZXRlcm1pbmVDb250ZW50TGVuZ3RoVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9EZXRlcm1pbmVDb250ZW50TGVuZ3RoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Y2FiMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0RldGVybWluZUNvbnRlbnRMZW5ndGhUZXN0LmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBkZXRlcm1pbmluZyBvZiB0aGUgY29udGVudCBsZW5ndGguCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgRGV0ZXJtaW5lQ29udGVudExlbmd0aFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMjA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFIwID0gIiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSNiA9ICIxMjM0NTYiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUjEyID0gIjEyMzQ1Njc4OUFCQyI7CisKKyAgICBAUGF0aCgicm9vdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiNiIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0NigpIHsKKyAgICAgICAgICAgIHJldHVybiBTVFI2OworICAgICAgICB9CisKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIwIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQwKCkgeworICAgICAgICAgICAgcmV0dXJuIFNUUjA7CisgICAgICAgIH0KKworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFBhdGgoIjEyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQ1KCkgeworICAgICAgICAgICAgcmV0dXJuIFNUUjEyOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInRlc3QiKQorICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RMZW5ndGgoU3RyaW5nIGVudGl0eSwgQERlZmF1bHRWYWx1ZSgiLTEiKSBASGVhZGVyUGFyYW0oSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpIFN0cmluZyBsZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMzAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG91YmxlSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciwgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvbGQgPSBjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0obmV3IE91dHB1dFN0cmVhbSgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBvbGQud3JpdGUoYik7CisgICAgICAgICAgICAgICAgICAgIG9sZC53cml0ZShiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0ob2xkKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gb2xkID0gY29udGV4dC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG5ldyBJbnB1dFN0cmVhbSgpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG9sZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIERvdWJsZUludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIsIEJVRkZFUl9TSVpFKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDb21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiwgQlVGRkVSX1NJWkUpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoRG91YmxlSW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDAoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicm9vdC8wIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIE9iamVjdCBoZWFkZXJDb250ZW50TGVuZ3RoID0gSW50ZWdlci52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSMC5sZW5ndGgoKSAqIDIsIGhlYWRlckNvbnRlbnRMZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSMCwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkMCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyb290LzAiKS5yZXF1ZXN0KCkuaGVhZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIE9iamVjdCBoZWFkZXJDb250ZW50TGVuZ3RoID0gSW50ZWdlci52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSMC5sZW5ndGgoKSAqIDIsIGhlYWRlckNvbnRlbnRMZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicm9vdC82IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIE9iamVjdCBoZWFkZXJDb250ZW50TGVuZ3RoID0gSW50ZWdlci52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSNi5sZW5ndGgoKSAqIDIsIGhlYWRlckNvbnRlbnRMZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSNiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkNigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyb290LzYiKS5yZXF1ZXN0KCkuaGVhZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIE9iamVjdCBoZWFkZXJDb250ZW50TGVuZ3RoID0gSW50ZWdlci52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSNi5sZW5ndGgoKSAqIDIsIGhlYWRlckNvbnRlbnRMZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDEyKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJvb3QvMTIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgY2hlY2tFbXB0eUNvbnRlbnRMZW5ndGgocmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSMTIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZDEyKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJvb3QvMTIiKS5yZXF1ZXN0KCkuaGVhZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGNoZWNrRW1wdHlDb250ZW50TGVuZ3RoKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFbXB0eUNvbnRlbnRMZW5ndGgoUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlclN0cmluZyA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCk7CisgICAgICAgIGlmIChoZWFkZXJTdHJpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGhlYWRlckNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnZhbHVlT2YoaGVhZGVyU3RyaW5nKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSwgaGVhZGVyQ29udGVudExlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRMZW5ndGgwKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJvb3QvdGVzdCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoU1RSMCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFIwLmxlbmd0aCgpICogMiwgcmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRMZW5ndGg2KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJvb3QvdGVzdCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoU1RSNiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFI2Lmxlbmd0aCgpICogMiwgcmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKS5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRMZW5ndGgxMigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyb290L3Rlc3QiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KFNUUjEyLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCByZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpLmludFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vRW5jb2RpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0VuY29kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNGNlOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0VuY29kaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmZpbHRlci5FbmNvZGluZ0ZpbHRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLkRlZmxhdGVFbmNvZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuR1ppcEVuY29kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEVuY29kaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVjaG9SZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIEVjaG9SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLkVuY29kaW5nRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIEdaaXBFbmNvZGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIERlZmxhdGVFbmNvZGVyLmNsYXNzCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R1ppcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QobmV3IFRlc3RTcGVjKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZGVjb2RlKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdaSVBJbnB1dFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrSGVhZGVyc0FuZFN0YXR1cyhSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ3ppcCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludm9jYXRpb24uQnVpbGRlciBzZXRIZWFkZXJzKEludm9jYXRpb24uQnVpbGRlciBpbnZCdWlsZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludkJ1aWxkZXIuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORywgImd6aXAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QobmV3IFRlc3RTcGVjKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZGVjb2RlKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZmxhdGVySW5wdXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0hlYWRlcnNBbmRTdGF0dXMoUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmxhdGUiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ09OVEVOVF9FTkNPRElORykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uLkJ1aWxkZXIgc2V0SGVhZGVycyhJbnZvY2F0aW9uLkJ1aWxkZXIgaW52QnVpbGRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnZCdWlsZGVyLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcsICJkZWZsYXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdaaXBQcmVmZXJyZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0KG5ldyBUZXN0U3BlYygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGRlY29kZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHWklQSW5wdXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0hlYWRlcnNBbmRTdGF0dXMoUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIngtZ3ppcCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludm9jYXRpb24uQnVpbGRlciBzZXRIZWFkZXJzKEludm9jYXRpb24uQnVpbGRlciBpbnZCdWlsZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludkJ1aWxkZXIuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORywgImRlZmxhdGU7IHE9LjUsIHgtZ3ppcCIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHWmlwQ2xpZW50U2VydmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdChuZXcgVGVzdFNwZWMoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBXZWJUYXJnZXQgY29uZmlndXJlKFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQucmVnaXN0ZXIoR1ppcEVuY29kZXIuY2xhc3MpLnJlZ2lzdGVyKEVuY29kaW5nRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrSGVhZGVyc0FuZFN0YXR1cyhSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ3ppcCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmxhdGVQcmVmZXJyZWRDbGllbnRTZXJ2ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0KG5ldyBUZXN0U3BlYygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludm9jYXRpb24uQnVpbGRlciBzZXRIZWFkZXJzKEludm9jYXRpb24uQnVpbGRlciBpbnZCdWlsZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludkJ1aWxkZXIuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORywgImRlZmxhdGUsZ3ppcD0uNSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBXZWJUYXJnZXQgY29uZmlndXJlKFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQucmVnaXN0ZXIoRGVmbGF0ZUVuY29kZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoR1ppcEVuY29kZXIuY2xhc3MpLnJlZ2lzdGVyKEVuY29kaW5nRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrSGVhZGVyc0FuZFN0YXR1cyhSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZGVmbGF0ZSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KFRlc3RTcGVjIHRlc3RTcGVjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaW5wdXQgPSAiaGVsbG8iOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RTcGVjLnNldEhlYWRlcnModGVzdFNwZWMuY29uZmlndXJlKHRhcmdldCgpKS5yZXF1ZXN0KCkpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LnRleHQoaW5wdXQpKTsKKyAgICAgICAgYnl0ZVtdIG91dHB1dCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoYnl0ZVtdLmNsYXNzKTsKKyAgICAgICAgdGVzdFNwZWMuY2hlY2tIZWFkZXJzQW5kU3RhdHVzKHJlc3BvbnNlKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gZGVjb2RlZCA9IHRlc3RTcGVjLmRlY29kZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0KSk7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtpbnB1dC5nZXRCeXRlcygpLmxlbmd0aF07CisgICAgICAgIGludCBsZW4gPSBkZWNvZGVkLnJlYWQocmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBkZWNvZGVkLnJlYWQoKSk7CisgICAgICAgIGRlY29kZWQuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0LmdldEJ5dGVzKCkubGVuZ3RoLCBsZW4pOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhpbnB1dC5nZXRCeXRlcygpLCByZXN1bHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RTcGVjIHsKKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGRlY29kZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEludm9jYXRpb24uQnVpbGRlciBzZXRIZWFkZXJzKEludm9jYXRpb24uQnVpbGRlciBpbnZCdWlsZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gaW52QnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBXZWJUYXJnZXQgY29uZmlndXJlKFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0hlYWRlcnNBbmRTdGF0dXMoUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVmYTJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Gb3JjZWRBdXRvRGlzY292ZXJhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogTm90ZTogQXV0by1kaXNjb3ZlcmFibGVzIGZyb20gdGhpcyB0ZXN0ICJhZmZlY3RzIiBhbGwgb3RoZXIgdGVzdHMgaW4gc3VpdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFkgPSAiRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZVRlc3QiOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tb25BdXRvRGlzY292ZXJhYmxlIGltcGxlbWVudHMgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICAvLyBSZXR1cm4gaWYgUFJPUEVSVFkgaXMgbm90IHRydWUgLSBhcHBsaWNhYmxlIGZvciBvdGhlciB0ZXN0cy4KKyAgICAgICAgICAgIGlmICghUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KFBST1BFUlRZKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IFdyaXRlckludGVyY2VwdG9yKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1jb21tb24iKTsKKworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLkNMSUVOVCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEF1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBGb3JjZWRBdXRvRGlzY292ZXJhYmxlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIFJldHVybiBpZiBQUk9QRVJUWSBpcyBub3QgdHJ1ZSAtIGFwcGxpY2FibGUgZm9yIG90aGVyIHRlc3RzLgorICAgICAgICAgICAgaWYgKCFQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWNsaWVudCIpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcnZlckF1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBGb3JjZWRBdXRvRGlzY292ZXJhYmxlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIFJldHVybiBpZiBQUk9QRVJUWSBpcyBub3QgdHJ1ZSAtIGFwcGxpY2FibGUgZm9yIG90aGVyIHRlc3RzLgorICAgICAgICAgICAgaWYgKCFQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLXNlcnZlciIpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIDEwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShQUk9QRVJUWSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoQ29tbW9uUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFX1NFUlZFUiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoQ29tbW9uUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEVfU0VSVkVSLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoUFJPUEVSVFksIHRydWUpCisgICAgICAgIC5wcm9wZXJ0eShDb21tb25Qcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRV9DTElFTlQsIHRydWUpCisgICAgICAgIC5wcm9wZXJ0eShDb21tb25Qcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEVfQ0xJRU5ULCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JjZWRBdXRvRGlzY292ZXJhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoInZhbHVlIikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygidmFsdWUtY29tbW9uLWNsaWVudC1jb21tb24tc2VydmVyIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vSGVhZGVyUGFyYW1UZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0hlYWRlclBhcmFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzI4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0hlYWRlclBhcmFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkZXJQYXJhbVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcywgTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBIZWFkZXJQYXJhbSgiaGVsbG8iKSBMaXN0PFN0cmluZz4gaGVhZGVycykgeworICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnMuc2l6ZSgpICsgIjoiICsgaGVhZGVyczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckxpc3RTaW5nbGVIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5oZWFkZXIoImhlbGxvIiwgIndvcmxkIikuaGVhZGVyKCJoZWxsbyIsICJ1bml2ZXJzZSIpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCIxOlt3b3JsZCx1bml2ZXJzZV0iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBtdWx0aSB2YWx1ZSBodHRwIGhlYWRlcnMgYXJlIGNvcnJlY3RseSByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyTGlzdE11bHRpcGxlSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTChnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJyZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgInRleHQvcGxhaW4iKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoImhlbGxvIiwgIndvcmxkIik7CisgICAgICAgIGNvbm5lY3Rpb24uYWRkUmVxdWVzdFByb3BlcnR5KCJoZWxsbyIsICJ1bml2ZXJzZSIpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQoZmFsc2UpOworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKworICAgICAgICBhc3NlcnRUaGF0KGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSkpLAorICAgICAgICAgICAgICAgIGVxdWFsVG8oIjI6W3dvcmxkLCB1bml2ZXJzZV0iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9IZWFkZXJWYWx1ZUV4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vSGVhZGVyVmFsdWVFeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdmNTMwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vSGVhZGVyVmFsdWVFeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIEhlYWRlclZhbHVlRXhjZXB0aW9uLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEhlYWRlclZhbHVlRXhjZXB0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNwb25zZUZpbHRlci5jbGFzcywgVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmJvdW5kSGVhZGVyVGhyb3dzRXhjZXB0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UvaW5ib3VuZCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoSHR0cEhlYWRlcnMuREFURSwgImZvbyIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgiaW5ib3VuZCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRib3VuZEhlYWRlclRocm93c0V4Y2VwdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlL291dGJvdW5kIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgib3V0Ym91bmQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0Ym91bmRSZXNwb25zZUhlYWRlclRocm93c0V4Y2VwdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlL291dGJvdW5kLVJlc3BvbnNlIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgib3V0Ym91bmQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyB0aGlzIGNhbGwgc2hvdWxkIHRocm93IEhlYWRlclZhbHVlRXhjZXB0aW9uIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIEhUVFAgNTAwIHJlc3BvbnNlCisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0RGF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJpbmJvdW5kIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0SW5ib3VuZChTdHJpbmcgZW50aXR5LCBAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgICAgICAvLyB0aGlzIGNhbGwgc2hvdWxkIHRocm93IEhlYWRlclZhbHVlRXhjZXB0aW9uIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIEhUVFAgNDAwIHJlc3BvbnNlCisgICAgICAgICAgICBoZWFkZXJzLmdldERhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgib3V0Ym91bmQiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdE91dGJvdW5kKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShlbnRpdHkpLmhlYWRlcihIdHRwSGVhZGVycy5EQVRFLCAiYmFyIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJvdXRib3VuZC1SZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0T3V0Ym91bmRSZXNwb25zZShTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLm9rKGVudGl0eSkuaGVhZGVyKEh0dHBIZWFkZXJzLkRBVEUsICJmb28iKS5idWlsZCgpOworICAgICAgICAgICAgLy8gdGhpcyBjYWxsIHNob3VsZCB0aHJvdyBIZWFkZXJWYWx1ZUV4Y2VwdGlvbiB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byBIVFRQIDUwMCByZXNwb25zZQorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0RGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9IazJCaW5kZXJTdXBwb3J0VGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9IazJCaW5kZXJTdXBwb3J0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2I2MTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0hrMkJpbmRlclN1cHBvcnRUZXN0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5iaW5kaW5nLkFic3RyYWN0QmluZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoYXQgSEsyQmluZGVyIGFuZCBKZXJzZXkgQmluZGVyIHdvcmsgdG9nZXRoZXIuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBIazJCaW5kZXJTdXBwb3J0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IEhrMkJpbmRlcigpKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBKZXJzZXlCaW5kZXIoKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2UoKSB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhrMkJpbmRlci5ISzJfSEVMTE9fTUVTU0FHRSArICIvIiArIEplcnNleUJpbmRlci5KRVJTRVlfSEVMTE9fTUVTU0FHRSwgcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGsyQmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEsyX0hFTExPX01FU1NBR0UgPSAiSGVsbG8gSEsyISI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoSEsyX0hFTExPX01FU1NBR0UpLnRvKFN0cmluZy5jbGFzcykubmFtZWQoImhrMiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVyc2V5QmluZGVyIGV4dGVuZHMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpFUlNFWV9IRUxMT19NRVNTQUdFID0gIkhlbGxvIEplcnNleSEiOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBiaW5kKEpFUlNFWV9IRUxMT19NRVNTQUdFKS50byhTdHJpbmcuY2xhc3MpLm5hbWVkKCJqZXJzZXkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJoZWxsb3dvcmxkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBATmFtZWQoImhrMiIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGhrMkhlbGxvOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQE5hbWVkKCJqZXJzZXkiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBqZXJzZXlIZWxsbzsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gaGsySGVsbG8gKyAiLyIgKyBqZXJzZXlIZWxsbzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTG9nZ2luZ0ZlYXR1cmVUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0xvZ2dpbmdGZWF0dXJlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNWU1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0xvZ2dpbmdGZWF0dXJlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmxlc3NUaGFuOworCisvKioKKyAqIHtAbGluayBMb2dnaW5nRmVhdHVyZX0gZW5kLXRvLWVuZCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoU3VpdGUuY2xhc3MpCitAU3VpdGUuU3VpdGVDbGFzc2VzKHsKKyAgICAgICAgTG9nZ2luZ0ZlYXR1cmVUZXN0LkNsaWVudFRlc3QuY2xhc3MsCisgICAgICAgIExvZ2dpbmdGZWF0dXJlVGVzdC5Db250YWluZXJUZXN0LmNsYXNzLAorICAgICAgICBMb2dnaW5nRmVhdHVyZVRlc3QuQ29udGFpbmVyQXV0b2Rpc2NvdmVyeVRlc3QuY2xhc3MsCisgICAgICAgIExvZ2dpbmdGZWF0dXJlVGVzdC5GaWx0ZXJzT3JkZXJUZXN0LmNsYXNzCit9KQorcHVibGljIGNsYXNzIExvZ2dpbmdGZWF0dXJlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0VSX05BTUUgPSAib3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5mZWF0dXJlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklOQVJZX01FRElBX1RZUEUgPSAiYXBwbGljYXRpb24vYmluYXJ5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRURJQV9UWVBFID0gTWVkaWFUeXBlLlRFWFRfUExBSU47CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJUaGlzIGVudGl0eSBtdXN0IChub3QpIGJlIGxvZ2dlZCI7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhCSU5BUllfTUVESUFfVFlQRSkKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEhlYWRlcnNBbmRCaW5hcnlQYXlsb2FkKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5vayhFTlRJVFkpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIjAwMSIsICJGaXJzdCBIZWFkZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCIwMDIiLCAiU2Vjb25kIEhlYWRlciBWYWx1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIjAwMyIsICJUaGlyZCBIZWFkZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCIwMDQiLCAiRm91cnRoIEhlYWRlciBWYWx1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIjAwNSIsICJGaWZ0aCBIZWFkZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCIvdGV4dCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKFRFWFRfTUVESUFfVFlQRSkKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEhlYWRlcnNBbmRUZXh0UGF5bG9hZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soRU5USVRZKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCIwMDEiLCAiRmlyc3QgSGVhZGVyIFZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiMDAyIiwgIlNlY29uZCBIZWFkZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCIwMDMiLCAiVGhpcmQgSGVhZGVyIFZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiMDA0IiwgIkZvdXJ0aCBIZWFkZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCIwMDUiLCAiRmlmdGggSGVhZGVyIFZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiL3RleHQiKQorICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoVEVYVF9NRURJQV9UWVBFKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdChTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5vayhFTlRJVFkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmFsIGNsaWVudCBzaWRlIHRlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLkZJTkUuaW50VmFsdWUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyQXNDbGllbnRSZXF1ZXN0RmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLmdldExvZ2dlcihMT0dHRVJfTkFNRSkpKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJSZXF1ZXN0TG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiMSAqIikpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyT2ZIZWFkZXJzT25DbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKExPR0dFUl9OQU1FKSkpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oRU5USVRZKSk7CisKKyAgICAgICAgICAgIGZpbmFsIExvZ1JlY29yZCByZWNvcmQgPSBnZXRMb2dnaW5nRmlsdGVyUmVzcG9uc2VMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVjb3JkLmdldE1lc3NhZ2UoKTsKKworICAgICAgICAgICAgaW50IGkgPSAxOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoMSA9ICIwMCIgKyBpKys7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGgyID0gIjAwIiArIGk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaTEgPSBtZXNzYWdlLmluZGV4T2YoaDEpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpMiA9IG1lc3NhZ2UuaW5kZXhPZihoMik7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KCJIZWFkZXIgIiArIGgxICsgIiBoYXMgYmVlbiBsb2dnZWQgc29vbmVyIHRoYW4gaGVhZGVyICIgKyBoMiwgaTEsIGxlc3NUaGFuKGkyKSk7CisgICAgICAgICAgICB9IHdoaWxlIChpIDwgNSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyYm9zaXR5QW55UGF5bG9hZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoTE9HR0VSX05BTUUpLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXQoMSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZyhFTlRJVFkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJib3NpdHlBbnlQYXlsb2FkU2V0VmVyYm9zaXR5QXNUZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLmdldExvZ2dlcihMT0dHRVJfTkFNRSkpKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWSwgIlBBWUxPQURfQU5ZIikKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgICAgIC8vIENvcnJlY3QgcmVzcG9uc2Ugc3RhdHVzLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICAgICAgLy8gQ2hlY2sgbG9ncyBmb3IgcHJvcGVyIGlkLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyTG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0KDEpLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoRU5USVRZKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyYm9zaXR5VGV4dFBheWxvYWRCaW5hcnlGaWx0ZXJlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoTE9HR0VSX05BTUUpLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9URVhUKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgICAgIC8vIENvcnJlY3QgcmVzcG9uc2Ugc3RhdHVzLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICAgICAgLy8gQ2hlY2sgbG9ncyBmb3IgcHJvcGVyIGlkLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyTG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0KDEpLmdldE1lc3NhZ2UoKSwgbm90KGNvbnRhaW5zU3RyaW5nKEVOVElUWSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJib3NpdHlUZXh0UGF5bG9hZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi90ZXh0IikKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKExPR0dFUl9OQU1FKSwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfVEVYVCkpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGxvZ3MgZm9yIHByb3BlciBpZC4KKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldCgxKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKEVOVElUWSkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFZlcmJvc2l0eUhlYWRlcnNQYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLmdldExvZ2dlcihMT0dHRVJfTkFNRSksIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFkpKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXQoMSkuZ2V0TWVzc2FnZSgpLCBub3QoY29udGFpbnNTdHJpbmcoRU5USVRZKSkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFBvc3RlZEVudGl0eUxvZ2dlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi90ZXh0IikKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKExPR0dFUl9OQU1FKSwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfVEVYVCkpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LnRleHQoRU5USVRZKSk7CisKKyAgICAgICAgICAgIC8vIENvcnJlY3QgcmVzcG9uc2Ugc3RhdHVzLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICAgICAgLy8gQ2hlY2sgbG9ncyBmb3IgcHJvcGVyIGlkLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyTG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0KDApLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoRU5USVRZKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYWwgY2xpZW50IHNpZGUgdGVzdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250YWluZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuRklORS5pbnRWYWx1ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShMb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUVfU0VSVkVSLCBMT0dHRVJfTkFNRSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZ2luZ0FzQ29udGFpbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGxvZ3MgZm9yIHByb3BlciBpZC4KKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlclJlcXVlc3RMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCIxICoiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJSZXNwb25zZUxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIjEgKiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nQXNDb250YWluZXJUZXh0UGF5bG9hZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgiL3RleHQiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgbG9ncyBmb3IgcHJvcGVyIGlkLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyUmVxdWVzdExvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIjEgKiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlclJlc3BvbnNlTG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiMSAqIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyTG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0KDEpLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoRU5USVRZKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZ2luZ0FzQ29udGFpbmVyQmluYXJ5UGF5bG9hZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworCisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJSZXF1ZXN0TG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiMSAqIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyUmVzcG9uc2VMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCIxICoiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXQoMSkuZ2V0TWVzc2FnZSgpLCBub3QoY29udGFpbnNTdHJpbmcoRU5USVRZKSkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFBvc3RlZEVudGl0eUxvZ2dlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi90ZXh0IikKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dChFTlRJVFkpKTsKKworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXQoMCkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZyhFTlRJVFkpKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhbCBjbGllbnQgc2lkZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRhaW5lckF1dG9kaXNjb3ZlcnlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuSU5GTy5pbnRWYWx1ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX1NFUlZFUiwgTE9HR0VSX05BTUUpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShMb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX1NFUlZFUiwgIklORk8iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJBc0NvbnRhaW5lckZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworCisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJSZXF1ZXN0TG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiMSAqIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyUmVzcG9uc2VMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCIxICoiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dSZWNvcmQgZ2V0TG9nZ2luZ0ZpbHRlclJlcXVlc3RMb2dSZWNvcmQoZmluYWwgTGlzdDxMb2dSZWNvcmQ+IHJlY29yZHMpIHsKKyAgICAgICAgcmV0dXJuIGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQocmVjb3JkcywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nUmVjb3JkIGdldExvZ2dpbmdGaWx0ZXJSZXNwb25zZUxvZ1JlY29yZChmaW5hbCBMaXN0PExvZ1JlY29yZD4gcmVjb3JkcykgeworICAgICAgICByZXR1cm4gZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChyZWNvcmRzLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nUmVjb3JkIGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZmluYWwgTGlzdDxMb2dSZWNvcmQ+IHJlY29yZHMsIGZpbmFsIGJvb2xlYW4gcmVxdWVzdFF1ZXJ5KSB7CisgICAgICAgIGZvciAoZmluYWwgTG9nUmVjb3JkIHJlY29yZCA6IGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQocmVjb3JkcykpIHsKKyAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKHJlcXVlc3RRdWVyeSA/ICJyZXF1ZXN0IiA6ICJyZXNwb25zZSIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5hYmxlIHRvIGZpbmQgcHJvcGVyIGxvZyByZWNvcmQuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxMb2dSZWNvcmQ+IGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZmluYWwgTGlzdDxMb2dSZWNvcmQ+IHJlY29yZHMpIHsKKyAgICAgICAgZmluYWwgTGlzdDxMb2dSZWNvcmQ+IGxvZ2dpbmdGaWx0ZXJSZWNvcmRzID0gbmV3IEFycmF5TGlzdDw+KHJlY29yZHMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKGZpbmFsIExvZ1JlY29yZCByZWNvcmQgOiByZWNvcmRzKSB7CisgICAgICAgICAgICBpZiAocmVjb3JkLmdldExvZ2dlck5hbWUoKS5zdGFydHNXaXRoKExPR0dFUl9OQU1FKSkgeworICAgICAgICAgICAgICAgIGxvZ2dpbmdGaWx0ZXJSZWNvcmRzLmFkZChyZWNvcmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvZ2dpbmdGaWx0ZXJSZWNvcmRzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyc09yZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBQcmlvcml0eSgxMDAwKQorICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21GaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyLCBDbGllbnRSZXNwb25zZUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9IRUFERVIgPSAiY3VzdG9tX2hlYWRlciI7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoQ1VTVE9NX0hFQURFUiwgImNsaWVudC9yZXF1ZXN0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKENVU1RPTV9IRUFERVIsICJjbGllbnQvcmVzcG9uc2UiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZChDVVNUT01fSEVBREVSLCAiY29udGFpbmVyL3JlcXVlc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoQ1VTVE9NX0hFQURFUiwgImNvbnRhaW5lci9yZXNwb25zZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuSU5GTy5pbnRWYWx1ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FLCBMT0dHRVJfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KExvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUwsICJJTkZPIikKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEN1c3RvbUZpbHRlci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyQXNDb250YWluZXJGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIENvcnJlY3QgcmVzcG9uc2Ugc3RhdHVzLgorICAgICAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQ3VzdG9tRmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoTE9HR0VSX05BTUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLklORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LkhFQURFUlNfT05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworCisgICAgICAgICAgICBmb3IgKExvZ1JlY29yZCByZWNvcmQgOiBnZXRMb2dnZWRSZWNvcmRzKCkpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVjb3JkLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC0tLSBjbGllbnQgcmVxdWVzdCBsb2cgZW50cnkKKyAgICAgICAgICAgIC8vIGNsaWVudCBhZGRlZCBoZWFkZXIgYmVmb3JlIHJlcXVlc3QgaGFzIHNlbnQgKGFuZCBsb2dnZWQpCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dlZFJlY29yZHMoKS5nZXQoMCkuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiMSA+IGN1c3RvbV9oZWFkZXI6IGNsaWVudC9yZXF1ZXN0XG4iKSk7CisKKworICAgICAgICAgICAgLy8gLS0tIGNvbnRhaW5lciByZXF1ZXN0IGxvZyBlbnRyeQorICAgICAgICAgICAgLy8gY29udGFpbmVyIHJlY2VpdmVzIGhlYWRlciBmcm9tIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dlZFJlY29yZHMoKS5nZXQoMSkuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiMSA+IGN1c3RvbV9oZWFkZXI6IGNsaWVudC9yZXF1ZXN0XG4iKSk7CisgICAgICAgICAgICAvLyBjb250YWluZXIgaGFzIGFkZGVkIGl0cyBvd24gaGVhZGVyIGFmdGVyIGxvZ2dpbmcgZmlsdGVyIGxvZ2dlZCBtZXNzYWdlCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dlZFJlY29yZHMoKS5nZXQoMSkuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICBub3QoY29udGFpbnNTdHJpbmcoIjEgPiBjdXN0b21faGVhZGVyOiBjb250YWluZXIvcmVxdWVzdFxuIikpKTsKKworCisgICAgICAgICAgICAvLyAtLS0gY29udGFpbmVyIHJlc3BvbnNlIGxvZyBlbnRyeQorICAgICAgICAgICAgLy8gY29udGFpbmVyIGFkZGVkIGhlYWRlciB0byB0aGUgcmVzcG9uc2UgYW5kIGl0IHdhcyBsb2dnZWQKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2VkUmVjb3JkcygpLmdldCgyKS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCIxIDwgY3VzdG9tX2hlYWRlcjogY29udGFpbmVyL3Jlc3BvbnNlXG4iKSk7CisKKyAgICAgICAgICAgIC8vIC0tLSBjbGllbnQgcmVzcG9uc2UgbG9nIGVudHJ5CisgICAgICAgICAgICAvLyBjbGllbnQgcmVjZWl2ZWQgaGVhZGVyCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dlZFJlY29yZHMoKS5nZXQoMykuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiMSA8IGN1c3RvbV9oZWFkZXI6IGNvbnRhaW5lci9yZXNwb25zZVxuIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnZWRSZWNvcmRzKCkuZ2V0KDMpLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgbm90KGNvbnRhaW5zU3RyaW5nKCIxIDwgY3VzdG9tX2hlYWRlcjogY2xpZW50L3Jlc3BvbnNlXG4iKSkpOworCisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTWVzc2FnZUJvZHlSZWFkZXJVbnN1cHBvcnRlZFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTWVzc2FnZUJvZHlSZWFkZXJVbnN1cHBvcnRlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQ0OTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9NZXNzYWdlQm9keVJlYWRlclVuc3VwcG9ydGVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciB1bnN1cHBvcnRlZCBtZWRpYSB0eXBlLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5UmVhZGVyVW5zdXBwb3J0ZWRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBUZXN0RW50aXR5UHJvdmlkZXIgbXVzdCBub3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgYXBwbGljYXRpb24gZm9yIHRoaXMgdGVzdCBjYXNlLgorICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHJlcXVlc3QgdG8gd2l0aCBhcHBsaWNhdGlvbi9qc29uIGNvbnRlbnQgdG8gc2VydmVyIHdoZXJlIEpzb25KYXhiQmluZGVyIGlzIG5vdCByZWdpc3RlcmVkLiBVTlNVUFBPUlRFRF9NRURJQV9UWVBFCisgICAgICogc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkTWVzc2FnZUJvZHlSZWFkZXIoKSB7CisgICAgICAgIGNsaWVudCgpLnJlZ2lzdGVyKG5ldyBUZXN0RW50aXR5UHJvdmlkZXIoKSk7CisgICAgICAgIFRlc3RFbnRpdHkgZW50aXR5ID0gbmV3IFRlc3RFbnRpdHkoInRlc3RFbnRpdHkiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdChUZXN0RW50aXR5UHJvdmlkZXIuVEVTVF9FTlRJVFlfVFlQRSkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KGVudGl0eSwgVGVzdEVudGl0eVByb3ZpZGVyLlRFU1RfRU5USVRZX1RZUEUpKTsKKworICAgICAgICAvLyBUZXN0RW50aXR5UHJvdmlkZXIgaXMgbm90IHJlZ2lzdGVyZWQgb24gdGhlIHNlcnZlciBhbmQgdGhlcmVmb3JlIHRoZSBzZXJ2ZXIgc2hvdWxkIHJldHVybiBVTlNVUFBPUlRFRF9NRURJQV9UWVBFCisgICAgICAgIGFzc2VydEVxdWFscyhTdGF0dXMuVU5TVVBQT1JURURfTUVESUFfVFlQRS5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoUmVzb3VyY2UubWV0aG9kQ2FsbGVkKTsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlRW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKChyZXNwb25zZUVudGl0eSA9PSBudWxsKSB8fCAocmVzcG9uc2VFbnRpdHkubGVuZ3RoKCkgPT0gMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgUmVzb3VyY2UgY2xhc3MuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgICAgICovCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gbWV0aG9kQ2FsbGVkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgcHJvZHVjaW5nIGEge0Bjb2RlIG51bGx9IHJlc3VsdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVudGl0eSB0ZXN0IGVudGl0eS4KKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqLworICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoVGVzdEVudGl0eVByb3ZpZGVyLlRFU1RfRU5USVRZKQorICAgICAgICBAQ29uc3VtZXMoVGVzdEVudGl0eVByb3ZpZGVyLlRFU1RfRU5USVRZKQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkUGFyYW1ldGVycyIpCisgICAgICAgIHB1YmxpYyBUZXN0RW50aXR5IHByb2Nlc3NFbnRpdHlBbmRQcm9kdWNlTnVsbChUZXN0RW50aXR5IGVudGl0eSkgeworICAgICAgICAgICAgbWV0aG9kQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBiZWFuLgorICAgICAqCisgICAgICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEVudGl0eSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyB0ZXN0IGVudGl0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlIGVudGl0eSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUZXN0RW50aXR5KFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSB0ZXN0IGVudGl0eSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBAUHJvZHVjZXMoInRlc3QvZW50aXR5IikKKyAgICBAQ29uc3VtZXMoInRlc3QvZW50aXR5IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RFbnRpdHlQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFRlc3RFbnRpdHk+LCBNZXNzYWdlQm9keVdyaXRlcjxUZXN0RW50aXR5PiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IGJlYW4gbWVkaWEgdHlwZSBzdHJpbmcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0VOVElUWSA9ICJ0ZXN0L2VudGl0eSI7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IGJlYW4gbWVkaWEgdHlwZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVkaWFUeXBlIFRFU1RfRU5USVRZX1RZUEUgPSBNZWRpYVR5cGUudmFsdWVPZihURVNUX0VOVElUWSk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVGVzdEVudGl0eS5jbGFzcyA9PSB0eXBlICYmIFRFU1RfRU5USVRZX1RZUEUuZXF1YWxzKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkgcmVhZEZyb20oQ2xhc3M8VGVzdEVudGl0eT4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RFbnRpdHkoUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBUZXN0RW50aXR5LmNsYXNzID09IHR5cGUgJiYgVEVTVF9FTlRJVFlfVFlQRS5lcXVhbHMobWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFRlc3RFbnRpdHkgdGVzdEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFRlc3RFbnRpdHkgdGVzdEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgUmVhZGVyV3JpdGVyLndyaXRlVG9Bc1N0cmluZyh0ZXN0RW50aXR5LmdldFZhbHVlKCksIGVudGl0eVN0cmVhbSwgbWVkaWFUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9NZXNzYWdlQm9keVdvcmtlckluaGVyaXRhbmNlVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9NZXNzYWdlQm9keVdvcmtlckluaGVyaXRhbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDJmYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL01lc3NhZ2VCb2R5V29ya2VySW5oZXJpdGFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdC1jYXNlIGZvciBKRVJTRVktMTQ4MS4KKyAqCisgKiB7QGxpbmsgSmFja3NvbkZlYXR1cmUgSmFja3NvbiBwcm92aWRlcn0gc2hvdWxkIG5vdCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBvdXIKKyAqIGN1c3RvbSBwcm92aWRlci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5V29ya2VySW5oZXJpdGFuY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBNb2RlbDxUPiB7CisKKyAgICAgICAgcHVibGljIFQgZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ01vZGVsIGltcGxlbWVudHMgTW9kZWw8U3RyaW5nPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIFN0cmluZ01vZGVsKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJbnRlcmZhY2VUeXBlIGV4dGVuZHMgTW9kZWwgeworICAgIH0KKworICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGVsUmVhZGVyPFQgZXh0ZW5kcyBNb2RlbD4gaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxUPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKworICAgICAgICAgICAgcmV0dXJuIE1vZGVsLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgcmVhZEZyb20oCisgICAgICAgICAgICAgICAgICAgIENsYXNzPFQ+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICByZXR1cm4gKFQpIG5ldyBJbnRlcmZhY2VUeXBlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZnJvbUludGVyZmFjZVR5cGVSZWFkZXIiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEJhc2VQcm92aWRlcjxUPiBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFQ+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFQgdCwKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFQgdCwKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGdldENvbnRlbnQodCkuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50KFQgcHJveHkpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyaWNNb2RlbFdyaXRlciBleHRlbmRzIEJhc2VQcm92aWRlcjxNb2RlbD4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoZmluYWwgTW9kZWwgcHJveHkpIHsKKyAgICAgICAgICAgIHJldHVybiAie1wiYmFyXCI6XCIiICsgcHJveHkuZ2V0VmFsdWUoKSArICJcIn0iOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZWdlck1vZGVsV3JpdGVyIGV4dGVuZHMgQmFzZVByb3ZpZGVyPE1vZGVsPEludGVnZXI+PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudChmaW5hbCBNb2RlbDxJbnRlZ2VyPiBwcm94eSkgeworICAgICAgICAgICAgcmV0dXJuICJ7XCJmb29cIjpcIiIgKyBwcm94eS5nZXRWYWx1ZSgpICsgIlwifSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIE1vZGVsPFN0cmluZz4gZ2V0U3RyaW5nTW9kZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ01vZGVsKCJmb28iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KEludGVyZmFjZVR5cGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQuZ2V0VmFsdWUoKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoR2VuZXJpY01vZGVsV3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNb2RlbFJlYWRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VCb2R5V29ya2VySW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJiYXJcIjpcImZvb1wifSIsIHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZUJvZHlXb3JrZXJJbnRlcmZhY2VJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuanNvbigie1widmFsdWVcIjpcImlnbm9yZWRcIn0iKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyb21JbnRlcmZhY2VUeXBlUmVhZGVyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL01lc3NhZ2VCb2R5V3JpdGVyT2JqZWN0RGlzdGFuY2VUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL01lc3NhZ2VCb2R5V3JpdGVyT2JqZWN0RGlzdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3OTJlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTWVzc2FnZUJvZHlXcml0ZXJPYmplY3REaXN0YW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogT2JqZWN0LmNsYXNzIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgd2hlbiBjb21wdXRpbmcgdHlwZSBkaXN0YW5jZSAtIGl0IHNob3VsZCBiZSBhbHdheXMgZnVydGhlciB0aGFuIGFueSBvdGhlcgorICogaW1wbGVtZW50ZWQgaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJXZWFrZXJBY2Nlc3MiKQorcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5V3JpdGVyT2JqZWN0RGlzdGFuY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZUEgeworCisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBJbnRlcmZhY2VCIGV4dGVuZHMgSW50ZXJmYWNlQSB7CisKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8T2JqZWN0PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShPYmplY3QgbywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3QgbywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgib2JqZWN0Ii5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJmYWNlQVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEludGVyZmFjZUE+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIEludGVyZmFjZUEuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKEludGVyZmFjZUEgaW50ZXJmYWNlQSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKEludGVyZmFjZUEgaW50ZXJmYWNlQSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShJbnRlcmZhY2VBLmNsYXNzLmdldFNpbXBsZU5hbWUoKS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi90ZXN0IikKKyAgICAgICAgcHVibGljIEludGVyZmFjZUIgZ2V0U3RyaW5nTW9kZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludGVyZmFjZUIoKSB7CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoT2JqZWN0V3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihJbnRlcmZhY2VBV3JpdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlQm9keVdyaXRlck9iamVjdERpc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlcmZhY2VBLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgiYXBwbGljYXRpb24vdGVzdCIpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL05vRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Ob0VudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFmODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Ob0VudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKKy8qKgorICogVGVzdHMgdGhhdCBubyBjb250ZW50IHR5cGUgaXMgc2VudCB3aGVuIGFuIGVudGl0eSBpcyBub3QgcHJlc2VudC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBOb0VudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MsIE1veHlKc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAWG1sUm9vdEVsZW1lbnQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RW50aXR5IHsKKworICAgICAgICBAWG1sQXR0cmlidXRlCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgQFBhdGgoIm5vLWVudGl0eSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXROb0VudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoMjA0KS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgICBAUGF0aCgiZW50aXR5IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEVudGl0eSgpIHsKKyAgICAgICAgICAgIE15RW50aXR5IG15RW50aXR5ID0gbmV3IE15RW50aXR5KCk7CisgICAgICAgICAgICBteUVudGl0eS5zZXROYW1lKCJoZWxsbyIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cygyMDApLmVudGl0eShteUVudGl0eSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFBhdGgoInN0cmluZyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRFbXB0eVN0cmluZygpIHsKKworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cygyMDQpLmVudGl0eSgiIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKAorICAgICAgICAgICAgICAgIG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKE5vRW50aXR5VGVzdC5jbGFzcy50b1N0cmluZygpKSwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCByZXR1cm5lZCBtZWRpYSB0eXBlIGlzIG51bGwgd2hlbiBubyBlbnRpdHkgaXMgc2VudC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0VudGl0eSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9uby1lbnRpdHkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldCgpOworICAgICAgICBNeUVudGl0eSBteUVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlFbnRpdHkuY2xhc3MpOworICAgICAgICBhc3NlcnROdWxsKG15RW50aXR5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnROdWxsKHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGNvcnJlY3QgbWVkaWEgdHlwZSBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHkoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZW50aXR5IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5nZXQoKTsKKyAgICAgICAgTXlFbnRpdHkgbXlFbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KE15RW50aXR5LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG15RW50aXR5LmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGVudGl0eSBpcyByZWFkIGFzIG51bGwgd2hlbiBubyBlbnRpdHkgaXMgc2VudCB3aXRoIDIwNCByZXNwb25zZSBzdGF0dXMuCisgICAgICogQ3VycmVudGx5IHRoaXMgdGVzdCB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIHJlYWQgdGhlIGVudGl0eS4KKyAgICAgKiA8cC8+CisgICAgICogRXhjZXB0aW9uOgorICAgICAqIDxwLz4KKyAgICAgKiBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbjoKKyAgICAgKiBNZXNzYWdlQm9keVJlYWRlciBub3QgZm91bmQgZm9yIG1lZGlhIHR5cGU9dGV4dC9wbGFpbiwKKyAgICAgKiB0eXBlPWNsYXNzIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uTm9FbnRpdHlUZXN0JE15RW50aXR5LAorICAgICAqIGdlbmVyaWNUeXBlPWNsYXNzIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uTm9FbnRpdHlUZXN0JE15RW50aXR5LgorICAgICAqIDxwLz4KKyAgICAgKiBodHRwczovL2phdmEubmV0L2ppcmEvYnJvd3NlL0pFUlNFWS0xOTk0CisgICAgICovCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJzZWUgaHR0cHM6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9KRVJTRVktMTk5NCIpCisgICAgcHVibGljIHZvaWQgdGVzdE5vRW50aXR5U3RyaW5nKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3N0cmluZyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgTXlFbnRpdHkgbXlFbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KE15RW50aXR5LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0TnVsbChteUVudGl0eSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTm9uUHVibGljTm9uU3RhdGljVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Ob25QdWJsaWNOb25TdGF0aWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4OTA1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTm9uUHVibGljTm9uU3RhdGljVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3RzIGRlcGxveW1lbnQgb2Ygbm9uLXN0YW5kYXJkIG9yIGludmFsaWQgcmVzb3VyY2VzIGFuZCBwcm92aWRlcnMuCisgKiA8cC8+CisgKiBUaGUgdGVzdHMgYXJlIGNoZWNraW5nLCB0aGF0IHRoZSBmYWlsdXJlIChpZiBleHBlY3RlZCkgdGFrZXMgcGxhY2UgaW4gdGhlIGV4cGVjdGVkIHRpbWUgKGR1cmluZyBkZXBsb3ltZW50LAorICogb3Igb24gZmlyc3QgcmVxdWVzdCkuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoe05vblB1YmxpY05vblN0YXRpY1Rlc3QuTm9uU3RhdGljUmVzb3VyY2VUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0Lk5vblN0YXRpY1Jlc291cmNlU3ViUmVzb3VyY2VUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0Lk5vblB1YmxpY1Jlc291cmNlVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5Ob25QdWJsaWNSZXNvdXJjZVN1YlJlc291cmNlVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5BYnN0cmFjdFJlc291cmNlVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5BYnN0cmFjdFJlc291cmNlU3ViUmVzb3VyY2VUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0LkludGVyZmFjZVJlc291cmNlVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5JbnRlcmZhY2VSZXNvdXJjZVN1YlJlc291cmNlVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5Ob25QdWJsaWNSZXNvdXJjZVdpdGhDb25zdHJ1Y3RvclRlc3QuY2xhc3MsCisgICAgICAgIE5vblB1YmxpY05vblN0YXRpY1Rlc3QuTm9uUHVibGljUmVzb3VyY2VTdWJyZXNvdXJjZVdpdGhDb25zdHJ1Y3RvclRlc3QuY2xhc3MsCisgICAgICAgIE5vblB1YmxpY05vblN0YXRpY1Rlc3QuUHVibGljUmVzb3VyY2VXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5Ob25TdGF0aWNQcm92aWRlclRlc3QuY2xhc3MsCisgICAgICAgIE5vblB1YmxpY05vblN0YXRpY1Rlc3QuTm9uUHVibGljUHJvdmlkZXJUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0LlB1YmxpY1Byb3ZpZGVyV2l0aFByaXZhdGVDb25zdHJ1Y3RvclRlc3QuY2xhc3N9KQorcHVibGljIGNsYXNzIE5vblB1YmxpY05vblN0YXRpY1Rlc3QgeworCisgICAgLy8gdmFyaW91cyByZXNvdXJjZXMgYW5kIHByb3ZpZGVycyBmb3IgdGhlIHRlc3QgYmVsbG93CisgICAgLy8gYXMgd2UgbmVlZCB0byBjcmVhdGUgYW5kIGRlcGxveSBzZXBhcmF0ZSBhbmQgY3VzdG9taXplZCByZXNvdXJjZUNvbmZpZ3MgZm9yIGVhY2ggdGVzdCBjYXNlLAorICAgIC8vIHRoZSB0ZXN0Y2FzZXMgYXJlIGVuY2Fwc3VsYXRlZCBpbiBpbm5lci1jbGFzc2VzLCB3aGljaCBhcmUgc3ViY2xhc3NlcyBvZiBKZXJzZXlUZXN0LgorICAgIC8vIFRob3NlIHJlc291cmNlcyBhbmQgcHJvdmlkZXJzIGFyZSwgaG93ZXZlciBpbiB0aGUgb3V0dGVyIGNsYXNzIChjYW4gYmUgcmV1c2VkIGluc2lkZSByZXNvdXJjZSBjb25maWdzKQorCisgICAgQFBhdGgoIi9ub24tc3RhdGljIikKKyAgICBwdWJsaWMgY2xhc3MgTm9uU3RhdGljUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJIaSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL25vbi1zdGF0aWMtc3ViIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblN0YXRpY1Jlc291cmNlU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJjbGFzcyIpCisgICAgICAgIHB1YmxpYyBDbGFzczxOb25TdGF0aWNSZXNvdXJjZT4gZ2V0Q2xhenooKSB7CisgICAgICAgICAgICByZXR1cm4gTm9uU3RhdGljUmVzb3VyY2UuY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL25vbi1wdWJsaWMiKQorICAgIHN0YXRpYyBjbGFzcyBOb25QdWJsaWNSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiaGkiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9ub24tcHVibGljLXN1YiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25QdWJsaWNSZXNvdXJjZVN1YlJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgiY2xhc3MiKQorICAgICAgICBwdWJsaWMgQ2xhc3M8Tm9uUHVibGljUmVzb3VyY2U+IGdldENsYXp6KCkgeworICAgICAgICAgICAgcmV0dXJuIE5vblB1YmxpY1Jlc291cmNlLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9hYnN0cmFjdCIpCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJIaSEiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9hYnN0cmFjdC1zdWIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZVN1YlJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgiY2xhc3MiKQorICAgICAgICBwdWJsaWMgQ2xhc3M8QWJzdHJhY3RSZXNvdXJjZT4gZ2V0Q2xhenooKSB7CisgICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RSZXNvdXJjZS5jbGFzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJpbnRlcmZhY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEludGVyZmFjZVJlc291cmNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiaW50ZXJmYWNlLXN1YiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcmZhY2VSZXNvdXJjZVN1YlJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgiY2xhc3MiKQorICAgICAgICBwdWJsaWMgQ2xhc3M8SW50ZXJmYWNlUmVzb3VyY2U+IGdldENsYXp6KCkgeworICAgICAgICAgICAgcmV0dXJuIEludGVyZmFjZVJlc291cmNlLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm5vbi1wdWJsaWMtd2l0aC1jb25zdHJ1Y3RvciIpCisgICAgc3RhdGljIGNsYXNzIE5vblB1YmxpY1Jlc291cmNlV2l0aENvbnN0cnVjdG9yIHsKKworICAgICAgICBwdWJsaWMgTm9uUHVibGljUmVzb3VyY2VXaXRoQ29uc3RydWN0b3IoKSB7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJIaSEiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm5vbi1wdWJsaWMtc3ViLXdpdGgtY29uc3RydWN0b3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uUHVibGljUmVzb3VyY2VTdWJSZXNvdXJjZVdpdGhDb25zdHJ1Y3RvciB7CisKKyAgICAgICAgQFBhdGgoImNsYXNzIikKKyAgICAgICAgcHVibGljIENsYXNzPE5vblB1YmxpY1Jlc291cmNlV2l0aENvbnN0cnVjdG9yPiBnZXRDbGF6eigpIHsKKyAgICAgICAgICAgIHJldHVybiBOb25QdWJsaWNSZXNvdXJjZVdpdGhDb25zdHJ1Y3Rvci5jbGFzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwdWJsaWMtd2l0aC1wcml2YXRlLWNvbnN0cnVjdG9yIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFB1YmxpY1Jlc291cmNlV2l0aFByaXZhdGVDb25zdHJ1Y3RvciB7CisKKyAgICAgICAgcHJpdmF0ZSBQdWJsaWNSZXNvdXJjZVdpdGhQcml2YXRlQ29uc3RydWN0b3IoKSB7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJIaSEiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInByb3ZpZGVyLXJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3ZpZGVyUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkhpISI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgY2xhc3MgTm9uU3RhdGljUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBTdHJpbmcgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBzdGF0aWMgY2xhc3MgTm9uUHVibGljUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBTdHJpbmcgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdyYXBwZWQgPSAiPj4gIiArIHMgKyAiIDw8IjsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSh3cmFwcGVkLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgc3RhdGljIGNsYXNzIFB1YmxpY1Byb3ZpZGVyV2l0aFByaXZhdGVDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4geworCisgICAgICAgIHByaXZhdGUgUHVibGljUHJvdmlkZXJXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgU3RyaW5nIHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBTdHJpbmcgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShzLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgU3RyaW5nIHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBTdHJpbmcgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShzLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW5uZXIgdGVzdCBjbGFzc2VzIC0gZWFjaCBuZWVkZWQgcmVzb3VyY2UgY29uZmlnIHZhcmlhdGlvbiBoYXMgaXRzIG93biBpbm5lciBjbGFzcworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25TdGF0aWNSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5XQVJOSU5HLmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhOb25TdGF0aWNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uU3RhdGljUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgTGlzdDxMb2dSZWNvcmQ+IGxvZ2dlZFJlY29yZHMgPSBnZXRMb2dnZWRSZWNvcmRzKCk7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0Rm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2Vjb25kRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoTG9nUmVjb3JkIHJlY29yZCA6IGxvZ2dlZFJlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldE1lc3NhZ2UoKS5jb250YWlucygiY2Fubm90IGJlIGluc3RhbnRpYXRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJpcyBlbXB0eS4gSXQgaGFzIG5vIHJlc291cmNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RGb3VuZCAmJiBzZWNvbmRGb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBsb2cgbWVzc2FnZSAoMXN0KSB3YXMgbm90IGZvdW5kLiIsIGZpcnN0Rm91bmQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgbG9nIG1lc3NhZ2UgKDJuZCkgd2FzIG5vdCBmb3VuZC4iLCBzZWNvbmRGb3VuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblN0YXRpY1Jlc291cmNlU3ViUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE5vblN0YXRpY1Jlc291cmNlU3ViUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uU3RhdGljUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgiL25vbi1zdGF0aWMtc3ViL2NsYXNzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25QdWJsaWNSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTm9uUHVibGljUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uUHVibGljUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgiL25vbi1wdWJsaWMiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblB1YmxpY1Jlc291cmNlU3ViUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE5vblB1YmxpY1Jlc291cmNlU3ViUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uUHVibGljUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgiL25vbi1wdWJsaWMtc3ViL2NsYXNzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYnN0cmFjdFJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLldBUk5JTkcuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEFic3RyYWN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEFic3RyYWN0UmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgTGlzdDxMb2dSZWNvcmQ+IGxvZ2dlZFJlY29yZHMgPSBnZXRMb2dnZWRSZWNvcmRzKCk7CisgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKExvZ1JlY29yZCByZWNvcmQgOiBsb2dnZWRSZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRNZXNzYWdlKCkuY29udGFpbnMoImNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgbG9nIHJlY29yZCB3YXMgbm90IGZvdW5kLiIsIGZvdW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZVN1YlJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBYnN0cmFjdFJlc291cmNlU3ViUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RSZXNvdXJjZVN1YlJlc291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoImFic3RyYWN0LXN1Yi9jbGFzcyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZXJmYWNlUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuV0FSTklORy5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSW50ZXJmYWNlUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEludGVyZmFjZVJlc291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TG9nUmVjb3JkPiBsb2dnZWRSZWNvcmRzID0gZ2V0TG9nZ2VkUmVjb3JkcygpOworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdEZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIHNlY29uZEZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKExvZ1JlY29yZCByZWNvcmQgOiBsb2dnZWRSZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRNZXNzYWdlKCkuY29udGFpbnMoImNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLmdldE1lc3NhZ2UoKS5jb250YWlucygiaXMgZW1wdHkuIEl0IGhhcyBubyByZXNvdXJjZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY29uZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0Rm91bmQgJiYgc2Vjb25kRm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgbG9nIG1lc3NhZ2UgKDFzdCkgd2FzIG5vdCBmb3VuZC4iLCBmaXJzdEZvdW5kKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGxvZyBtZXNzYWdlICgybmQpIHdhcyBub3QgZm91bmQuIiwgc2Vjb25kRm91bmQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcmZhY2VSZXNvdXJjZVN1YlJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhJbnRlcmZhY2VSZXNvdXJjZVN1YlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0KGV4cGVjdGVkID0gSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEludGVyZmFjZVJlc291cmNlU3ViUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgiaW50ZXJmYWNlLXN1Yi9jbGFzcyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uUHVibGljUmVzb3VyY2VXaXRoQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE5vblB1YmxpY1Jlc291cmNlV2l0aENvbnN0cnVjdG9yLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0KGV4cGVjdGVkID0gSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdE5vblB1YmxpY1Jlc291cmNlV2l0aENvbnN0cnVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoIm5vbi1wdWJsaWMtd2l0aC1jb25zdHJ1Y3RvciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uUHVibGljUmVzb3VyY2VTdWJyZXNvdXJjZVdpdGhDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTm9uUHVibGljUmVzb3VyY2VTdWJSZXNvdXJjZVdpdGhDb25zdHJ1Y3Rvci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdChleHBlY3RlZCA9IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24uY2xhc3MpCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3ROb25QdWJsaWNSZXNvdXJjZVN1YlJlc291cmNlV2l0aENvbnN0cnVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoIm5vbi1wdWJsaWMtc3ViLXdpdGgtY29uc3RydWN0b3IvY2xhc3MiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFB1YmxpY1Jlc291cmNlV2l0aFByaXZhdGVDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5XQVJOSU5HLmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhQdWJsaWNSZXNvdXJjZVdpdGhQcml2YXRlQ29uc3RydWN0b3IuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UHVibGljUmVzb3VyY2VXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoInB1YmxpYy13aXRoLXByaXZhdGUtY29uc3RydWN0b3IiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblN0YXRpY1Byb3ZpZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLldBUk5JTkcuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFByb3ZpZGVyUmVzb3VyY2UuY2xhc3MsIE5vblN0YXRpY1Byb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3ROb25TdGF0aWNQcm92aWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PExvZ1JlY29yZD4gbG9nZ2VkUmVjb3JkcyA9IGdldExvZ2dlZFJlY29yZHMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoTG9nUmVjb3JkIHJlY29yZCA6IGxvZ2dlZFJlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldE1lc3NhZ2UoKS5jb250YWlucygiSW5zdGFudGlhdGlvbiBvZiBub24tc3RhdGljIG1lbWJlciBjbGFzc2VzIGlzIG5vdCBzdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGxvZyByZWNvcmQgd2FzIG5vdCBmb3VuZC4iLCBmb3VuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblB1YmxpY1Byb3ZpZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhQcm92aWRlclJlc291cmNlLmNsYXNzLCBOb25QdWJsaWNQcm92aWRlci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uUHVibGljUHJvdmlkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy8gTk9URTogSHR0cFVybENvbm5lY3RvciBzZW5kcyBzZXZlcmFsIGFjY2VwdGVkIHR5cGVzIGJ5IGRlZmF1bHQgd2hlbiBub3QgZXhwbGljaXRseSBzZXQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgICAgIC8vIEluIHN1Y2ggY2FzZSwgdGhlIC5hY2NlcHQoInRleHQvaHRtbCIpIGNhbGwgaXMgbm90IG5lY2Vzc2FyeS4gSG93ZXZlciwgb3RoZXIgY29ubmVjdG9ycyBhY3QgaW4gYSBkaWZmZXJlbnQgd2F5IGFuZAorICAgICAgICAgICAgLy8gdGhpcyBsZWFkcyBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHdoZW4gc2VsZWN0aW5nIHRoZSBNZXNzYWdlQm9keVdyaXRlci4gTGVhdmluZyB0aGUgZGVmaW5pdGlvbiBleHBsaWNpdCBmb3IgYnJvYWRlcgorICAgICAgICAgICAgLy8gY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgicHJvdmlkZXItcmVzb3VyY2UiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiPj4gSGkhIDw8Iiwgcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOT1RFIC0gdGhlIG9yaWdpbmFsIEplcnNleSAxIHRlc3Qgbm9uUHVibGljUHJvdmlkZXJXaXRoQ29uc3RydWN0b3IgZG9lcyBub3QgbWFrZSBzZW5zZSBjb25zaWRlcmluZyB0aGF0IGl0IHdvcmtzIGV2ZW4KKyAgICAvLyB3L28gY29uc3RydWN0b3IKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHVibGljUHJvdmlkZXJXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLldBUk5JTkcuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFByb3ZpZGVyUmVzb3VyY2UuY2xhc3MsIFB1YmxpY1Byb3ZpZGVyV2l0aFByaXZhdGVDb25zdHJ1Y3Rvci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uUHVibGljUHJvdmlkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgTGlzdDxMb2dSZWNvcmQ+IGxvZ2dlZFJlY29yZHMgPSBnZXRMb2dnZWRSZWNvcmRzKCk7CisgICAgICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKExvZ1JlY29yZCByZWNvcmQgOiBsb2dnZWRSZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkNvdWxkIG5vdCBmaW5kIGEgc3VpdGFibGUgY29uc3RydWN0b3IiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGxvZyByZWNvcmQgd2FzIG5vdCBmb3VuZC4iLCBmb3VuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhYnN0cmFjdCBwcm92aWRlciAtIHRocm93cyBNdWx0aUV4Y2VwdGlvbiBhZnRlciBjYWxsaW5nIGNvbmZpZ3VyZSgpLCBidXQgYmVmb3JlIHJ1bm5pbmcgdGhlIEBUZXN0IG1ldGhvZAorICAgIC8vIHRoZSBzYW1lIGZvciBpbnRlcmZhY2UgcHJvdmlkZXIgdGVzdAorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Byb3ZpZGVyc0xlZ2FjeU9yZGVyaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Qcm92aWRlcnNMZWdhY3lPcmRlcmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTJkYzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Qcm92aWRlcnNMZWdhY3lPcmRlcmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcm92aWRlcnNMZWdhY3lPcmRlcmluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJXNSBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE9iamVjdD4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE9iamVjdCBteVR5cGUsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT2JqZWN0IG15VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJXNiBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE9iamVjdD4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE9iamVjdCBteVR5cGUsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT2JqZWN0IG15VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgTWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2VCb2R5V29ya2VyczsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXlUeXBlKCkgeworCisgICAgICAgICAgICBmaW5hbCBNYXA8TWVkaWFUeXBlLCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPj4gd3JpdGVycyA9IG1lc3NhZ2VCb2R5V29ya2Vycy5nZXRXcml0ZXJzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPiBtZXNzYWdlQm9keVdyaXRlcnMxID0gd3JpdGVycy5nZXQoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVzc2FnZUJvZHlXcml0ZXI+IG1lc3NhZ2VCb2R5V3JpdGVyczIgPSB3cml0ZXJzCisgICAgICAgICAgICAgICAgICAgIC5nZXQoTWVkaWFUeXBlcy5nZXRUeXBlV2lsZENhcnQoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisKKyAgICAgICAgICAgIC8vIGN1c3RvbSBwcm92aWRlciBoYXMgcHJpb3JpdHkgLSBpdCBoYXMgdG8gYmUgZmlyc3QKKyAgICAgICAgICAgIGFzc2VydFRydWUobWVzc2FnZUJvZHlXcml0ZXJzMS5nZXQoMCkgaW5zdGFuY2VvZiBNeU1CVzUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlQm9keVdyaXRlcnMyLmdldCgwKSBpbnN0YW5jZW9mIE15TUJXNik7CisKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MsIE15TUJXNS5jbGFzcywgTXlNQlc2LmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoTWVzc2FnZVByb3BlcnRpZXMuTEVHQUNZX1dPUktFUlNfT1JERVJJTkcsIHRydWUpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBvcmRlcmluZ1Rlc3QoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3Rlc3QxIikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlcXVlc3Qgd2FzIG5vdCBoYW5kbGVkIGNvcnJlY3RseSwgbW9zdCBsaWtlbHkgZmF1bHQgaW4gTWVzc2FnZUJvZHlXb3JrZXIgc2VsZWN0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiUmVxdWVzdCB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LCBtb3N0IGxpa2VseSBmYXVsdCBpbiBNZXNzYWdlQm9keVdvcmtlciBzZWxlY3Rpb24uIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Byb3ZpZGVyc09yZGVyaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Qcm92aWRlcnNPcmRlcmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDViNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Qcm92aWRlcnNPcmRlcmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDQzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5BYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcm92aWRlcnNPcmRlcmluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUeXBlIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VHlwZUV4dCBleHRlbmRzIE15VHlwZSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVR5cGVFeHRFeHQgZXh0ZW5kcyBNeVR5cGVFeHQgeworICAgIH0KKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vdGVzdDEiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNQlcxIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TXlUeXBlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzPD8+PiBjYWxsTGlzdDsKKworICAgICAgICBwdWJsaWMgTXlNQlcxKExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0KSB7CisgICAgICAgICAgICB0aGlzLmNhbGxMaXN0ID0gY2FsbExpc3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBjYWxsTGlzdC5hZGQodGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE15VHlwZSBteVR5cGUsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTXlUeXBlIG15VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJXMiBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE15VHlwZT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDbGFzczw/Pj4gY2FsbExpc3Q7CisKKyAgICAgICAgcHVibGljIE15TUJXMihMaXN0PENsYXNzPD8+PiBjYWxsTGlzdCkgeworICAgICAgICAgICAgdGhpcy5jYWxsTGlzdCA9IGNhbGxMaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgY2FsbExpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShNeVR5cGUgbXlUeXBlLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE15VHlwZSBteVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiKi8qIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJXMyBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE15VHlwZT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDbGFzczw/Pj4gY2FsbExpc3Q7CisKKyAgICAgICAgcHVibGljIE15TUJXMyhMaXN0PENsYXNzPD8+PiBjYWxsTGlzdCkgeworICAgICAgICAgICAgdGhpcy5jYWxsTGlzdCA9IGNhbGxMaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgY2FsbExpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE15VHlwZSBteVR5cGUsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTXlUeXBlIG15VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCJ0ZXN0Ii5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vKiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU1CVzQgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxNeVR5cGVFeHQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0OworCisgICAgICAgIHB1YmxpYyBNeU1CVzQoTGlzdDxDbGFzczw/Pj4gY2FsbExpc3QpIHsKKyAgICAgICAgICAgIHRoaXMuY2FsbExpc3QgPSBjYWxsTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIGNhbGxMaXN0LmFkZCh0aGlzLmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoTXlUeXBlRXh0IG15VHlwZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhNeVR5cGVFeHQgbXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU1CVzUgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxPYmplY3Q+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShPYmplY3QgbXlUeXBlLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE9iamVjdCBteVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU1CUjEgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNeVR5cGU+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0OworCisgICAgICAgIHB1YmxpYyBNeU1CUjEoTGlzdDxDbGFzczw/Pj4gY2FsbExpc3QpIHsKKyAgICAgICAgICAgIHRoaXMuY2FsbExpc3QgPSBjYWxsTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgY2FsbExpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE15VHlwZSByZWFkRnJvbShDbGFzczxNeVR5cGU+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi90ZXN0MSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU1CUjIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNeVR5cGVFeHQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0OworCisgICAgICAgIHB1YmxpYyBNeU1CUjIoTGlzdDxDbGFzczw/Pj4gY2FsbExpc3QpIHsKKyAgICAgICAgICAgIHRoaXMuY2FsbExpc3QgPSBjYWxsTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgY2FsbExpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE15VHlwZUV4dCByZWFkRnJvbShDbGFzczxNeVR5cGVFeHQ+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi90ZXN0MSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU1CUjMgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNeVR5cGVFeHRFeHQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0OworCisgICAgICAgIHB1YmxpYyBNeU1CUjMoTGlzdDxDbGFzczw/Pj4gY2FsbExpc3QpIHsKKyAgICAgICAgICAgIHRoaXMuY2FsbExpc3QgPSBjYWxsTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgY2FsbExpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXlUeXBlRXh0RXh0IHJlYWRGcm9tKENsYXNzPE15VHlwZUV4dEV4dD4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBNeVR5cGVFeHRFeHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIE1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlQm9keVdvcmtlcnM7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3Rlc3QxIikKKyAgICAgICAgcHVibGljIE15VHlwZSBnZXRNeVR5cGUoTXlUeXBlRXh0RXh0IG15VHlwZSkgeworCisgICAgICAgICAgICBmaW5hbCBNYXA8TWVkaWFUeXBlLCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPj4gd3JpdGVycyA9IG1lc3NhZ2VCb2R5V29ya2Vycy5nZXRXcml0ZXJzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPiBtZXNzYWdlQm9keVdyaXRlcnMgPSB3cml0ZXJzLmdldChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2VCb2R5V3JpdGVycy5nZXQoMCkgaW5zdGFuY2VvZiBNeU1CVzUpOworCisgICAgICAgICAgICByZXR1cm4gbXlUeXBlOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImJ5dGVhcnJheSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBieXRlW10gYnl0ZWFycmF5KGJ5dGVbXSBieXRlcykgeworICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PENsYXNzPD8+PiBjYWxsTGlzdDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGNhbGxMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcywgTXlNQlc1LmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJJbnN0YW5jZXMobmV3IE15TUJXMShjYWxsTGlzdCksIG5ldyBNeU1CVzIoY2FsbExpc3QpLCBuZXcgTXlNQlczKGNhbGxMaXN0KSwgbmV3IE15TUJXNChjYWxsTGlzdCksCisgICAgICAgICAgICAgICAgbmV3IE15TUJSMShjYWxsTGlzdCksIG5ldyBNeU1CUjIoY2FsbExpc3QpLCBuZXcgTXlNQlIzKGNhbGxMaXN0KSwgbmV3IE15Qnl0ZUFycmF5UHJvdmlkZXIoKSk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIG9yZGVyaW5nVGVzdCgpIHsKKyAgICAgICAgY2FsbExpc3QuY2xlYXIoKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi90ZXN0MSIpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoRW50aXR5LmVudGl0eSgidGVzdCIsICJhcHBsaWNhdGlvbi90ZXN0MSIpLCBSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXF1ZXN0IHdhcyBub3QgaGFuZGxlZCBjb3JyZWN0bHksIG1vc3QgbGlrZWx5IGZhdWx0IGluIE1lc3NhZ2VCb2R5V29ya2VyIHNlbGVjdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiUmVxdWVzdCB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LCBtb3N0IGxpa2VseSBmYXVsdCBpbiBNZXNzYWdlQm9keVdvcmtlciBzZWxlY3Rpb24uIik7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PENsYXNzPD8+PiBjbGFzc2VzID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBNeU1CUjMuY2xhc3MsIC8vIE1CUiAtIHNtYWxsZXN0IHR5cGUgZGlzdGFuY2UgKE1CUjEgYW5kIE1CUjIgYXJlIG5vdCBjYWxsZWQgYmVjYXVzZSBvZiB0aGF0KQorICAgICAgICAgICAgICAgIE15TUJXNC5jbGFzcywgLy8gTUJXIC0gdHlwZSBkaXN0YW5jZQorICAgICAgICAgICAgICAgIE15TUJXMS5jbGFzcywgLy8gTUJXIC0gbW9zdCBzcGVjaWZpYyBtZWRpYSB0eXBlIGFwcGxpY2F0aW9uL3Rlc3QxCisgICAgICAgICAgICAgICAgTXlNQlcyLmNsYXNzLCAvLyBNQlcgLSBhcHBsaWNhdGlvbi8qCisgICAgICAgICAgICAgICAgTXlNQlczLmNsYXNzICAvLyBNQlcgLSAqLyosIGZpcnN0IHVzYWJsZSB3cml0ZXIgKHJldHVybnMgdHJ1ZSB0byBpc1dyaXRlYWJsZSBjYWxsKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscyhjbGFzc2VzLCBjYWxsTGlzdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlQnVpbHRJblByb3ZpZGVyKCkgeworICAgICAgICBjYWxsTGlzdC5jbGVhcigpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJieXRlYXJyYXkiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoInJlcGxhY2VCdWlsdEluUHJvdmlkZXIiKSwgUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVxdWVzdCB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LCBtb3N0IGxpa2VseSBmYXVsdCBpbiBNZXNzYWdlQm9keVdvcmtlciBzZWxlY3Rpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlJlcXVlc3Qgd2FzIG5vdCBoYW5kbGVkIGNvcnJlY3RseSwgbW9zdCBsaWtlbHkgZmF1bHQgaW4gTWVzc2FnZUJvZHlXb3JrZXIgc2VsZWN0aW9uLiIpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShNeUJ5dGVBcnJheVByb3ZpZGVyLmNvdW50ZXIgPT0gMik7IC8vIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgZW50aXR5IG9uIHNlcnZlciBzaWRlLgorCisgICAgfQorCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwgIiovKiJ9KQorICAgIEBDb25zdW1lcyh7ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsICIqLyoifSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE15Qnl0ZUFycmF5UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlcjxieXRlW10+IHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudGVyID0gMDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IGJ5dGVbXS5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYnl0ZVtdIHJlYWRGcm9tKAorICAgICAgICAgICAgICAgIENsYXNzPGJ5dGVbXT4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgd3JpdGVUbyhlbnRpdHlTdHJlYW0sIG91dCk7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgICAgICByZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBieXRlW10uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBieXRlW10gdCwKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUodCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShieXRlW10gdCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdC5sZW5ndGg7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1F1ZXJ5UGFyYW1FbmNvZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUXVlcnlQYXJhbUVuY29kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTkxZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1F1ZXJ5UGFyYW1FbmNvZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5UGFyYW1FbmNvZGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImVuY29kZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kZWQoQEVuY29kZWQgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtLmVxdWFscygiJTI1ZHVtbXkyMyUyQmEiKSArICI6IiArIHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJkZWNvZGVkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZWNvZGVkKEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbS5lcXVhbHMoIiVkdW1teTIzK2EiKSArICI6IiArIHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2VuY29kZWQiKS5xdWVyeVBhcmFtKCJxdWVyeSIsICIlZHVtbXkyMythIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0cnVlOiUyNWR1bW15MjMlMkJhIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVkKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2RlY29kZWQiKS5xdWVyeVBhcmFtKCJxdWVyeSIsICIlZHVtbXkyMythIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0cnVlOiVkdW1teTIzK2EiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUmVhZGVyUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1JlYWRlclByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzkyYmNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9SZWFkZXJQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBUZXN0aW5nIHtAbGluayBSZWFkZXJ9IG9uIGNsaWVudCBhbmQgc2VydmVyLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFJlYWRlclByb3ZpZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX1JFQURFUl9SRVNQT05TRSA9ICJHRVRfUkVBREVSX1JFU1BPTlNFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfUE9TVF9SRVNQT05TRSA9ICJHRVRfUE9TVF9SRVNQT05TRSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlYWRlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXIoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9wb3N0UmVhZGVyR2V0UmVhZGVyIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShHRVRfUE9TVF9SRVNQT05TRSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhHRVRfUE9TVF9SRVNQT05TRSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZWFkZXIoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9nZXRSZWFkZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdFVF9SRUFERVJfUkVTUE9OU0UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvZ2V0RW1wdHkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgUmVhZGVyIHJlYWRlciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoUmVhZGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHJlYWRlci5yZWFkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRlck9uQ2xpZW50QXNSZXNwb25zZUVudGl0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9nZXRSZWFkZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgUmVhZGVyIHJlYWRlciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoUmVhZGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZWFkZXIpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoR0VUX1JFQURFUl9SRVNQT05TRSwgYnIucmVhZExpbmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGVyT25DbGllbnRBc1JlcXVlc3RFbnRpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvcG9zdFJlYWRlckdldFJlYWRlciIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IFN0cmluZ1JlYWRlcihHRVRfUE9TVF9SRVNQT05TRSksIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdFVF9QT1NUX1JFU1BPTlNFLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWRlclJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgicG9zdFJlYWRlckdldFJlYWRlciIpCisgICAgICAgIHB1YmxpYyBSZWFkZXIgcG9zdFJlYWRlcihSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImdldFJlYWRlciIpCisgICAgICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKEdFVF9SRUFERVJfUkVTUE9OU0UpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZ2V0RW1wdHkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldGVtcHR5UmVzcG9uc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1JlcXVlc3RTY29wZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUmVxdWVzdFNjb3BlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTAzZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1JlcXVlc3RTY29wZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5EaXNwb3NhYmxlU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogRTJFIFJlcXVlc3QgU2NvcGUgVGVzdHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BJZ25vcmUoIlRlc3QgU3VwcGxpZXIgSW5qZWN0aW9uIC0+IHRoaXMgdGVzdCByZXF1aXJlIGRpc3Bvc2UoKSBtZXRob2QgZnJvbSBGYWN0b3J5IikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlbW92ZVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kRmFjdG9yeShDbG9zZU1lRmFjdG9yeS5jbGFzcywgUmVxdWVzdFNjb3BlZC5jbGFzcykudG8oQ2xvc2VNZS5jbGFzcykuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIENsb3NlTWUgeworCisgICAgICAgIFN0cmluZyBldmFsKCk7CisKKyAgICAgICAgdm9pZCBjbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xvc2VNZUZhY3RvcnkgaW1wbGVtZW50cyBEaXNwb3NhYmxlU3VwcGxpZXI8Q2xvc2VNZT4geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvdW50RG93bkxhdGNoIENMT1NFRF9MQVRDSCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsb3NlTWUgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDbG9zZU1lKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZXZhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgICAgICAgICBDTE9TRURfTEFUQ0guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKGZpbmFsIENsb3NlTWUgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIGluc3RhbmNlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVtb3ZlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlbW92ZVJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIENsb3NlTWUgY2xvc2VNZTsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBSZW1vdmVSZXNvdXJjZShmaW5hbCBDbG9zZU1lIGNsb3NlTWUpIHsKKyAgICAgICAgICAgIHRoaXMuY2xvc2VNZSA9IGNsb3NlTWU7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIGNsb3NlTWUuZXZhbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IEZhY3RvcnkuZGlzcG9zZSBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyByZWxlYXNlIG9mIFJlcXVlc3QgU2NvcGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVtb3ZlIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoImZvbyIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKENsb3NlTWVGYWN0b3J5LkNMT1NFRF9MQVRDSC5hd2FpdCgzLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9SZXNwb25zZUxpbmtzVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9SZXNwb25zZUxpbmtzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MWIzYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Jlc3BvbnNlTGlua3NUZXN0LmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VMaW5rc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIFVyaUluZm8gdXJpSW5mbzsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIxNjgKKyAgICAgICAgICovCisgICAgICAgIEBQYXRoKCIxIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OfSkKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldExpbmsoKSB7CisgICAgICAgICAgICBVUkkgbGluayA9IHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpLnF1ZXJ5UGFyYW0oImxpbWl0IiwgNTApLmJ1aWxkKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykubGluayhsaW5rLCAicHJldiIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIxNjgKKyAgICAgICAgICovCisgICAgICAgIEBQYXRoKCIyIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OfSkKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldExpbmtzKCkgeworICAgICAgICAgICAgTGluayBsaW5rMSA9IExpbmsuZnJvbVVyaSh1cmlJbmZvLmdldEFic29sdXRlUGF0aEJ1aWxkZXIoKS5xdWVyeVBhcmFtKCJsaW1pdCIsIDUwKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAucmVsKCJwcmV2IikuYnVpbGQoKTsKKyAgICAgICAgICAgIExpbmsgbGluazIgPSBMaW5rLmZyb21VcmkoCisgICAgICAgICAgICAgICAgICAgIHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpLnF1ZXJ5UGFyYW0oImxpbWl0IiwgNTApLnF1ZXJ5UGFyYW0oImFjdGlvbiIsICJuZXh0IikuYnVpbGQoKSkucmVsKCJuZXh0IikKKyAgICAgICAgICAgICAgICAgICAgLnRpdGxlKCJuZXh0IHBhZ2UiKS5idWlsZCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuT0spLmxpbmtzKGxpbmsxLCBsaW5rMikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY29uZmlnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjE2OAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmsoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiMSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldCgpOworICAgICAgICBTZXQ8TGluaz4gbGlua3MgPSByZXNwb25zZS5nZXRMaW5rcygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGxpbmtzLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldExpbmsoInByZXYiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldExpbmsoInByZXYiKS5nZXRVcmkoKS50b1N0cmluZygpLmVuZHNXaXRoKCIxP2xpbWl0PTUwIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMTY4CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGlua3MoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiMiIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldCgpOworICAgICAgICBTZXQ8TGluaz4gbGlua3MgPSByZXNwb25zZS5nZXRMaW5rcygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGxpbmtzLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldExpbmsoInByZXYiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldExpbmsoInByZXYiKS5nZXRVcmkoKS50b1N0cmluZygpLmVuZHNXaXRoKCIyP2xpbWl0PTUwIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChyZXNwb25zZS5nZXRMaW5rKCJuZXh0IikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJuZXh0IHBhZ2UiLCByZXNwb25zZS5nZXRMaW5rKCJuZXh0IikuZ2V0VGl0bGUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldExpbmsoIm5leHQiKS5nZXRVcmkoKS50b1N0cmluZygpLmVuZHNXaXRoKCIyP2xpbWl0PTUwJmFjdGlvbj1uZXh0IikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9VcmlDb21wb25lbnRUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1VyaUNvbXBvbmVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDQ0YjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9VcmlDb21wb25lbnRUZXN0LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlDb21wb25lbnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS2Ftb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVyaUNvbXBvbmVudFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUkVGSVggPSAiLTwjWyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1NVRkZJWCA9ICJdIz4tIjsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGV4dCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dFZhbHVlKEBRdWVyeVBhcmFtKCJ0ZXh0IikgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRV9QUkVGSVggKyB0ZXh0ICsgVkFMVUVfU1VGRklYOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZUNsaWVudChjb25maWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMjYwCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIFFVRVJZX1JFU0VSVkVEX0NIQVJTID0gIjsvPzpAJj0rLCQiOworICAgICAgICBmaW5hbCBTdHJpbmcgT1RIRVJfU1BFQ0lBTF9DSEFSUyA9ICJcIlx0LSBcbiciOworCisgICAgICAgIHRlc3RUZXh0SW1wbCgicXVlcnkgcmVzZXJ2ZWQgY2hhcmFjdGVycyIsIFFVRVJZX1JFU0VSVkVEX0NIQVJTKTsKKyAgICAgICAgdGVzdFRleHRJbXBsKCJvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMiLCBPVEhFUl9TUEVDSUFMX0NIQVJTKTsKKworICAgICAgICB0ZXN0VGV4dEltcGwoInF1ZXJ5IHJlc2VydmVkIGNoYXJhY3RlcnMgYmV0d2VlbiB0ZW1wbGF0ZSBicmFja2V0cyIsICJ7YWJjIiArIFFVRVJZX1JFU0VSVkVEX0NIQVJTICsgIlhZWn0iKTsKKyAgICAgICAgdGVzdFRleHRJbXBsKCJvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgYmV0d2VlbiB0ZW1wbGF0ZSBicmFja2V0cyIsICJ7YWJjIiArIE9USEVSX1NQRUNJQUxfQ0hBUlMgKyAiWFlafSIpOworCisgICAgICAgIHRlc3RUZXh0SW1wbCgianNvbiAtIGRvdWJsZSBxdW90ZSIsICJ7IFwiam1lbm9cIiA6IFwiaG9kbm90YVwiIH0iKTsKKyAgICAgICAgdGVzdFRleHRJbXBsKCJqc29uIC0gc2luZ2xlIHF1b3RlIiwgInsgJ2ptZW5vJyA6ICdob2Rub3RhJyB9Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RUZXh0SW1wbChTdHJpbmcgbWVzc2FnZSwgZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgU3RyaW5nIGVuY29kZWQgPSBVcmlDb21wb25lbnQuZW5jb2RlKHRleHQsIFVyaUNvbXBvbmVudC5UeXBlLlFVRVJZX1BBUkFNX1NQQUNFX0VOQ09ERUQpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJ0ZXN0L3RleHQiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucXVlcnlQYXJhbSgidGV4dCIsIGVuY29kZWQpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtZXNzYWdlLCBWQUxVRV9QUkVGSVggKyB0ZXh0ICsgVkFMVUVfU1VGRklYLCBhY3R1YWwpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wYWNrYWdlLWluZm8uamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkOWQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgRW5kIHRvIEVuZCBjb21tb24gdGVzdCBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0Fic3RyYWN0U2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvQWJzdHJhY3RTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzQxNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0Fic3RyYWN0U2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworLyoqCisgKiBBYnN0cmFjdCBKZXJzZXkgdGVzdCB3aXRoIHByZXBhcmVkIHJlc291cmNlcyBmb3IgVVJMIG1hdGNoCisgKiB0ZXN0aW5nIG9uIGRpZmZlcmVudCBjb250YWluZXJzLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX1JFU1BPTlNFID0gIkNvbnRhaW5lci1SZXNwb25zZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9QQVRIID0gImJhc2UiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoU2ltcGxlUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgUGF0aFBhcmFtUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgRW1wdHlSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBFbXB0eVBhdGhQYXJhbVJlc291cmNlLmNsYXNzKTsKKworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLlJFRFVDRV9DT05URVhUX1BBVEhfU0xBU0hFU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBQYXRoKCJzaW1wbGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBlbmNvZGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIENPTlRBSU5FUl9SRVNQT05TRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoInBhdGhwYXJhbSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRoUGFyYW1SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2JhcjouKn0ve2JhejouKn0vdGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaGVsbG8oQFBhdGhQYXJhbSgiYmFyIikgZmluYWwgU3RyaW5nIGJhciwgQFBhdGhQYXJhbSgiYmF6IikgZmluYWwgU3RyaW5nIGJheikgeworICAgICAgICAgICAgcmV0dXJuIGJhciArICItIiArIGJhejsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5UGF0aFBhcmFtUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntiYXI6Lip9L3tiYXo6Lip9L3Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGhlbGxvKEBQYXRoUGFyYW0oImJhciIpIGZpbmFsIFN0cmluZyBiYXIsIEBQYXRoUGFyYW0oImJheiIpIGZpbmFsIFN0cmluZyBiYXopIHsKKyAgICAgICAgICAgIHJldHVybiBiYXIgKyAiLSIgKyBiYXo7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7YmFyOi4qfS97YmF6Oi4qfS90ZXN0UGFyYW1zIikKKyAgICAgICAgcHVibGljIFN0cmluZyBoZWxsb1dpdGhRdWVyeVBhcmFtcyhAUGF0aFBhcmFtKCJiYXIiKSBmaW5hbCBTdHJpbmcgYmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImJheiIpIGZpbmFsIFN0cmluZyBiYXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImJhciIpIGZpbmFsIFN0cmluZyBxdWVyeUJhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYmF6IikgZmluYWwgU3RyaW5nIHF1ZXJ5QmF6KSB7CisgICAgICAgICAgICByZXR1cm4gIlBBVEggUEFSQU06ICIgKyBiYXIgKyAiLSIgKyBiYXogKyAiLCBRVUVSWSBQQVJBTSAiICsgcXVlcnlCYXIgKyAiLSIgKyBxdWVyeUJhejsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntiYXI6Lip9L3tiYXo6Lip9L2VuY29kZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kZWQoQEVuY29kZWQgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtLmVxdWFscygiJTI1ZHVtbXkyMyUyQmEiKSArICI6IiArIHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvdGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gQ09OVEFJTkVSX1JFU1BPTlNFOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlc3BvbnNlIGNhbGwoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgVVJJIGhvc3RQb3J0ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikucG9ydChnZXRQb3J0KCkpLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBjbGllbnQoKS50YXJnZXQoaG9zdFBvcnQpLnBhdGgocGF0aCkucmVxdWVzdCgpLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRleHQgcGF0aCBjb25maWd1cmF0aW9uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICBVUkkgYmFzZVVyaSA9IHN1cGVyLmdldEJhc2VVcmkoKTsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShiYXNlVXJpKS5wYXRoKENPTlRFWFRfUEFUSCkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0VzY2FwZWRVcmlUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0VzY2FwZWRVcmlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhYTJjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvRXNjYXBlZFVyaVRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb250YWluZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEVzY2FwZWRVcmlUZXN0IGV4dGVuZHMgSmVyc2V5Q29udGFpbmVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgPSAiQ09OVEVOVCI7CisKKyAgICBAUGF0aCgieCUyMHkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXNjYXBlZFVyaVJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZXh0OworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgICAgIHB1YmxpYyBFc2NhcGVkVXJpUmVzb3VyY2UoKSB7CisgICAgICAgICAgICB0aGlzKCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFc2NhcGVkVXJpUmVzb3VyY2UoZmluYWwgU3RyaW5nIGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IGZpbmFsIFVyaUluZm8gaW5mbykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQgKyAiL3glMjB5IiwgaW5mby5nZXRBYnNvbHV0ZVBhdGgoKS5nZXRSYXdQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvIiwgaW5mby5nZXRCYXNlVXJpKCkuZ2V0UmF3UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0ICsgIi94IHkiLCAiLyIgKyBpbmZvLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dCArICIveCUyMHkiLCAiLyIgKyBpbmZvLmdldFBhdGgoZmFsc2UpKTsKKworICAgICAgICAgICAgcmV0dXJuIFJFU1BPTlNFOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm5vbi94IHkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uRXNjYXBlZFVyaVJlc291cmNlIGV4dGVuZHMgRXNjYXBlZFVyaVJlc291cmNlIHsKKworICAgICAgICBwdWJsaWMgTm9uRXNjYXBlZFVyaVJlc291cmNlKCkgeworICAgICAgICAgICAgc3VwZXIoIi9ub24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXNjYXBlZFVyaVJlc291cmNlLmNsYXNzLCBOb25Fc2NhcGVkVXJpUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVzY2FwZWQoKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJ4JTIweSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoUkVTUE9OU0UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25Fc2NhcGVkKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgibm9uL3ggeSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoUkVTUE9OU0UpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0dyaXp6bHlTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9Hcml6emx5U2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlmZGNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9Hcml6emx5U2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgSmVyc2V5IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBvZiBVUkwgcmVzb2x2aW5nLgorICogU2xhc2hlcyBiZWZvcmUgYSBjb250ZXh0IHBhdGggY2FuIGJlIG9taXR0ZWQgZGVwZW5kaW5nIG9uCisgKiB0aGUgZ2l2ZW4gcHJvcGVydHkuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBHcml6emx5U2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNsYXNoZXNXaXRoQ29udGV4dFBhdGhUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTbGFzaGVzKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKENPTlRFWFRfUEFUSCArICIvc2ltcGxlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhDT05UQUlORVJfUkVTUE9OU0UsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3VsdCA9IGNhbGwoIi8iICsgQ09OVEVYVF9QQVRIICsgIi9zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzdWx0ID0gY2FsbCgiLy8iICsgQ09OVEVYVF9QQVRIICsgIi9zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzdWx0ID0gY2FsbCgiLy8vIiArIENPTlRFWFRfUEFUSCArICIvc2ltcGxlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhDT05UQUlORVJfUkVTUE9OU0UsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3VsdCA9IGNhbGwoIi8vLy8iICsgQ09OVEVYVF9QQVRIICsgIi9zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xhc2hlc1dpdGhQYXRoUGFyYW0oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoIi8vIiArIENPTlRFWFRfUEFUSCArICIvcGF0aHBhcmFtL0NvbnRhaW5lci9SZXNwb25zZS90ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhDT05UQUlORVJfUkVTUE9OU0UsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsYXNoZXNXaXRoRW1wdHlQYXRoUGFyYW0oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoIi8vIiArIENPTlRFWFRfUEFUSCArICIvcGF0aHBhcmFtLy8vdGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi0iLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aEJlZ2lubmluZ0VtcHR5UGF0aFBhcmFtKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKCIvLyIgKyBDT05URVhUX1BBVEggKyAiLy8vdGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi0iLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkUXVlcnlQYXJhbXMoKSB7CisgICAgICAgIFVSSSBob3N0UG9ydCA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudCgpLnRhcmdldChob3N0UG9ydCkucGF0aCgiLy8iICsgQ09OVEVYVF9QQVRIICsgIi8vL2VuY29kZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICIlZHVtbXkyMythIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZTolMjVkdW1teTIzJTJCYSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xhc2hlc1dpdGhCZWdpbm5pbmdFbXB0eVBhdGhQYXJhbVdpdGhRdWVyeVBhcmFtcygpIHsKKyAgICAgICAgVVJJIGhvc3RQb3J0ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoZ2V0UG9ydCgpKS5idWlsZCgpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50KCkudGFyZ2V0KGhvc3RQb3J0KS5wYXRoKCIvLyIgKyBDT05URVhUX1BBVEggKyAiLy8vdGVzdFBhcmFtcyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImJhciIsICJDb250YWluZXIiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJiYXoiLCAiUmVzcG9uc2UiKTsKKworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBBVEggUEFSQU06IC0sIFFVRVJZIFBBUkFNIENvbnRhaW5lci1SZXNwb25zZSIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvR3ppcENvbnRlbnRFbmNvZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvR3ppcENvbnRlbnRFbmNvZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWM0NjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9HemlwQ29udGVudEVuY29kaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuR1ppcEVuY29kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuRW5jb2RpbmdGaWx0ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgR3ppcENvbnRlbnRFbmNvZGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlDb250YWluZXJUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEVuY29kaW5nRmlsdGVyLmNsYXNzLCBHWmlwRW5jb2Rlci5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBSZWFkZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbnB1dFN0cmVhbShuZXcgR1pJUElucHV0U3RyZWFtKGNvbnRleHQuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0VOQ09ESU5HLCAiZ3ppcCIpCisgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiR0VUIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcsICJnemlwIikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIlBPU1QiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9IZWFkVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9IZWFkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDNkMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0hlYWRUZXN0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamV0dHkuSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZS5TaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBIZWFkVGVzdCBleHRlbmRzIEplcnNleUNvbnRhaW5lclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxUZXN0Q29udGFpbmVyRmFjdG9yeT4gRkFDVE9SSUVTID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIG5ldyBHcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkoKSwKKyAgICAgICAgICAgIG5ldyBJbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5KCksCisgICAgICAgICAgICBuZXcgU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkoKSwKKyAgICAgICAgICAgIG5ldyBKZXR0eVRlc3RDb250YWluZXJGYWN0b3J5KCkpOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFRlc3RDb250YWluZXJGYWN0b3J5W10+IHBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEZBQ1RPUklFUy5zdHJlYW0oKS5tYXAoaW5wdXQgLT4gbmV3IFRlc3RDb250YWluZXJGYWN0b3J5W117aW5wdXR9KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgic3RyaW5nIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJieXRlIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGUoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJCeXRlQXJyYXlJbnB1dFN0cmVhbSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiR0VUIi5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRTdHJpbmcoKSB7CisgICAgICAgIF90ZXN0SGVhZCgic3RyaW5nIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZEJ5dGUoKSB7CisgICAgICAgIF90ZXN0SGVhZCgiYnl0ZSIsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZEJ5dGVBcnJheUlucHV0U3RyZWFtKCkgeworICAgICAgICBfdGVzdEhlYWQoIkJ5dGVBcnJheUlucHV0U3RyZWFtIiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RIZWFkKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KHBhdGgpLnJlcXVlc3QobWVkaWFUeXBlKS5oZWFkKCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBsZW5ndGhTdHIgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpOworICAgICAgICBhc3NlcnRUaGF0KGxlbmd0aFN0ciwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KEludGVnZXIucGFyc2VJbnQobGVuZ3RoU3RyKSwgaXMoMykpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLCBpcyhtZWRpYVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmRrU2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmRrU2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjI3NmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZGtTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IEplcnNleSBjb250YWluZXIgaW1wbGVtZW50YXRpb24gb2YgVVJMIHJlc29sdmluZy4KKyAqIEpESyBTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBzbGFzaGVzIGJlZm9yZSB0aGUgY29udGV4dC1wYXRoLAorICogaW4gY2FzZSBvZiBtdWx0aXBsZSBzbGFzaGVzIHNlcnZlciBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvY2Vzc2luZyBoYW5kbGVyIGFuZAorICogdGhlcmVmb3JlIEplcnNleSBSZXF1ZXN0IGNhbm5vdCBiZSBjcmVhdGVkIGFuZCBwcm9jZXNzZWQuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBKZGtTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdCBleHRlbmRzIEFic3RyYWN0U2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVNsYXNoZXMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoQ09OVEVYVF9QQVRIICsgIi9zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzdWx0ID0gY2FsbCgiLyIgKyBDT05URVhUX1BBVEggKyAiL3NpbXBsZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aFBhdGhQYXJhbSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbChDT05URVhUX1BBVEggKyAiL3BhdGhwYXJhbS9Db250YWluZXIvUmVzcG9uc2UvdGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aEVtcHR5UGF0aFBhcmFtKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKENPTlRFWFRfUEFUSCArICIvcGF0aHBhcmFtLy8vdGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi0iLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aEJlZ2lubmluZ0VtcHR5UGF0aFBhcmFtKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKENPTlRFWFRfUEFUSCArICIvLy90ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiLSIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsYXNoZXNXaXRoQmVnaW5uaW5nRW1wdHlQYXRoUGFyYW1XaXRoUXVlcnlQYXJhbXMoKSB7CisgICAgICAgIFVSSSBob3N0UG9ydCA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudCgpLnRhcmdldChob3N0UG9ydCkucGF0aChDT05URVhUX1BBVEggKyAiLy8vdGVzdFBhcmFtcyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImJhciIsICJDb250YWluZXIiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJiYXoiLCAiUmVzcG9uc2UiKTsKKworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBBVEggUEFSQU06IC0sIFFVRVJZIFBBUkFNIENvbnRhaW5lci1SZXNwb25zZSIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiZmFpbGluZyB3aXRoIEpESyBjb250YWluZXIuIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlZFF1ZXJ5UGFyYW1zKCkgeworICAgICAgICBVUkkgaG9zdFBvcnQgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvIikucG9ydChnZXRQb3J0KCkpLmJ1aWxkKCk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQoKS50YXJnZXQoaG9zdFBvcnQpLnBhdGgoIi8vIiArIENPTlRFWFRfUEFUSCArICIvLy9lbmNvZGVkIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicXVlcnkiLCAiJWR1bW15MjMrYSIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWU6JTI1ZHVtbXkyMyUyQmEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmVyc2V5MjQ2MlRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmVyc2V5MjQ2MlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2M4YzY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZXJzZXkyNDYyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb250YWluZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eS5KZXR0eVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc2ltcGxlLlNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yNDYyIG9uIEdyaXp6bHksIEpldHR5IGFuZCBTaW1wbGUgSFRUUCBzZXJ2ZXIuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoU3VpdGUuY2xhc3MpCitAU3VpdGUuU3VpdGVDbGFzc2VzKHtKZXJzZXkyNDYyVGVzdC5Hcml6emx5Q29udGFpbmVyVGVzdC5jbGFzcywKKyAgICAgICAgSmVyc2V5MjQ2MlRlc3QuSmV0dHlDb250YWluZXJUZXN0LmNsYXNzLAorICAgICAgICBKZXJzZXkyNDYyVGVzdC5TaW1wbGVDb250YWluZXJUZXN0LmNsYXNzfSkKK3B1YmxpYyBjbGFzcyBKZXJzZXkyNDYyVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfTlVNQkVSID0gInJlcXVlc3QtbnVtYmVyIjsKKworICAgIC8qKgorICAgICAqIFRlc3QgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICAgICAqLworICAgIEBQYXRoKCJlY2hvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVjaG9SZXNvdXJjZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVjaG9lcyB0aGUgaW5wdXQgbWVzc2FnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgaW5wdXQgbWVzc2FnZS4KKyAgICAgICAgICogQHJldHVybiBlY2hvZWQgaW5wdXQgbWVzc2FnZS4KKyAgICAgICAgICovCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygidGV4dC9wbGFpbiIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UgKyAiIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIHRlc3RpbmcgR3JpenpseSByZXF1ZXN0L3Jlc3BvbnNlIGluamVjdGlvbiBzdXBwb3J0IGludG8gc2luZ2xldG9uIHByb3ZpZGVycy4KKyAgICAgKi8KKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyaXp6bHlSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBQcm92aWRlcjxvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuUmVxdWVzdD4gZ3JpenpseVJlcXVlc3Q7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuUmVzcG9uc2UgZ3JpenpseVJlc3BvbnNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY3R4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIC8vIEZpcnN0LCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG51bGwgaW5qZWN0aW9ucy4KKyAgICAgICAgICAgIGlmIChncml6emx5UmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJHcml6emx5IFJlcXVlc3QgaXMgbnVsbC5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdyaXp6bHlSZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJHcml6emx5IFJlc3BvbnNlIGlzIG51bGwuXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGN0eC5hYm9ydFdpdGgoUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoc2IudG9TdHJpbmcoKSkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxldCdzIGFsc28gdGVzdCBzb21lIG1ldGhvZCBjYWxscworICAgICAgICAgICAgaW50IGZsYWdzID0gMDsKKworICAgICAgICAgICAgaWYgKCIvamVyc2V5LTI0NjIiLmVxdWFscyhncml6emx5UmVxdWVzdC5nZXQoKS5nZXRDb250ZXh0UGF0aCgpKSkgeworICAgICAgICAgICAgICAgIGZsYWdzICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWdyaXp6bHlSZXNwb25zZS5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgKz0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gZ3JpenpseVJlcXVlc3QuZ2V0KCkuZ2V0SGVhZGVyKFJFUVVFU1RfTlVNQkVSKTsKKworICAgICAgICAgICAgY3R4LnNldEVudGl0eVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oKCJmaWx0ZXJlZC0iICsgZmxhZ3MgKyAiLSIgKyBoZWFkZXIpLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JpenpseUNvbnRhaW5lclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIERlcGxveW1lbnRDb250ZXh0LmJ1aWxkZXIobmV3IFJlc291cmNlQ29uZmlnKEVjaG9SZXNvdXJjZS5jbGFzcywgR3JpenpseVJlcXVlc3RGaWx0ZXIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAuY29udGV4dFBhdGgoImplcnNleS0yNDYyIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjQ2MiBvbiBHcml6emx5IGNvbnRhaW5lci4KKyAgICAgICAgICovCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSZXFlc3RSZXBvbnNlSW5qZWN0aW9uSW50b1NpbmdsZXRvblByb3ZpZGVyKCkgeworICAgICAgICAgICAgSmVyc2V5MjQ2MlRlc3QudGVzdFJlcWVzdFJlcG9uc2VJbmplY3Rpb25JbnRvU2luZ2xldG9uUHJvdmlkZXIodGFyZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIHRlc3RpbmcgSmV0dHkgcmVxdWVzdC9yZXNwb25zZSBpbmplY3Rpb24gc3VwcG9ydCBpbnRvIHNpbmdsZXRvbiBwcm92aWRlcnMuCisgICAgICovCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXR0eVJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFByb3ZpZGVyPG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5SZXF1ZXN0PiBqZXR0eVJlcXVlc3Q7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBQcm92aWRlcjxvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuUmVzcG9uc2U+IGpldHR5UmVzcG9uc2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgLy8gRmlyc3QsIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbnVsbCBpbmplY3Rpb25zLgorICAgICAgICAgICAgaWYgKGpldHR5UmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJKZXR0eSBSZXF1ZXN0IGlzIG51bGwuXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqZXR0eVJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkpldHR5IFJlc3BvbnNlIGlzIG51bGwuXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGN0eC5hYm9ydFdpdGgoUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoc2IudG9TdHJpbmcoKSkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxldCdzIGFsc28gdGVzdCBzb21lIG1ldGhvZCBjYWxscworICAgICAgICAgICAgaW50IGZsYWdzID0gMDsKKworICAgICAgICAgICAgaWYgKCIvZWNobyIuZXF1YWxzKGpldHR5UmVxdWVzdC5nZXQoKS5nZXRQYXRoSW5mbygpKSkgeworICAgICAgICAgICAgICAgIGZsYWdzICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWpldHR5UmVzcG9uc2UuZ2V0KCkuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgICAgIGZsYWdzICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9IGpldHR5UmVxdWVzdC5nZXQoKS5nZXRIZWFkZXIoUkVRVUVTVF9OVU1CRVIpOworCisgICAgICAgICAgICBjdHguc2V0RW50aXR5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgoImZpbHRlcmVkLSIgKyBmbGFncyArICItIiArIGhlYWRlcikuZ2V0Qnl0ZXMoKSkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpldHR5Q29udGFpbmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQuYnVpbGRlcihuZXcgUmVzb3VyY2VDb25maWcoRWNob1Jlc291cmNlLmNsYXNzLCBKZXR0eVJlcXVlc3RGaWx0ZXIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpldHR5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjQ2MiBvbiBHcml6emx5IGNvbnRhaW5lci4KKyAgICAgICAgICovCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RSZXFlc3RSZXBvbnNlSW5qZWN0aW9uSW50b1NpbmdsZXRvblByb3ZpZGVyKCkgeworICAgICAgICAgICAgSmVyc2V5MjQ2MlRlc3QudGVzdFJlcWVzdFJlcG9uc2VJbmplY3Rpb25JbnRvU2luZ2xldG9uUHJvdmlkZXIodGFyZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIHRlc3RpbmcgU2ltcGxlIGZyYW1ld29yayByZXF1ZXN0L3Jlc3BvbnNlIGluamVjdGlvbiBzdXBwb3J0IGludG8gc2luZ2xldG9uIHByb3ZpZGVycy4KKyAgICAgKi8KKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIG9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5SZXF1ZXN0IHNpbXBsZVJlcXVlc3Q7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuUmVzcG9uc2Ugc2ltcGxlUmVzcG9uc2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgLy8gRmlyc3QsIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbnVsbCBpbmplY3Rpb25zLgorICAgICAgICAgICAgaWYgKHNpbXBsZVJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiU2ltcGxlIEhUVFAgZnJhbWV3b3JrIFJlcXVlc3QgaXMgbnVsbC5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpbXBsZVJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlNpbXBsZSBIVFRQIGZyYW1ld29yayBSZXNwb25zZSBpcyBudWxsLlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjdHguYWJvcnRXaXRoKFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KHNiLnRvU3RyaW5nKCkpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsZXQncyBhbHNvIHRlc3Qgc29tZSBtZXRob2QgY2FsbHMKKyAgICAgICAgICAgIGludCBmbGFncyA9IDA7CisKKyAgICAgICAgICAgIGlmICgiL2VjaG8iLmVxdWFscyhzaW1wbGVSZXF1ZXN0LmdldEFkZHJlc3MoKS5nZXRQYXRoKCkuZ2V0UGF0aCgpKSkgeworICAgICAgICAgICAgICAgIGZsYWdzICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNpbXBsZVJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICBmbGFncyArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBzaW1wbGVSZXF1ZXN0LmdldFZhbHVlKFJFUVVFU1RfTlVNQkVSKTsKKworICAgICAgICAgICAgY3R4LnNldEVudGl0eVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oKCJmaWx0ZXJlZC0iICsgZmxhZ3MgKyAiLSIgKyBoZWFkZXIpLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlQ29udGFpbmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQuYnVpbGRlcihuZXcgUmVzb3VyY2VDb25maWcoRWNob1Jlc291cmNlLmNsYXNzLCBTaW1wbGVSZXF1ZXN0RmlsdGVyLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNDYyIG9uIEdyaXp6bHkgY29udGFpbmVyLgorICAgICAgICAgKi8KKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFJlcWVzdFJlcG9uc2VJbmplY3Rpb25JbnRvU2luZ2xldG9uUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBKZXJzZXkyNDYyVGVzdC50ZXN0UmVxZXN0UmVwb25zZUluamVjdGlvbkludG9TaW5nbGV0b25Qcm92aWRlcih0YXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIG1ldGhvZCBmb3IgSkVSU0VZLTI0NjIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RSZXFlc3RSZXBvbnNlSW5qZWN0aW9uSW50b1NpbmdsZXRvblByb3ZpZGVyKFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiZWNobyIpLnJlcXVlc3QoKS5oZWFkZXIoUkVRVUVTVF9OVU1CRVIsIGkpCisgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS50ZXh0KCJ0ZXN0IiksIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAvLyBBc3NlcnQgdGhhdCB0aGUgcmVxdWVzdCBoYXMgYmVlbiBmaWx0ZXJlZCBhbmQgcHJvY2Vzc2VkIGJ5IHRoZSBlY2hvIG1ldGhvZC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRWNob1Jlc291cmNlKCkuZWNobygiZmlsdGVyZWQtMTEtIiArIGkpLCByZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0plcnNleUNvbnRhaW5lclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmVyc2V5Q29udGFpbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMmIwODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0plcnNleUNvbnRhaW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb250YWluZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuaW5tZW1vcnkuSW5NZW1vcnlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamV0dHkuSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm5ldHR5Lk5ldHR5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKZXJzZXlDb250YWluZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFRlc3RDb250YWluZXJGYWN0b3J5PiBGQUNUT1JJRVMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpLAorICAgICAgICAgICAgbmV3IEluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkoKSwKKyAgICAgICAgICAgIG5ldyBTaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeSgpLAorICAgICAgICAgICAgbmV3IEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeSgpLAorICAgICAgICAgICAgbmV3IEpldHR5VGVzdENvbnRhaW5lckZhY3RvcnkoKSwKKyAgICAgICAgICAgIG5ldyBOZXR0eVRlc3RDb250YWluZXJGYWN0b3J5KCkKKyAgICApOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFRlc3RDb250YWluZXJGYWN0b3J5W10+IHBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEZBQ1RPUklFUy5zdHJlYW0oKS5tYXAoaW5wdXQgLT4gbmV3IFRlc3RDb250YWluZXJGYWN0b3J5W117aW5wdXR9KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDApCisgICAgcHVibGljIFRlc3RDb250YWluZXJGYWN0b3J5IGZhY3Rvcnk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBmYWN0b3J5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmV0dHlFbXB0eUhlYWRlclBhcmFtVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZXR0eUVtcHR5SGVhZGVyUGFyYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmMDNjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmV0dHlFbXB0eUhlYWRlclBhcmFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamV0dHkuSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIEpldHR5IGdldEhlYWRlcigpIC0gcmV0dXJucyBudWxsIGluIHdoZW4gdGhlIGhlYWRlcgorICogaXMgbm90IHByZXNlbnQgYW5kIGV2ZW4gdGhvdWdoIHRoZSBoZWFkZXIgaXMgZW1wdHkgc3RyaW5nLgorICoKKyAqIElTU1VFOiBKRVJTRVktMjkxNworICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICogKi8KK3B1YmxpYyBjbGFzcyBKZXR0eUVtcHR5SGVhZGVyUGFyYW1UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlYWRlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlclJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBIZWFkZXJQYXJhbSgiYSIpIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmhlYWRlcigiYSIsICIiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCByZXNwb25zZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9MZWFkaW5nU2xhc2hlc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvTGVhZGluZ1NsYXNoZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliM2JkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvTGVhZGluZ1NsYXNoZXNUZXN0LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLkVuY29kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBKZXJzZXkgY29udGFpbmVyIGltcGxlbWVudGF0aW9uIG9mIFVSTCByZXNvbHZpbmcuCisgKiBJbiB0aGlzIHRlc3QgdGhlcmUgaXMgbm8gY29udGV4dCBwYXRoIHRoYXQgbWVhbnMgdGhhdAorICogc2xhc2hlcyBpbiBVUkwgYXJlIHBhcnQgb2YgUmVzb3VyY2UgYWRkcmVzcyBhbmQgY291bGRuJ3QKKyAqIGJlIGRlbGV0ZWQuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBMZWFkaW5nU2xhc2hlc1Rlc3QgZXh0ZW5kcyBKZXJzZXlDb250YWluZXJUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5FUl9SRVNQT05TRSA9ICJDb250YWluZXItUmVzcG9uc2UiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoU2ltcGxlUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgRW1wdHlSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBFbXB0eVBhdGhQYXJhbVJlc291cmNlLmNsYXNzKTsKKworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLlJFRFVDRV9DT05URVhUX1BBVEhfU0xBU0hFU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBQYXRoKCJzaW1wbGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBlbmNvZGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIENPTlRBSU5FUl9SRVNQT05TRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlQYXRoUGFyYW1SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2JhcjouKn0ve2JhejouKn0vdGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oQFBhdGhQYXJhbSgiYmFyIikgZmluYWwgU3RyaW5nIGJhciwgQFBhdGhQYXJhbSgiYmF6IikgZmluYWwgU3RyaW5nIGJheikgeworICAgICAgICAgICAgcmV0dXJuIGJhciArICItIiArIGJhejsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntiYXI6Lip9L3tiYXo6Lip9L3Rlc3RQYXJhbXMiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGhlbGxvV2l0aFF1ZXJ5UGFyYW1zKEBQYXRoUGFyYW0oImJhciIpIGZpbmFsIFN0cmluZyBiYXIsIEBQYXRoUGFyYW0oImJheiIpIGZpbmFsIFN0cmluZyBiYXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImJhciIpIGZpbmFsIFN0cmluZyBxdWVyeUJhciwgQFF1ZXJ5UGFyYW0oImJheiIpIGZpbmFsIFN0cmluZyBxdWVyeUJheikgeworICAgICAgICAgICAgcmV0dXJuICJQQVRIIFBBUkFNOiAiICsgYmFyICsgIi0iICsgYmF6ICsgIiwgUVVFUlkgUEFSQU0gIiArIHF1ZXJ5QmFyICsgIi0iICsgcXVlcnlCYXo7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7YmFyOi4qfS97YmF6Oi4qfS9lbmNvZGVkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGVkKEBFbmNvZGVkIEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbS5lcXVhbHMoIiUyNWR1bW15MjMlMkJhIikgKyAiOiIgKyBxdWVyeVBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL3Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuIENPTlRBSU5FUl9SRVNQT05TRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVNsYXNoZXMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoIi9zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzdWx0ID0gY2FsbCgiLy9zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xhc2hlc1dpdGhCZWdpbm5pbmdFbXB0eSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiL3Rlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xhc2hlc1dpdGhCZWdpbm5pbmdFbXB0eVBhdGhQYXJhbSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiLy8vdGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi0iLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aEJlZ2lubmluZ0VtcHR5UGF0aFBhcmFtV2l0aFF1ZXJ5UGFyYW1zKCkgeworICAgICAgICBVUkkgaG9zdFBvcnQgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvIikucG9ydChnZXRQb3J0KCkpLmJ1aWxkKCk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQoKS50YXJnZXQoaG9zdFBvcnQpLnBhdGgoIi8vL3Rlc3RQYXJhbXMiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJiYXIiLCAiQ29udGFpbmVyIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiYmF6IiwgIlJlc3BvbnNlIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQQVRIIFBBUkFNOiAtLCBRVUVSWSBQQVJBTSBDb250YWluZXItUmVzcG9uc2UiLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkUXVlcnlQYXJhbXMoKSB7CisgICAgICAgIFVSSSBob3N0UG9ydCA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudCgpLnRhcmdldChob3N0UG9ydCkucGF0aCgiLy8vZW5jb2RlZCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIiVkdW1teTIzK2EiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlOiUyNWR1bW15MjMlMkJhIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgUmVzcG9uc2UgY2FsbChTdHJpbmcgcGF0aCkgeworICAgICAgICBVUkkgaG9zdFBvcnQgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvIikucG9ydChnZXRQb3J0KCkpLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBjbGllbnQoKS50YXJnZXQoaG9zdFBvcnQpLnBhdGgocGF0aCkucmVxdWVzdCgpLmdldCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9NYXRyaXhQYXJhbVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvTWF0cml4UGFyYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5NmY0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvTWF0cml4UGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk1hdHJpeFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBNYXRyaXhQYXJhbVRlc3QgZXh0ZW5kcyBKZXJzZXlDb250YWluZXJUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBNYXRyaXhQYXJhbSgieCIpIGZpbmFsIFN0cmluZyB4LCBATWF0cml4UGFyYW0oInkiKSBmaW5hbCBTdHJpbmcgeSkgeworICAgICAgICAgICAgcmV0dXJuIHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRyaXhQYXJhbSgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5tYXRyaXhQYXJhbSgieSIsICIxIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygiMSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5tYXRyaXhQYXJhbSgieCIsICIxIikubWF0cml4UGFyYW0oInkiLCAiMSUyMCUyQiUyMDIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIxICsgMiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5tYXRyaXhQYXJhbSgieCIsICIxIikubWF0cml4UGFyYW0oInkiLCAiMSUyMCUyNiUyMDIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIxICYgMiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5tYXRyaXhQYXJhbSgieCIsICIxIikubWF0cml4UGFyYW0oInkiLCAiMSUyMCU3QyU3QyUyMDIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIxIHx8IDIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9RdWVyeVBhcmFtVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9RdWVyeVBhcmFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOTU0NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL1F1ZXJ5UGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5UGFyYW1UZXN0IGV4dGVuZHMgSmVyc2V5Q29udGFpbmVyVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFF1ZXJ5UGFyYW0oIngiKSBmaW5hbCBTdHJpbmcgeCwgQFF1ZXJ5UGFyYW0oInkiKSBmaW5hbCBTdHJpbmcgeSkgeworICAgICAgICAgICAgcmV0dXJuIHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnF1ZXJ5UGFyYW0oInkiLCAiMSAlMkIgMiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIjEgKyAyIikpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnF1ZXJ5UGFyYW0oIngiLCAiMSIpLnF1ZXJ5UGFyYW0oInkiLCAiMSArIDIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIxICsgMiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5xdWVyeVBhcmFtKCJ4IiwgIjEiKS5xdWVyeVBhcmFtKCJ5IiwgIjEgJTI2IDIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIxICYgMiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5xdWVyeVBhcmFtKCJ4IiwgIjEiKS5xdWVyeVBhcmFtKCJ5IiwgIjEgJTdDJTdDIDIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIxIHx8IDIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9SZXNwb25zZVdyaXRlck1ldGFkYXRhVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9SZXNwb25zZVdyaXRlck1ldGFkYXRhVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzU0ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL1Jlc3BvbnNlV3JpdGVyTWV0YWRhdGFUZXN0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuaW5tZW1vcnkuSW5NZW1vcnlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VXcml0ZXJNZXRhZGF0YVRlc3QgZXh0ZW5kcyBKZXJzZXlDb250YWluZXJUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsdWVIb2xkZXIgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBWYWx1ZUhvbGRlcihmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWx1ZUhvbGRlcldyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFZhbHVlSG9sZGVyPiB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgVHlwZSB0LCBmaW5hbCBBbm5vdGF0aW9uW10gYXMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBWYWx1ZUhvbGRlci5jbGFzcyA9PSBjOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBWYWx1ZUhvbGRlciBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBWYWx1ZUhvbGRlciBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGhlYWRlcnMuYWRkKCJYLUJFRk9SRS1XUklURSIsICJmb28iKTsKKyAgICAgICAgICAgIG91dC53cml0ZShzLnZhbHVlLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgaGVhZGVycy5hZGQoIlgtQUZURVItV1JJVEUiLCAiYmFyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgVmFsdWVIb2xkZXIgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUhvbGRlcigib25lIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBWYWx1ZUhvbGRlcldyaXRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc3BvbnNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIm9uZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlgtQkVGT1JFLVdSSVRFIiksIGlzKCJmb28iKSk7CisKKyAgICAgICAgaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBJbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5KSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiWC1BRlRFUi1XUklURSIpLCBpcygiYmFyIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlgtQUZURVItV1JJVEUiKSwgbnVsbFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9SZXNwb25zZVdyaXRlck91dHB1dFN0cmVhbVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvUmVzcG9uc2VXcml0ZXJPdXRwdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkY2JjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvUmVzcG9uc2VXcml0ZXJPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRoaXMgaXMgcmVhbGx5IHdlaXJkIGFwcHJvYWNoIGFuZCB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VXcml0ZXJPdXRwdXRTdHJlYW1UZXN0IGV4dGVuZHMgSmVyc2V5Q29udGFpbmVyVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgdm9pZCBnZXQoZmluYWwgQ29udGFpbmVyUmVxdWVzdCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYXNzZXJ0VGhhdChjb250ZXh0LmdldE1ldGhvZCgpLCBpcygiR0VUIikpOworCisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IG5ldyBDb250YWluZXJSZXNwb25zZShjb250ZXh0LCBSZXNwb25zZS5vaygpLmJ1aWxkKCkpOworICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG9zID0gY29udGV4dC5nZXRSZXNwb25zZVdyaXRlcigpCisgICAgICAgICAgICAgICAgICAgIC53cml0ZVJlc3BvbnNlU3RhdHVzQW5kSGVhZGVycygiUkVTT1VSQ0UiLmdldEJ5dGVzKCkubGVuZ3RoLCByZXNwb25zZSk7CisgICAgICAgICAgICBvcy53cml0ZSgiUkVTT1VSQ0UiLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoZmluYWwgQ29udGFpbmVyUmVxdWVzdCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYXNzZXJ0VGhhdChjb250ZXh0LmdldE1ldGhvZCgpLCBpcygiUE9TVCIpKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSBjb250ZXh0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUkVTT1VSQ0UiLCBzKTsKKworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgQ29udGFpbmVyUmVzcG9uc2UoY29udGV4dCwgUmVzcG9uc2Uub2soKS5idWlsZCgpKTsKKyAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvcyA9IGNvbnRleHQuZ2V0UmVzcG9uc2VXcml0ZXIoKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVSZXNwb25zZVN0YXR1c0FuZEhlYWRlcnMoIlJFU09VUkNFIi5nZXRCeXRlcygpLmxlbmd0aCwgcmVzcG9uc2UpOworICAgICAgICAgICAgb3Mud3JpdGUoIlJFU09VUkNFIi5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygiUkVTT1VSQ0UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUkVTT1VSQ0UiKSwgU3RyaW5nLmNsYXNzKSwgaXMoIlJFU09VUkNFIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKKyAgICAgICAgdGVzdEdldCgpOworICAgICAgICB0ZXN0UG9zdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvVHJhaWxpbmdTbGFzaFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvVHJhaWxpbmdTbGFzaFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVjYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9UcmFpbGluZ1NsYXNoVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFpbGluZ1NsYXNoVGVzdCBleHRlbmRzIEplcnNleUNvbnRhaW5lclRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImdldCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImdldC8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NsYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJnZXQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoImdldCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvQWNjZXNzVG9rZW5SZXNvdXJjZS5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL0FjY2Vzc1Rva2VuUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTEwODI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL0FjY2Vzc1Rva2VuUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5vYXV0aDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNlY3JldHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5pbnRlcm5hbC5PQXV0aFNlcnZlclJlcXVlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitAUGF0aCgiL2FjY2Vzc190b2tlbiIpCitwdWJsaWMgY2xhc3MgQWNjZXNzVG9rZW5SZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBPQXV0aDFTaWduYXR1cmUgb0F1dGgxU2lnbmF0dXJlOworCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgcG9zdChAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisKKyAgICAgICAgT0F1dGhTZXJ2ZXJSZXF1ZXN0IG9zciA9IG5ldyBPQXV0aFNlcnZlclJlcXVlc3QocmVxdWVzdCk7CisKKyAgICAgICAgT0F1dGgxU2VjcmV0cyBzZWNyZXRzID0gbmV3IE9BdXRoMVNlY3JldHMoKQorICAgICAgICAgICAgICAgIC5jb25zdW1lclNlY3JldCgia2Q5NGhmOTNrNDIza2Y0NCIpLnRva2VuU2VjcmV0KCJoZGhkMDI0NGs5ajdhbzAzIik7CisKKyAgICAgICAgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgT0F1dGgxUGFyYW1ldGVycygpLnJlYWRSZXF1ZXN0KG9zcik7CisKKyAgICAgICAgLy8gZW5zdXJlIHF1ZXJ5IHBhcmFtZXRlcnMgY29ycmVjdGx5IHBhcnNlZCBpbnRvIE9BdXRoIHBhcmFtZXRlcnMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0Q29uc3VtZXJLZXkoKSwgImRwZjQzZjNwMmw0azNsMDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRUb2tlbigpLCAiaGg1czkzajRoZGlkcG9sYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFNpZ25hdHVyZU1ldGhvZCgpLCAiUExBSU5URVhUIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0U2lnbmF0dXJlKCksIHNlY3JldHMuZ2V0Q29uc3VtZXJTZWNyZXQoKSArICImIiArIHNlY3JldHMuZ2V0VG9rZW5TZWNyZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0VGltZXN0YW1wKCksICIxMTkxMjQyMDkyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0Tm9uY2UoKSwgImRqaTQzMHNwbG14MzM0NDgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRWZXJzaW9uKCksICIxLjAiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBwbGFpbnRleHQgc2lnbmF0dXJlCisgICAgICAgICAgICBhc3NlcnRUcnVlKG9BdXRoMVNpZ25hdHVyZS52ZXJpZnkob3NyLCBwYXJhbXMsIHNlY3JldHMpKTsKKyAgICAgICAgfSBjYXRjaCAoT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIG9zZSkgeworICAgICAgICAgICAgZmFpbChvc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAib2F1dGhfdG9rZW49bm5jaDczNGQwMHNsMmpkayZvYXV0aF90b2tlbl9zZWNyZXQ9cGZra2RoaTlzbDNyNHMwMCI7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9PQXV0aDJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvT0F1dGgyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MzIzYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvT0F1dGgyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5vYXV0aDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDIuQ2xpZW50SWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgyLk9BdXRoMkNsaWVudFN1cHBvcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMi5PQXV0aDJDb2RlR3JhbnRGbG93OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDIuT0F1dGgyUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgyLlRva2VuUmVzdWx0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaGFzSXRlbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0cyBPQXV0aCAyIGNsaWVudC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBPQXV0aDJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEUgPSAiNDU2NGRzZjU0NjU0ZnNkYTY1NGFmIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ERSA9ICJjb2RlLXh5eiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9QVUJMSUMgPSAiY2xpZW50UHVibGljIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1NFQ1JFVCA9ICJjbGllbnRTZWNyZXQiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNb3h5SnNvbkZlYXR1cmUuY2xhc3MsIEF1dGhvcml6YXRpb25SZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRBbm9ueW1vdXNMb2dnZXIoKSwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgQFBhdGgoIm9hdXRoIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF1dGhvcml6YXRpb25SZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImFjY2Vzcy10b2tlbiIpCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgcHVibGljIE15VG9rZW5SZXN1bHQgZ2V0QWNjZXNzVG9rZW4oQEZvcm1QYXJhbSgiZ3JhbnRfdHlwZSIpIFN0cmluZyBncmFudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImNvZGUiKSBTdHJpbmcgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgicmVkaXJlY3RfdXJpIikgU3RyaW5nIHJlZGlyZWN0VXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJjbGllbnRfaWQiKSBTdHJpbmcgY2xpZW50SWQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdXRob3JpemF0aW9uX2NvZGUiLCBncmFudFR5cGUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidXJuOmlldGY6d2c6b2F1dGg6Mi4wOm9vYiIsIHJlZGlyZWN0VXJpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ09ERSwgY29kZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENMSUVOVF9QVUJMSUMsIGNsaWVudElkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFJlc3BvbnNlLnN0YXR1cyg0MDApLmVudGl0eShlLmdldE1lc3NhZ2UoKSkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE15VG9rZW5SZXN1bHQgbXlUb2tlblJlc3VsdCA9IG5ldyBNeVRva2VuUmVzdWx0KCk7CisgICAgICAgICAgICBteVRva2VuUmVzdWx0LnNldEFjY2Vzc1Rva2VuKCJhY2Nlc3MtdG9rZW4tYWFiOTk5ZiIpOworICAgICAgICAgICAgbXlUb2tlblJlc3VsdC5zZXRFeHBpcmVzSW4oIjM2MDAiKTsKKyAgICAgICAgICAgIG15VG9rZW5SZXN1bHQuc2V0VG9rZW5UeXBlKCJhY2Nlc3MtdG9rZW4iKTsKKyAgICAgICAgICAgIG15VG9rZW5SZXN1bHQuc2V0UmVmcmVzaFRva2VuKCJyZWZyZXNoLXh5eiIpOworICAgICAgICAgICAgcmV0dXJuIG15VG9rZW5SZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhdXRob3JpemF0aW9uIikKKyAgICAgICAgcHVibGljIFN0cmluZyBhdXRob3JpemF0aW9uKEBRdWVyeVBhcmFtKCJzdGF0ZSIpIFN0cmluZyBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJyZXNwb25zZV90eXBlIikgU3RyaW5nIHJlc3BvbnNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJzY29wZSIpIFN0cmluZyBzY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJyZWFkT25seSIpIFN0cmluZyByZWFkT25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJyZWRpcmVjdF91cmkiKSBTdHJpbmcgcmVkaXJlY3RVcmkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb2RlIiwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU1RBVEUsIHN0YXRlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInVybjppZXRmOndnOm9hdXRoOjIuMDpvb2IiLCByZWRpcmVjdFVyaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250YWN0Iiwgc2NvcGUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHJlYWRPbmx5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFJlc3BvbnNlLnN0YXR1cyg0MDApLmVudGl0eShlLmdldE1lc3NhZ2UoKSkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ09ERTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJyZWZyZXNoLXRva2VuIikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlZnJlc2hUb2tlbihARm9ybVBhcmFtKCJncmFudF90eXBlIikgU3RyaW5nIGdyYW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgicmVmcmVzaF90b2tlbiIpIFN0cmluZyByZWZyZXNoVG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiaXNBcnJheSIpIEBEZWZhdWx0VmFsdWUoImZhbHNlIikgYm9vbGVhbiBpc0FycmF5KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygicmVmcmVzaF90b2tlbiIsIGdyYW50VHlwZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZWZyZXNoLXh5eiIsIHJlZnJlc2hUb2tlbik7CisgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihSZXNwb25zZS5zdGF0dXMoNDAwKS5lbnRpdHkoZS5nZXRNZXNzYWdlKCkpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaXNBcnJheQorICAgICAgICAgICAgICAgICAgICA/ICJ7XCJhY2Nlc3NfdG9rZW5cIjpbXCJhY2Nlc3MtdG9rZW4tbmV3XCJdLFwiZXhwaXJlc19pblwiOlwiMzYwMFwiLFwidG9rZW5fdHlwZVwiOlwiYWNjZXNzLXRva2VuXCJ9IgorICAgICAgICAgICAgICAgICAgICA6ICJ7XCJhY2Nlc3NfdG9rZW5cIjpcImFjY2Vzcy10b2tlbi1uZXdcIixcImV4cGlyZXNfaW5cIjpcIjM2MDBcIixcInRva2VuX3R5cGVcIjpcImFjY2Vzcy10b2tlblwifSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbG93KCkgeworICAgICAgICB0ZXN0RmxvdyhmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rmxvd1dpdGhBcnJheUluUmVzcG9uc2UoKSB7CisgICAgICAgIHRlc3RGbG93KHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RmxvdyhmaW5hbCBib29sZWFuIGlzQXJyYXkpIHsKKyAgICAgICAgQ2xpZW50SWRlbnRpZmllciBjbGllbnRJZCA9IG5ldyBDbGllbnRJZGVudGlmaWVyKENMSUVOVF9QVUJMSUMsIENMSUVOVF9TRUNSRVQpOworICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aFVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoIm9hdXRoIikucGF0aCgiYXV0aG9yaXphdGlvbiIpLmJ1aWxkKCkudG9TdHJpbmcoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjY2Vzc1Rva2VuVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aCgib2F1dGgiKS5wYXRoKCJhY2Nlc3MtdG9rZW4iKS5idWlsZCgpLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZWZyZXNoVG9rZW5VcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJvYXV0aCIpLnBhdGgoInJlZnJlc2gtdG9rZW4iKS5idWlsZCgpLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdGF0ZSA9IFNUQVRFOworCisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBpZiAoaXNBcnJheSkgeworICAgICAgICAgICAgY2xpZW50LnJlZ2lzdGVyKG5ldyBDbGllbnRSZXF1ZXN0RmlsdGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLnB1dFNpbmdsZSgiaXNBcnJheSIsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgT0F1dGgyQ29kZUdyYW50Rmxvdy5CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgICAgIE9BdXRoMkNsaWVudFN1cHBvcnQuYXV0aG9yaXphdGlvbkNvZGVHcmFudEZsb3dCdWlsZGVyKGNsaWVudElkLCBhdXRoVXJpLCBhY2Nlc3NUb2tlblVyaSk7CisgICAgICAgIGZpbmFsIE9BdXRoMkNvZGVHcmFudEZsb3cgZmxvdyA9IGJ1aWxkZXIKKyAgICAgICAgICAgICAgICAuY2xpZW50KGNsaWVudCkKKyAgICAgICAgICAgICAgICAucmVmcmVzaFRva2VuVXJpKHJlZnJlc2hUb2tlblVyaSkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoT0F1dGgyQ29kZUdyYW50Rmxvdy5QaGFzZS5BVVRIT1JJWkFUSU9OLCAicmVhZE9ubHkiLCAidHJ1ZSIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KE9BdXRoMkNvZGVHcmFudEZsb3cuUGhhc2UuQVVUSE9SSVpBVElPTiwgT0F1dGgyUGFyYW1ldGVycy5TVEFURSwgc3RhdGUpCisgICAgICAgICAgICAgICAgLnNjb3BlKCJjb250YWN0IikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpbmFsQXV0aG9yaXphdGlvblVyaSA9IGZsb3cuc3RhcnQoKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkudGFyZ2V0KGZpbmFsQXV0aG9yaXphdGlvblVyaSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvZGUgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhDT0RFLCBjb2RlKTsKKworICAgICAgICBmaW5hbCBUb2tlblJlc3VsdCByZXN1bHQgPSBmbG93LmZpbmlzaChjb2RlLCBzdGF0ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWNjZXNzLXRva2VuLWFhYjk5OWYiLCByZXN1bHQuZ2V0QWNjZXNzVG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZygzNjAwKSwgcmVzdWx0LmdldEV4cGlyZXNJbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhY2Nlc3MtdG9rZW4iLCByZXN1bHQuZ2V0VG9rZW5UeXBlKCkpOworCisgICAgICAgIGZpbmFsIFRva2VuUmVzdWx0IHJlZnJlc2hSZXN1bHQgPSBmbG93LnJlZnJlc2hBY2Nlc3NUb2tlbihyZXN1bHQuZ2V0UmVmcmVzaFRva2VuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFjY2Vzcy10b2tlbi1uZXciLCByZWZyZXNoUmVzdWx0LmdldEFjY2Vzc1Rva2VuKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoMzYwMCksIHJlZnJlc2hSZXN1bHQuZ2V0RXhwaXJlc0luKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFjY2Vzcy10b2tlbiIsIHJlZnJlc2hSZXN1bHQuZ2V0VG9rZW5UeXBlKCkpOworCisgICAgICAgIGlmIChpc0FycmF5KSB7CisgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gYXJyYXkgPSAoQ29sbGVjdGlvbjxTdHJpbmc+KSByZWZyZXNoUmVzdWx0LmdldEFsbFByb3BlcnRpZXMoKS5nZXQoImFjY2Vzc190b2tlbiIpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KGFycmF5LnNpemUoKSwgaXMoMSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChhcnJheSwgaGFzSXRlbSgiYWNjZXNzLXRva2VuLW5ldyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUb2tlblJlc3VsdCB7CisKKyAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gImFjY2Vzc190b2tlbiIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGFjY2Vzc1Rva2VuOworICAgICAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAiZXhwaXJlc19pbiIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGV4cGlyZXNJbjsKKyAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gInRva2VuX3R5cGUiKQorICAgICAgICBwcml2YXRlIFN0cmluZyB0b2tlblR5cGU7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWZyZXNoVG9rZW4oKSB7CisgICAgICAgICAgICByZXR1cm4gcmVmcmVzaFRva2VuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVmcmVzaFRva2VuKFN0cmluZyByZWZyZXNoVG9rZW4pIHsKKyAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuOworICAgICAgICB9CisKKyAgICAgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gInJlZnJlc2hfdG9rZW4iKQorICAgICAgICBwcml2YXRlIFN0cmluZyByZWZyZXNoVG9rZW47CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBY2Nlc3NUb2tlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3NUb2tlbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc1Rva2VuKFN0cmluZyBhY2Nlc3NUb2tlbikgeworICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFeHBpcmVzSW4oKSB7CisgICAgICAgICAgICByZXR1cm4gZXhwaXJlc0luOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXhwaXJlc0luKFN0cmluZyBleHBpcmVzSW4pIHsKKyAgICAgICAgICAgIHRoaXMuZXhwaXJlc0luID0gZXhwaXJlc0luOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUb2tlblR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdG9rZW5UeXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VG9rZW5UeXBlKFN0cmluZyB0b2tlblR5cGUpIHsKKyAgICAgICAgICAgIHRoaXMudG9rZW5UeXBlID0gdG9rZW5UeXBlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL09BdXRoQ2xpZW50U2VydmVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL09BdXRoQ2xpZW50U2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzM2U3MjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvT0F1dGhDbGllbnRTZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLm9hdXRoOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5BY2Nlc3NUb2tlbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLkNvbnN1bWVyQ3JlZGVudGlhbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFBdXRob3JpemF0aW9uRmxvdzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUNsaWVudFN1cHBvcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5EZWZhdWx0T0F1dGgxUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVNlcnZlckZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGNvbS5zdW4uc2VjdXJpdHkuYXV0aC5Vc2VyUHJpbmNpcGFsOworCisvKioKKyAqIFRlc3RzIGNsaWVudCBhbmQgc2VydmVyIE9BdXRoIDEgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBPQXV0aENsaWVudFNlcnZlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNSRVRfQ09OU1VNRVJfS0VZID0gInNlY3JldC1jb25zdW1lci1rZXkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVU1FUl9LRVkgPSAibXktY29uc3VtZXIta2V5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1VNRVJfTkFNRSA9ICJteS1jb25zdW1lciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST01FVEhFVVNfVE9LRU4gPSAicHJvbWV0aGV1cy10b2tlbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST01FVEhFVVNfU0VDUkVUID0gInByb21ldGhldXMtc2VjcmV0IjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisKKyAgICAgICAgZmluYWwgRGVmYXVsdE9BdXRoMVByb3ZpZGVyIG9BdXRoUHJvdmlkZXIgPSBuZXcgRGVmYXVsdE9BdXRoMVByb3ZpZGVyKCk7CisgICAgICAgIG9BdXRoUHJvdmlkZXIucmVnaXN0ZXJDb25zdW1lcihDT05TVU1FUl9OQU1FLCBDT05TVU1FUl9LRVksCisgICAgICAgICAgICAgICAgU0VDUkVUX0NPTlNVTUVSX0tFWSwgbmV3IE11bHRpdmFsdWVkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisKKyAgICAgICAgZmluYWwgUHJpbmNpcGFsIHByb21ldGhldXNQcmluY2lwYWwgPSBuZXcgUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJwcm9tZXRoZXVzIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBvQXV0aFByb3ZpZGVyLmFkZEFjY2Vzc1Rva2VuKFBST01FVEhFVVNfVE9LRU4sIFBST01FVEhFVVNfU0VDUkVULCBDT05TVU1FUl9LRVksCisgICAgICAgICAgICAgICAgImh0dHA6Ly9jYWxsYmFjay51cmwiLCBwcm9tZXRoZXVzUHJpbmNpcGFsLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoImFkbWluIiwgInVzZXIiKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSksCisgICAgICAgICAgICAgICAgbmV3IE11bHRpdmFsdWVkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisgICAgICAgIGZpbmFsIE9BdXRoMVNlcnZlckZlYXR1cmUgb0F1dGgxU2VydmVyRmVhdHVyZSA9IG5ldyBPQXV0aDFTZXJ2ZXJGZWF0dXJlKG9BdXRoUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgInJlcXVlc3RUb2tlblNwZWNpYWxVcmkiLCAiYWNjZXNzVG9rZW5TcGVjaWFsVXJpIik7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG9BdXRoMVNlcnZlckZlYXR1cmUpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihNeVByb3RlY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoT0F1dGhDbGllbnRTZXJ2ZXJUZXN0LmNsYXNzLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKE9BdXRoQXV0aG9yaXphdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoT0F1dGgxU2VydmVyUHJvcGVydGllcy5USU1FU1RBTVBfVU5JVCwgIlNFQ09ORFMiKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoT0F1dGgxU2VydmVyUHJvcGVydGllcy5NQVhfTk9OQ0VfQ0FDSEVfU0laRSwgMjApOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UHJvdGVjdGVkUmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHNlY3VyaXR5Q29udGV4dC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImFkbWluIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRGb28oKSB7CisgICAgICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250ZXh0LmlzVXNlckluUm9sZSgiYWRtaW4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ1c2VyLWF1dGhvcml6YXRpb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT0F1dGhBdXRob3JpemF0aW9uUmVzb3VyY2UgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBPQXV0aDFQcm92aWRlciBwcm92aWRlcjsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbXVzdEJlR2V0TWV0aG9kKEBRdWVyeVBhcmFtKCJvYXV0aF90b2tlbiIpIFN0cmluZyB0b2tlbikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUb2tlbiByZWNlaXZlZCBmcm9tIHVzZXI6ICIgKyB0b2tlbik7CisgICAgICAgICAgICBmaW5hbCBEZWZhdWx0T0F1dGgxUHJvdmlkZXIgZGVmUHJvdmlkZXIgPSAoRGVmYXVsdE9BdXRoMVByb3ZpZGVyKSBwcm92aWRlcjsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2NvbnN1bWVyL2NhbGxiYWNrL2hvbWVyIiwgZGVmUHJvdmlkZXIuZ2V0UmVxdWVzdFRva2VuKHRva2VuKS5nZXRDYWxsYmFja1VybCgpKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlZlByb3ZpZGVyLmF1dGhvcml6ZVRva2VuKAorICAgICAgICAgICAgICAgICAgICBkZWZQcm92aWRlci5nZXRSZXF1ZXN0VG9rZW4odG9rZW4pLAorICAgICAgICAgICAgICAgICAgICBuZXcgVXNlclByaW5jaXBhbCgiaG9tZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJ1c2VyIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgY2xpZW50IGFuZCBzZXJ2ZXIgT0F1dGguCisgICAgICogPHAvPgorICAgICAqIFRlc3RzIGF1dGhvcml6YXRpb24gZmxvdyBpbmNsdWRpbmcgdGhlIHJlcXVlc3QgdG8gYSBwcm90ZWN0ZWQgcmVzb3VyY2UuIFRoZSB0ZXN0IHVzZXMge0BsaW5rIE9BdXRoMUF1dGhvcml6YXRpb25GbG93fQorICAgICAqIHRvIHBlcmZvcm0gdXNlciBhdXRob3JpemF0aW9uIGFuZCB1c2VzIGF1dGhvcml6ZWQgY2xpZW50IGZvciByZXF1ZXN0aW5nIHByb3RlY3RlZCByZXNvdXJjZS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIHJlc291cmNlIHtAbGluayBPQXV0aEF1dGhvcml6YXRpb25SZXNvdXJjZX0gaXMgdXNlZCB0byBwZXJmb3JtIHVzZXIgYXV0aG9yaXphdGlvbiAodGhpcyBpcyBkb25lCisgICAgICogcHJvZ3JhbW1hdGljYWxseSBmcm9tIHRoZSB0ZXN0KS4gRmluYWxseSwgdGhlIEFjY2VzcyBUb2tlbiBpcyByZXRyaWV2ZWQgYW5kIHVzZWQgdG8gcmVxdWVzdCB0aGUKKyAgICAgKiBwcm90ZWN0ZWQgcmVzb3VyY2UuIEluIHRoaXMgcmVzb3VyY2UgdGhlIHVzZXIgcHJpbmNpcGFsIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB1c2VyIHN0b3JlZAorICAgICAqIGluIHtAbGluayBTZWN1cml0eUNvbnRleHR9LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhvcml6YXRpb25GbG93KCkgeworICAgICAgICBTdHJpbmcgdGVtcENyZWRVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXF1ZXN0VG9rZW5TcGVjaWFsVXJpIikuYnVpbGQoKS50b1N0cmluZygpOworICAgICAgICBTdHJpbmcgYWNjZXNzVG9rZW5VcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJhY2Nlc3NUb2tlblNwZWNpYWxVcmkiKS5idWlsZCgpLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyB1c2VyQXV0aG9yaXphdGlvblVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoInVzZXItYXV0aG9yaXphdGlvbiIpLmJ1aWxkKCkudG9TdHJpbmcoKTsKKyAgICAgICAgZmluYWwgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3cgYXV0aEZsb3cgPSBPQXV0aDFDbGllbnRTdXBwb3J0CisgICAgICAgICAgICAgICAgLmJ1aWxkZXIobmV3IENvbnN1bWVyQ3JlZGVudGlhbHMoQ09OU1VNRVJfS0VZLCBTRUNSRVRfQ09OU1VNRVJfS0VZKSkKKyAgICAgICAgICAgICAgICAuYXV0aG9yaXphdGlvbkZsb3codGVtcENyZWRVcmksIGFjY2Vzc1Rva2VuVXJpLCB1c2VyQXV0aG9yaXphdGlvblVyaSkKKyAgICAgICAgICAgICAgICAuY2FsbGJhY2tVcmkoImh0dHA6Ly9jb25zdW1lci9jYWxsYmFjay9ob21lciIpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhVcmkgPSBhdXRoRmxvdy5zdGFydCgpOworICAgICAgICAvLyBhdXRob3JpemUgYnkgYSByZXF1ZXN0IHRvIGF1dGhvcml6YXRpb24gVVJJCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHVzZXJBdXRoUmVzcG9uc2UgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnRhcmdldChhdXRoVXJpKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHVzZXJBdXRoUmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgdmVyaWZpZXIgPSB1c2VyQXV0aFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWZXJpZmllcjogIiArIHZlcmlmaWVyKTsKKworICAgICAgICBhdXRoRmxvdy5maW5pc2godmVyaWZpZXIpOworICAgICAgICBmaW5hbCBDbGllbnQgYXV0aG9yaXplZENsaWVudCA9IGF1dGhGbG93LmdldEF1dGhvcml6ZWRDbGllbnQoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGF1dGhvcml6ZWRDbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJob21lciIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhdXRob3JpemVkQ2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIikucGF0aCgiYWRtaW4iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZXNwb25zZS5yZWFkRW50aXR5KGJvb2xlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFDbGllbnRGaWx0ZXJ9IGFscmVhZHkgY29uZmlndXJlZCB3aXRoIEFjY2VzcyBUb2tlbiBmb3Igc2lnbmF0dXJlCisgICAgICogcHVycG9zZXMgb25seS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0U2lnbmluZygpIHsKKyAgICAgICAgZmluYWwgRmVhdHVyZSBmaWx0ZXJGZWF0dXJlID0gT0F1dGgxQ2xpZW50U3VwcG9ydC5idWlsZGVyKAorICAgICAgICAgICAgICAgIG5ldyBDb25zdW1lckNyZWRlbnRpYWxzKENPTlNVTUVSX0tFWSwgU0VDUkVUX0NPTlNVTUVSX0tFWSkpLmZlYXR1cmUoKQorICAgICAgICAgICAgICAgIC5hY2Nlc3NUb2tlbihuZXcgQWNjZXNzVG9rZW4oUFJPTUVUSEVVU19UT0tFTiwgUFJPTUVUSEVVU19TRUNSRVQpKS5idWlsZCgpOworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmlsdGVyRmVhdHVyZSkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgVVJJIHJlc291cmNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKS5idWlsZCgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChyZXNvdXJjZVVyaSk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVxdWVzdDogIiArIGkpOworICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcm9tZXRoZXVzIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoImFkbWluIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlc3BvbnNlLnJlYWRFbnRpdHkoYm9vbGVhbi5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgY29uZmlndXJhdGlvbiBvZiB0aGUgbm9uY2UgY2FjaGUgb24gdGhlIHNlcnZlciBzaWRlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RTaWduaW5nV2l0aEV4Y2VlZGluZ0NhY2hlKCkgeworICAgICAgICBmaW5hbCBGZWF0dXJlIGZpbHRlckZlYXR1cmUgPSBPQXV0aDFDbGllbnRTdXBwb3J0LmJ1aWxkZXIoCisgICAgICAgICAgICAgICAgbmV3IENvbnN1bWVyQ3JlZGVudGlhbHMoQ09OU1VNRVJfS0VZLCBTRUNSRVRfQ09OU1VNRVJfS0VZKSkuZmVhdHVyZSgpCisgICAgICAgICAgICAgICAgLmFjY2Vzc1Rva2VuKG5ldyBBY2Nlc3NUb2tlbihQUk9NRVRIRVVTX1RPS0VOLCBQUk9NRVRIRVVTX1NFQ1JFVCkpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmaWx0ZXJGZWF0dXJlKS5idWlsZCgpOworICAgICAgICBmaW5hbCBVUkkgcmVzb3VyY2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KHJlc291cmNlVXJpKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXF1ZXN0OiAiICsgaSk7CisgICAgICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByb21ldGhldXMiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiYWRtaW4iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVzcG9uc2UucmVhZEVudGl0eShib29sZWFuLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbm93IHRoZSBub25jZSBjYWNoZSBpcyBmdWxsCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9PYXV0aENsaWVudEF1dGhvcml6YXRpb25GbG93VGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL09hdXRoQ2xpZW50QXV0aG9yaXphdGlvbkZsb3dUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3NzcyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9PYXV0aENsaWVudEF1dGhvcml6YXRpb25GbG93VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5vYXV0aDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5BY2Nlc3NUb2tlbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLkNvbnN1bWVyQ3JlZGVudGlhbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFBdXRob3JpemF0aW9uRmxvdzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFDbGllbnRTdXBwb3J0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLlBsYWludGV4dE1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBPYXV0aENsaWVudEF1dGhvcml6YXRpb25GbG93VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBY2Nlc3NUb2tlblJlc291cmNlLmNsYXNzLCBQaG90b3NSZXNvdXJjZS5jbGFzcywgUmVxdWVzdFRva2VuUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgT0F1dGgxU2lnbmF0dXJlRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIG1haW5seSB0aGUgY2xpZW50IGZ1bmN0aW9uYWxpdHkuIFRoZSB0ZXN0IGNsaWVudCByZWdpc3RlcnMKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFDbGllbnRGaWx0ZXJ9IGFuZCB1c2VzIHRoZSBmaWx0ZXIgb25seSB0byBzaWduIHJlcXVlc3RzLiBTbywgaXQgZG9lcyBub3QKKyAgICAgKiB1c2UgdGhlIGZpbHRlciB0byBwZXJmb3JtIGF1dGhvcml6YXRpb24gZmxvdy4gSG93ZXZlciwgZWFjaCByZXF1ZXN0IHRoYXQgdGhpcyB0ZXN0IHBlcmZvcm1zIGlzIGFjdHVhbGx5IGEgcmVxdWVzdCB1c2VkCisgICAgICogZHVyaW5nIHRoZSBhdXRob3JpemF0aW9uIGZsb3cuCisgICAgICogPHAvPgorICAgICAqIFRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGlzIHRlc3QgZXh0cmFjdHMgaGVhZGVyIGF1dGhvcml6YXRpb24gdmFsdWVzIGFuZCB0ZXN0cyB0aGF0IHNpZ25hdHVyZXMgYXJlCisgICAgICogY29ycmVjdCBmb3IgZWFjaCByZXF1ZXN0IHR5cGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T0F1dGhDbGllbnRGZWF0dXJlKCkgeworICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IGdldEJhc2VVcmkoKTsKKworICAgICAgICAvLyBiYXNlbGluZSBmb3IgcmVxdWVzdHMKKyAgICAgICAgZmluYWwgT0F1dGgxQnVpbGRlciBvQXV0aDFCdWlsZGVyID0gT0F1dGgxQ2xpZW50U3VwcG9ydC5idWlsZGVyKG5ldyBDb25zdW1lckNyZWRlbnRpYWxzKCJkcGY0M2YzcDJsNGszbDAzIiwKKyAgICAgICAgICAgICAgICAia2Q5NGhmOTNrNDIza2Y0NCIpKS50aW1lc3RhbXAoIjExOTEyNDIwOTAiKS5ub25jZSgiaHN1OTRqMzg4NGpkb3BzbCIpLnNpZ25hdHVyZU1ldGhvZChQbGFpbnRleHRNZXRob2QuTkFNRSkKKyAgICAgICAgICAgICAgICAudmVyc2lvbigiMS4wIik7CisgICAgICAgIGZpbmFsIEZlYXR1cmUgZmVhdHVyZSA9IG9BdXRoMUJ1aWxkZXIuZmVhdHVyZSgpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IGNsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChiYXNlVXJpKTsKKworICAgICAgICAvLyBzaW11bGF0ZSByZXF1ZXN0IGZvciBSZXF1ZXN0IFRva2VuICh0ZW1wb3JhcnkgY3JlZGVudGlhbHMpCisgICAgICAgIFN0cmluZyByZXNwb25zZUVudGl0eSA9IHRhcmdldC5wYXRoKCJyZXF1ZXN0X3Rva2VuIikucmVnaXN0ZXIoZmVhdHVyZSkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiZW50aXR5IiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlRW50aXR5LCAib2F1dGhfdG9rZW49aGg1czkzajRoZGlkcG9sYSZvYXV0aF90b2tlbl9zZWNyZXQ9aGRoZDAyNDRrOWo3YW8wMyIpOworCisgICAgICAgIGZpbmFsIEZlYXR1cmUgZmVhdHVyZTIgPSBvQXV0aDFCdWlsZGVyLnRpbWVzdGFtcCgiMTE5MTI0MjA5MiIpLm5vbmNlKCJkamk0MzBzcGxteDMzNDQ4IikuZmVhdHVyZSgpLmFjY2Vzc1Rva2VuKG5ldworICAgICAgICAgICAgICAgIEFjY2Vzc1Rva2VuKCJoaDVzOTNqNGhkaWRwb2xhIiwgImhkaGQwMjQ0azlqN2FvMDMiKSkuYnVpbGQoKTsKKworICAgICAgICAvLyBzaW11bGF0ZSByZXF1ZXN0IGZvciBBY2Nlc3MgVG9rZW4KKyAgICAgICAgcmVzcG9uc2VFbnRpdHkgPSB0YXJnZXQucGF0aCgiYWNjZXNzX3Rva2VuIikucmVnaXN0ZXIoZmVhdHVyZTIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoImVudGl0eSIsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZUVudGl0eSwgIm9hdXRoX3Rva2VuPW5uY2g3MzRkMDBzbDJqZGsmb2F1dGhfdG9rZW5fc2VjcmV0PXBma2tkaGk5c2wzcjRzMDAiKTsKKworICAgICAgICBmaW5hbCBGZWF0dXJlIGZlYXR1cmUzID0gb0F1dGgxQnVpbGRlci5ub25jZSgia2xsbzk5NDBwZDkzMzNqaCIpLnNpZ25hdHVyZU1ldGhvZCgiSE1BQy1TSEExIikudGltZXN0YW1wKCIxMTkxMjQyMDk2IikKKyAgICAgICAgICAgICAgICAuZmVhdHVyZSgpLmFjY2Vzc1Rva2VuKG5ldyBBY2Nlc3NUb2tlbigibm5jaDczNGQwMHNsMmpkayIsICJwZmtrZGhpOXNsM3I0czAwIikpLmJ1aWxkKCk7CisKKyAgICAgICAgLy8gYmFzZWQgb24gQWNjZXNzIFRva2VuCisgICAgICAgIHJlc3BvbnNlRW50aXR5ID0gdGFyZ2V0LnBhdGgoIi9waG90b3MiKS5yZWdpc3RlcihmZWF0dXJlMykucXVlcnlQYXJhbSgiZmlsZSIsICJ2YWNhdGlvbi5qcGciKS5xdWVyeVBhcmFtKCJzaXplIiwKKyAgICAgICAgICAgICAgICAib3JpZ2luYWwiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlRW50aXR5LCAiUEhPVE8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPQXV0aENsaWVudEZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IGdldEJhc2VVcmkoKS50b1N0cmluZygpOworCisgICAgICAgIGZpbmFsIE9BdXRoMUF1dGhvcml6YXRpb25GbG93IGF1dGhGbG93ID0gT0F1dGgxQ2xpZW50U3VwcG9ydAorICAgICAgICAgICAgICAgIC5idWlsZGVyKG5ldyBDb25zdW1lckNyZWRlbnRpYWxzKCJkcGY0M2YzcDJsNGszbDAzIiwgImtkOTRoZjkzazQyM2tmNDQiKSkKKyAgICAgICAgICAgICAgICAudGltZXN0YW1wKCIxMTkxMjQyMDkwIikKKyAgICAgICAgICAgICAgICAubm9uY2UoImhzdTk0ajM4ODRqZG9wc2wiKQorICAgICAgICAgICAgICAgIC5zaWduYXR1cmVNZXRob2QoIlBMQUlOVEVYVCIpCisgICAgICAgICAgICAgICAgLmF1dGhvcml6YXRpb25GbG93KAorICAgICAgICAgICAgICAgICAgICAgICAgdXJpICsgInJlcXVlc3RfdG9rZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJpICsgImFjY2Vzc190b2tlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1cmkgKyAiYXV0aG9yaXplIikKKyAgICAgICAgICAgICAgICAuZW5hYmxlTG9nZ2luZygpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgLy8gQ2hlY2sgd2UgaGF2ZSBjb3JyZWN0IGF1dGhvcml6YXRpb24gVVJJLgorICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aG9yaXphdGlvblVyaSA9IGF1dGhGbG93LnN0YXJ0KCk7CisgICAgICAgIGFzc2VydFRoYXQoYXV0aG9yaXphdGlvblVyaSwgY29udGFpbnNTdHJpbmcoImF1dGhvcml6ZT9vYXV0aF90b2tlbj1oaDVzOTNqNGhkaWRwb2xhIikpOworCisgICAgICAgIC8vIEZvciB0aGUgcHVycG9zZSBvZiB0aGUgdGVzdCBJIG5lZWQgcGFyYW1ldGVycyAoYW5kIHRoZXJlIGlzIG5vIHdheSBob3cgdG8gZG8gaXQgbm93KS4KKyAgICAgICAgZmluYWwgRmllbGQgcGFyYW1GaWVsZCA9IGF1dGhGbG93LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgicGFyYW1ldGVycyIpOworICAgICAgICBwYXJhbUZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIGZpbmFsIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zID0gKE9BdXRoMVBhcmFtZXRlcnMpIHBhcmFtRmllbGQuZ2V0KGF1dGhGbG93KTsKKworICAgICAgICAvLyBVcGRhdGUgcGFyYW1ldGVycy4KKyAgICAgICAgcGFyYW1zLnRpbWVzdGFtcCgiMTE5MTI0MjA5MiIpLm5vbmNlKCJkamk0MzBzcGxteDMzNDQ4Iik7CisKKyAgICAgICAgZmluYWwgQWNjZXNzVG9rZW4gYWNjZXNzVG9rZW4gPSBhdXRoRmxvdy5maW5pc2goKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhY2Nlc3NUb2tlbiwgZXF1YWxUbyhuZXcgQWNjZXNzVG9rZW4oIm5uY2g3MzRkMDBzbDJqZGsiLCAicGZra2RoaTlzbDNyNHMwMCIpKSk7CisKKyAgICAgICAgLy8gVXBkYXRlIHBhcmFtZXRlcnMgYmVmb3JlIGNyZWF0aW5nIGEgZmVhdHVyZSAoaS5lLiBjaGFuZ2luZyBzaWduYXR1cmUgbWV0aG9kKS4KKyAgICAgICAgcGFyYW1zLm5vbmNlKCJrbGxvOTk0MHBkOTMzM2poIikuc2lnbmF0dXJlTWV0aG9kKCJITUFDLVNIQTEiKS50aW1lc3RhbXAoIjExOTEyNDIwOTYiKTsKKworICAgICAgICAvLyBDaGVjayBBdXRob3JpemVkIENsaWVudC4KKyAgICAgICAgZmluYWwgQ2xpZW50IGZsb3dDbGllbnQgPSBhdXRoRmxvdy5nZXRBdXRob3JpemVkQ2xpZW50KCkucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIFN0cmluZyByZXNwb25zZUVudGl0eSA9IGZsb3dDbGllbnQudGFyZ2V0KHVyaSkucGF0aCgiL3Bob3RvcyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImZpbGUiLCAidmFjYXRpb24uanBnIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgic2l6ZSIsICJvcmlnaW5hbCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJGbG93IEF1dGhvcml6ZWQgQ2xpZW50IiwgcmVzcG9uc2VFbnRpdHksIGVxdWFsVG8oIlBIT1RPIikpOworCisgICAgICAgIC8vIENoZWNrIEZlYXR1cmUuCisgICAgICAgIGZpbmFsIENsaWVudCBmZWF0dXJlQ2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihhdXRoRmxvdy5nZXRPQXV0aDFGZWF0dXJlKCkpLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICByZXNwb25zZUVudGl0eSA9IGZlYXR1cmVDbGllbnQudGFyZ2V0KHVyaSkucGF0aCgiL3Bob3RvcyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImZpbGUiLCAidmFjYXRpb24uanBnIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgic2l6ZSIsICJvcmlnaW5hbCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJGZWF0dXJlIENsaWVudCIsIHJlc3BvbnNlRW50aXR5LCBlcXVhbFRvKCJQSE9UTyIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvUGhvdG9zUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9QaG90b3NSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Y2MyY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvUGhvdG9zUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5vYXV0aDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTZWNyZXRzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuaW50ZXJuYWwuT0F1dGhTZXJ2ZXJSZXF1ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworQFBhdGgoIi9waG90b3MiKQorcHVibGljIGNsYXNzIFBob3Rvc1Jlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIE9BdXRoMVNpZ25hdHVyZSBvQXV0aDFTaWduYXR1cmU7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGhhbmRsZSgKKyAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJmaWxlIikgU3RyaW5nIGZpbGUsCisgICAgICAgICAgICBAUXVlcnlQYXJhbSgic2l6ZSIpIFN0cmluZyBzaXplLAorICAgICAgICAgICAgQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworCisgICAgICAgIE9BdXRoU2VydmVyUmVxdWVzdCBvc3IgPSBuZXcgT0F1dGhTZXJ2ZXJSZXF1ZXN0KHJlcXVlc3QpOworCisgICAgICAgIE9BdXRoMVNlY3JldHMgc2VjcmV0cyA9IG5ldyBPQXV0aDFTZWNyZXRzKCkKKyAgICAgICAgICAgICAgICAuY29uc3VtZXJTZWNyZXQoImtkOTRoZjkzazQyM2tmNDQiKS50b2tlblNlY3JldCgicGZra2RoaTlzbDNyNHMwMCIpOworCisgICAgICAgIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IE9BdXRoMVBhcmFtZXRlcnMoKS5yZWFkUmVxdWVzdChvc3IpOworCisgICAgICAgIC8vIGVuc3VyZSBxdWVyeSBwYXJhbWV0ZXJzIGFyZSBhcyBleHBlY3RlZAorICAgICAgICBhc3NlcnRFcXVhbHMoZmlsZSwgInZhY2F0aW9uLmpwZyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZSwgIm9yaWdpbmFsIik7CisKKyAgICAgICAgLy8gZW5zdXJlIHF1ZXJ5IHBhcmFtZXRlcnMgY29ycmVjdGx5IHBhcnNlZCBpbnRvIE9BdXRoIHBhcmFtZXRlcnMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0Q29uc3VtZXJLZXkoKSwgImRwZjQzZjNwMmw0azNsMDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRUb2tlbigpLCAibm5jaDczNGQwMHNsMmpkayIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFNpZ25hdHVyZU1ldGhvZCgpLCAiSE1BQy1TSEExIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0VGltZXN0YW1wKCksICIxMTkxMjQyMDk2Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0Tm9uY2UoKSwgImtsbG85OTQwcGQ5MzMzamgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRWZXJzaW9uKCksICIxLjAiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBITUFDLVNIQTEgc2lnbmF0dXJlCisgICAgICAgICAgICBhc3NlcnRUcnVlKG9BdXRoMVNpZ25hdHVyZS52ZXJpZnkob3NyLCBwYXJhbXMsIHNlY3JldHMpKTsKKyAgICAgICAgfSBjYXRjaCAoT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIG9zZSkgeworICAgICAgICAgICAgZmFpbChvc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAiUEhPVE8iOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL1JlcXVlc3RUb2tlblJlc291cmNlLmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvUmVxdWVzdFRva2VuUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDU1ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL1JlcXVlc3RUb2tlblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUub2F1dGg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTZWNyZXRzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuaW50ZXJuYWwuT0F1dGhTZXJ2ZXJSZXF1ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworQFBhdGgoIi9yZXF1ZXN0X3Rva2VuIikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0VG9rZW5SZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBPQXV0aDFTaWduYXR1cmUgb0F1dGgxU2lnbmF0dXJlOworCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKworICAgICAgICBPQXV0aFNlcnZlclJlcXVlc3Qgb3NyID0gbmV3IE9BdXRoU2VydmVyUmVxdWVzdChyZXF1ZXN0KTsKKworICAgICAgICBPQXV0aDFTZWNyZXRzIHNlY3JldHMgPSBuZXcgT0F1dGgxU2VjcmV0cygpLmNvbnN1bWVyU2VjcmV0KCJrZDk0aGY5M2s0MjNrZjQ0Iik7CisKKyAgICAgICAgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgT0F1dGgxUGFyYW1ldGVycygpLnJlYWRSZXF1ZXN0KG9zcik7CisKKyAgICAgICAgLy8gZW5zdXJlIHBhcmFtZXRlcnMgY29ycmVjdGx5IHBhcnNlZCBpbnRvIE9BdXRoIHBhcmFtZXRlcnMgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0Q29uc3VtZXJLZXkoKSwgImRwZjQzZjNwMmw0azNsMDMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRTaWduYXR1cmVNZXRob2QoKSwgIlBMQUlOVEVYVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFNpZ25hdHVyZSgpLCBzZWNyZXRzLmdldENvbnN1bWVyU2VjcmV0KCkgKyAiJiIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFRpbWVzdGFtcCgpLCAiMTE5MTI0MjA5MCIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldE5vbmNlKCksICJoc3U5NGozODg0amRvcHNsIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0VmVyc2lvbigpLCAiMS4wIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHZlcmlmeSB0aGUgcGxhaW50ZXh0IHNpZ25hdHVyZQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvQXV0aDFTaWduYXR1cmUudmVyaWZ5KG9zciwgcGFyYW1zLCBzZWNyZXRzKSk7CisgICAgICAgIH0gY2F0Y2ggKE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbiBvc2UpIHsKKyAgICAgICAgICAgIGZhaWwob3NlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gIm9hdXRoX3Rva2VuPWhoNXM5M2o0aGRpZHBvbGEmb2F1dGhfdG9rZW5fc2VjcmV0PWhkaGQwMjQ0azlqN2FvMDMiOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc29uYXIvU29uYXJKZXJzZXlFMkVUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc29uYXIvU29uYXJKZXJzZXlFMkVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxMjQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zb25hci9Tb25hckplcnNleUUyRVRlc3QuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zb25hcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNvbmFyLlNvbmFySmVyc2V5Q29tbW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zb25hci5Tb25hckplcnNleVNlcnZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU29uYXJKZXJzZXlFMkVUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleUNvbW1vbkUyRSgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiY29tbW9uIGUyZSIsIG5ldyBTb25hckplcnNleUNvbW1vbigpLmUyZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXlDb3JlRTJFKCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJzZXJ2ZXIgZTJlIiwgbmV3IFNvbmFySmVyc2V5U2VydmVyKCkuZTJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNWM3YTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlCkBAIC0wLDAgKzEsMyBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5BdXRvRGlzY292ZXJhYmxlVGVzdCRDb21tb25BdXRvRGlzY292ZXJhYmxlCitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLkF1dG9EaXNjb3ZlcmFibGVUZXN0JENsaWVudEF1dG9EaXNjb3ZlcmFibGUKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uQXV0b0Rpc2NvdmVyYWJsZVRlc3QkU2VydmVyQXV0b0Rpc2NvdmVyYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NWJkNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlCkBAIC0wLDAgKzEsMyBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlVGVzdCRDb21tb25BdXRvRGlzY292ZXJhYmxlCitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGVUZXN0JENsaWVudEF1dG9EaXNjb3ZlcmFibGUKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZVRlc3QkU2VydmVyQXV0b0Rpc2NvdmVyYWJsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvdGVzdHMvZTJlL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzRlZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitsb2c0ai5yb290Q2F0ZWdvcnk9QUxMLCBzdGRvdXQKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJTMwLjMwY3sxfV0gLSAlbSVuCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dApkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkYzM0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3BvbS54bWwKQEAgLTAsMCArMSw4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yMy1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yOTg4PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yOTg4PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBSZXByb2R1Y2VyIG9mIEpFUlNFWS0yOTg4LgorCisgICAgICAgIEplcnNleSBkb2VzIG5vdCBzZXQgbG9jYXRvciBwcm9wZXJseSBmb3IgU2luZ2xlSGsyTG9jYXRvck1hbmFnZXIuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8IS0tIEplcnNleSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gV2VsZCAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC1FRFIxPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmpib3NzLndlbGQuc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPndlbGQtc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My4wLjAuQWxwaGExMzwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9Db250ZXh0QXdhcmVCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvQ29udGV4dEF3YXJlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjdlNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvQ29udGV4dEF3YXJlQmVhbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjk4ODsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgQ29udGV4dEF3YXJlQmVhbiB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBmaWVsZDsKKworICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBzZXR0ZXI7CisKKyAgICBwdWJsaWMgUmVzcG9uc2UgZmllbGRDb25maWcoKSB7CisgICAgICAgIHJldHVybiBmaWVsZCA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICA6IFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzcG9uc2Ugc2V0dGVyQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2V0dGVyID09IG51bGwKKyAgICAgICAgICAgICAgICA/IFJlc3BvbnNlLnNlcnZlckVycm9yKCkuYnVpbGQoKQorICAgICAgICAgICAgICAgIDogUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgIH0KKworICAgIEBDb250ZXh0CisgICAgcHVibGljIHZvaWQgc2V0Q29uZmlnKENvbmZpZ3VyYXRpb24gc2V0dGVyKSB7CisgICAgICAgIHRoaXMuc2V0dGVyID0gc2V0dGVyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L0ZpZWxkQ29udGV4dEV4Y2VwdGlvbk1hcHBlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L0ZpZWxkQ29udGV4dEV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGRkMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvRmllbGRDb250ZXh0RXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyOTg4OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRmllbGRDb250ZXh0RXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4geworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIEh0dHBIZWFkZXJzIGZpZWxkOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTIwKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIngtdGVzdC1oZWFkZXIiLCBmaWVsZC5nZXRIZWFkZXJTdHJpbmcoIngtdGVzdC1oZWFkZXIiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvU2V0dGVyQ29udGV4dEV4Y2VwdGlvbk1hcHBlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L1NldHRlckNvbnRleHRFeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTUzZTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L1NldHRlckNvbnRleHRFeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI5ODg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBTZXR0ZXJDb250ZXh0RXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE51bGxQb2ludGVyRXhjZXB0aW9uPiB7CisKKyAgICBwcml2YXRlIEh0dHBIZWFkZXJzIHNldHRlcjsKKworICAgIEBDb250ZXh0CisgICAgcHVibGljIHZvaWQgc2V0U2V0dGVyKEh0dHBIZWFkZXJzIHNldHRlcikgeworICAgICAgICB0aGlzLnNldHRlciA9IHNldHRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDUyMCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJ4LXRlc3QtaGVhZGVyIiwgc2V0dGVyLmdldEhlYWRlclN0cmluZygieC10ZXN0LWhlYWRlciIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTAyYmZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjk4ODsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uIHsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L1Rlc3RSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L1Rlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMThmZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvVGVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyOTg4OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworQFBhdGgoIi90ZXN0IikKK3B1YmxpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQ29udGV4dEF3YXJlQmVhbiBjb250ZXh0QXdhcmVCZWFuOworCisgICAgQEdFVAorICAgIEBQYXRoKCJmaWVsZCIpCisgICAgcHVibGljIFJlc3BvbnNlIGZpZWxkKCkgeworICAgICAgICByZXR1cm4gY29udGV4dEF3YXJlQmVhbi5maWVsZENvbmZpZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgic2V0dGVyIikKKyAgICBwdWJsaWMgUmVzcG9uc2Ugc2V0dGVyKCkgeworICAgICAgICByZXR1cm4gY29udGV4dEF3YXJlQmVhbi5zZXR0ZXJDb25maWcoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImV4L2ZpZWxkIikKKyAgICBwdWJsaWMgU3RyaW5nIGZpZWxkRXhjZXB0aW9uTWFwcGVyKCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNeSBoYW5kbGVkIGV4Y2VwdGlvbi4iKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImV4L3NldHRlciIpCisgICAgcHVibGljIFN0cmluZyBzZXR0ZXJFeGNlcHRpb25NYXBwZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTXkgaGFuZGxlZCBleGNlcHRpb24uIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjZDZlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvYmVhbnNfMV8xLnhzZCIKKyAgICAgICB2ZXJzaW9uPSIxLjEiIGJlYW4tZGlzY292ZXJ5LW1vZGU9ImFsbCI+CisKKzwvYmVhbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS13ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjY5MjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktd2ViLnhtbApAQCAtMCwwICsxLDI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgQ29uZmlndXJlIFBVQkxJQyAiLS8vSmV0dHkvL0NvbmZpZ3VyZS8vRU4iICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pldHR5L2NvbmZpZ3VyZS5kdGQiPgorPENvbmZpZ3VyZSBjbGFzcz0ib3JnLmVjbGlwc2UuamV0dHkud2ViYXBwLldlYkFwcENvbnRleHQiPgorICAgIDxTZXQgbmFtZT0ic2VydmVyQ2xhc3NlcyI+CisgICAgICAgIDxBcnJheSB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIj4KKyAgICAgICAgICAgIDxJdGVtPi1vcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0SGFuZGxlci5EZWNvcmF0b3I8L0l0ZW0+CisgICAgICAgIDwvQXJyYXk+CisgICAgPC9TZXQ+Cis8L0NvbmZpZ3VyZT4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9KZXJzZXkyOTg4SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvSmVyc2V5Mjk4OElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmM0OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvSmVyc2V5Mjk4OElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjk4ODsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogSkVSU0VZLTI5ODggcmVwcm9kdWNlciBhbmQgSkVSU0VZLTI5OTAgKGR1cGxpY2F0ZSBvZiB0aGUgcHJldmlvdXMgb25lKQorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5Mjk4OElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9OQU1FID0gIngtdGVzdC1oZWFkZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVkFMVUUgPSAiY29vbC1oZWFkZXIiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yOTg4CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29udGV4dEZpZWxkSW5qZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDZGlCZWFuQ29udGV4dEluamVjdGlvbigiZmllbGQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbnRleHRTZXR0ZXJJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENkaUJlYW5Db250ZXh0SW5qZWN0aW9uKCJzZXR0ZXIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENkaUJlYW5Db250ZXh0SW5qZWN0aW9uKFN0cmluZyBwYXRoKSB7CisgICAgICAgIGludCBzdGF0dXMgPSB0YXJnZXQoInRlc3QvIiArIHBhdGgpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAyMDApIHsKKyAgICAgICAgICAgIGZhaWwoIkBDb250ZXh0IGZpZWxkIGlzIG5vdCBwcm9wZXJseSBpbmplY3RlZCBpbnRvIENESSBCZWFuLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI5OTAKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RmllbGRJbmplY3Rpb25FeGNlcHRpb25NYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEV4Y2VwdGlvbk1hcHBlckNvbnRleHRJbmplY3Rpb24oImZpZWxkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0U2V0dGVyRXhjZXB0aW9uTWFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RFeGNlcHRpb25NYXBwZXJDb250ZXh0SW5qZWN0aW9uKCJzZXR0ZXIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEV4Y2VwdGlvbk1hcHBlckNvbnRleHRJbmplY3Rpb24oU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInRlc3QvZXgvIiArIHBhdGgpLnJlcXVlc3QoKS5oZWFkZXIoSEVBREVSX05BTUUsIEhFQURFUl9WQUxVRSkuZ2V0KCk7CisgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXMoKSAhPSA1MjAgfHwgIUhFQURFUl9WQUxVRS5lcXVhbHMocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEhFQURFUl9OQU1FKSkpIHsKKyAgICAgICAgICAgIGZhaWwoIkBDb250ZXh0IG1ldGhvZCB3YXMgbm90IHByb3Blcmx5IGluamVjdGVkIGludG8gRXhjZXB0aW9uTWFwcGVyLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOGNkOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3BvbS54bWwKQEAgLTAsMCArMSw3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmFzeW5jLWplcnNleS1maWx0ZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LWFzeW5jLWZpbHRlcjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhpcyB3ZWIgcHJvamVjdCByZXByb2R1Y2VzIHRpY2tldHM6CisgICAgICAgIEpFUlNFWS0yNzMwCisgICAgICAgIEpFUlNFWS0yODEyCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzZmExNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmFzeW5jOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMC5UZXN0RXhjZXB0aW9uUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMC5leGNlcHRpb24uTWFwcGVkRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4MTIuVGVzdFdhaXRSZXNvdXJjZTsKKworLyoqCisgKiBKZXJzZXkgYXBwbGljYXRpb24gZm9yIEpFUlNFWS0yNzMwLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFRlc3RBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoVGVzdEV4Y2VwdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoTWFwcGVkRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoVGVzdFdhaXRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvVGVzdEV4Y2VwdGlvblJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjczMC9UZXN0RXhjZXB0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTMxNzYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvVGVzdEV4Y2VwdGlvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5SZXNwb25zZVdyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLmV4Y2VwdGlvbi5NYXBwZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMC5leGNlcHRpb24uVW5tYXBwZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMC5leGNlcHRpb24uVW5tYXBwZWRSdW50aW1lRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9leGNlcHRpb24iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFRlc3RFeGNlcHRpb25SZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aHJlYWQgdGhhdCB3YXMgcHJvY2Vzc2luZyBhIGxhc3QgcmVxdWVzdCB0byB0aGlzIHJlc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgVGhyZWFkIGxhc3RQcm9jZXNzaW5nVGhyZWFkOworCisgICAgQEdFVAorICAgIEBQYXRoKCJudWxsIikKKyAgICBwdWJsaWMgdm9pZCBnZXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgbGFzdFByb2Nlc3NpbmdUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZSgoVGhyb3dhYmxlKSBudWxsKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1hcHBlZCIpCisgICAgcHVibGljIHZvaWQgZ2V0TWFwcGVkRXhjZXB0aW9uKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIGxhc3RQcm9jZXNzaW5nVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IE1hcHBlZEV4Y2VwdGlvbigpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInVubWFwcGVkIikKKyAgICBwdWJsaWMgdm9pZCBnZXRVbm1hcHBlZEV4Y2VwdGlvbihAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBsYXN0UHJvY2Vzc2luZ1RocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG5ldyBVbm1hcHBlZEV4Y2VwdGlvbigpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJ1bnRpbWUiKQorICAgIHB1YmxpYyB2b2lkIGdldFVubWFwcGVkUnVudGltZUV4Y2VwdGlvbihAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBsYXN0UHJvY2Vzc2luZ1RocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG5ldyBVbm1hcHBlZFJ1bnRpbWVFeGNlcHRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdGhyZWFkIHRoYXQgd2FzIHByb2Nlc3NpbmcgYSBsYXN0IHJlcXVlc3QgZ290IHN0dWNrIGluIHtAbGluayBSZXNwb25zZVdyaXRlcn0uCisgICAgICogPHAvPgorICAgICAqIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB0aGUgbGFzdCBwcm9jZXNzaW5nIHRocmVhZCBzaG91bGQgcmV0dXJuIGJhY2sgdG8gdGhlIHNlcnZsZXQgY29udGFpbmVyCisgICAgICogYW5kIGl0cyBwb29sLgorICAgICAqIDxwLz4KKyAgICAgKiBNYXkgbm90IHdvcmsgd2hlbiBleGVjdXRlZCBpbiBwYXJhbGxlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoInJwYy9sYXN0dGhyZWFkc3R1Y2siKQorICAgIHB1YmxpYyBib29sZWFuIGxhc3RUaHJlYWRTdHVja1JwYygpIHsKKyAgICAgICAgaWYgKGxhc3RQcm9jZXNzaW5nVGhyZWFkID09IG51bGwgfHwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSBsYXN0UHJvY2Vzc2luZ1RocmVhZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChsYXN0UHJvY2Vzc2luZ1RocmVhZC5nZXRTdGF0ZSgpKSB7CisgICAgICAgICAgICBjYXNlIEJMT0NLRUQ6CisgICAgICAgICAgICBjYXNlIFRJTUVEX1dBSVRJTkc6CisgICAgICAgICAgICBjYXNlIFdBSVRJTkc6CisgICAgICAgICAgICAgICAgZm9yIChTdGFja1RyYWNlRWxlbWVudCBzdGFja1RyYWNlRWxlbWVudCA6IGxhc3RQcm9jZXNzaW5nVGhyZWFkLmdldFN0YWNrVHJhY2UoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2VXcml0ZXIuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhzdGFja1RyYWNlRWxlbWVudC5nZXRDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL2V4Y2VwdGlvbi9NYXBwZWRFeGNlcHRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL2V4Y2VwdGlvbi9NYXBwZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzBhYjBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL01hcHBlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMC5leGNlcHRpb247CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gd2lsbCBnZXQgbWFwcGVkIHRvIGEgNDMyIHJlc3BvbnNlIHdpdGggdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiBtYXBwZXIKKyAqIGltcGxlbWVudGVkIGJ5IHtAbGluayBNYXBwZWRFeGNlcHRpb25NYXBwZXJ9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hcHBlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL2V4Y2VwdGlvbi9NYXBwZWRFeGNlcHRpb25NYXBwZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL2V4Y2VwdGlvbi9NYXBwZWRFeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTJkYmMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL01hcHBlZEV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMC5leGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKKy8qKgorICogQW4gZXhjZXB0aW9uIG1hcHBlciB0byByZXR1cm4gNDMyIGVycm9yIHJlc3BvbnNlIHdoZW4gYSB7QGxpbmsgTWFwcGVkRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWFwcGVkRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE1hcHBlZEV4Y2VwdGlvbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoTWFwcGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDQzMikuYnVpbGQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL2V4Y2VwdGlvbi9Vbm1hcHBlZEV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL1VubWFwcGVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxODcyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL2V4Y2VwdGlvbi9Vbm1hcHBlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMC5leGNlcHRpb247CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRoYXQgd2lsbCBiZSBwcm9wYWdhdGVkIHRvIHRoZSBzZXJ2bGV0IGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBVbm1hcHBlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL2V4Y2VwdGlvbi9Vbm1hcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL2V4Y2VwdGlvbi9Vbm1hcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODRkYzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL1VubWFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMC5leGNlcHRpb247CisKKy8qKgorICogQW4gZXhjZXB0aW9uIHRoYXQgd2lsbCBiZSBwcm9wYWdhdGVkIHRvIHRoZSBzZXJ2bGV0IGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBVbm1hcHBlZFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4MTIvVGVzdEZpbHRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4MTIvVGVzdEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDNjZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjgxMi9UZXN0RmlsdGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODEyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIFRoaXMgc2VydmxldCBmaWx0ZXIgY2xhc3MgcHJvdmlkZXMgYSBtZWFucyB0byBkZXRlY3Qgd2hldGhlciBKZXJzZXkgKGluIHNlcnZsZXQgZmlsdGVyIGJhc2VkIHNldHVwKSBwcm9wZXJseSBmcmVlZCB0aGUKKyAqIHNlcnZlci1zaWRlIHRocmVhZCBwcm9jZXNzaW5nIHRoZSBodHRwIHJlcXVlc3QgdG8gYW4gYXN5bmMgUkVTVGZ1bCByZXNvdXJjZSB3aGVyZSB7QGxpbmsgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2V9CisgKiB3YXNuJ3QgcmVzdW1lZC4KKyAqIDxwLz4KKyAqIFJlcG9ydGVkIGFzIEpFUlNFWS0yODEyLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoVGVzdEZpbHRlci5jbGFzcy5nZXROYW1lKCkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENETF9GSU5JU0hFRCA9ICJDREwtZmluaXNoZWQiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChmaW5hbCBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihmaW5hbCBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2bGV0UmVzcG9uc2Ugc2VydmxldFJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbHRlckNoYWluIGZpbHRlckNoYWluKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmZpbmVzdChuZXcgRGF0ZSgpICsgIiBUaHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIiBpcyBiZWluZyBhY3F1aXJlZC4uLiIpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGNkbEZpbmlzaGVkID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBzZXJ2bGV0UmVxdWVzdC5zZXRBdHRyaWJ1dGUoQ0RMX0ZJTklTSEVELCBjZGxGaW5pc2hlZCk7CisKKyAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoc2VydmxldFJlcXVlc3QsIHNlcnZsZXRSZXNwb25zZSk7CisKKyAgICAgICAgLy8gdGhlIHRocmVhZCBkaWQgcmV0dXJuIGZyb20gSmVyc2V5CisgICAgICAgIGNkbEZpbmlzaGVkLmNvdW50RG93bigpOworCisgICAgICAgIExPR0dFUi5maW5lc3QobmV3IERhdGUoKSArICIgVGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICIgaXMgYmVpbmcgcmVsZWFzZWQuIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODEyL1Rlc3RXYWl0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODEyL1Rlc3RXYWl0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDU3MTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4MTIvVGVzdFdhaXRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4MTI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RBY2NlcHRhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqCisgKiBUaGlzIHJlc291cmNlIHByb3ZpZGVzIGEgd2F5IHRvIHJlcHJvZHVjZSBKRVJTRVktMjgxOC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvYXN5bmMiKQorQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBUZXN0V2FpdFJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRlc3RXYWl0UmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIFRlc3QgY29udGV4dCBpZGVudGlmaWVkIGJ5IFVVSUQgY2hvc2VuIGJ5IGNsaWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBUZXN0Q29udGV4dD4gdGVzdENvbnRleHRNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgcHJpdmF0ZSBUZXN0Q29udGV4dCB0ZXN0Q29udGV4dEZvclVVSUQoU3RyaW5nIHV1aWQpIHsKKyAgICAgICAgdGVzdENvbnRleHRNYXAucHV0SWZBYnNlbnQodXVpZCwgbmV3IFRlc3RDb250ZXh0KCkpOworICAgICAgICByZXR1cm4gdGVzdENvbnRleHRNYXAuZ2V0KHV1aWQpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgid2FpdC97dXVpZH0iKQorICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JFdmVudChAU3VzcGVuZGVkIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInV1aWQiKSBTdHJpbmcgdXVpZCkgeworCisgICAgICAgIExPR0dFUi5maW5lcigiQWRkaW5nIHJlc3BvbnNlOiAiICsgYXN5bmNSZXNwb25zZSk7CisKKyAgICAgICAgZmluYWwgVGVzdENvbnRleHQgdGVzdENvbnRleHQgPSB0ZXN0Q29udGV4dEZvclVVSUQodXVpZCk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGZpbmlzaGVkQ2RsID0gKENvdW50RG93bkxhdGNoKSByZXF1ZXN0LmdldEF0dHJpYnV0ZShUZXN0RmlsdGVyLkNETF9GSU5JU0hFRCk7CisKKyAgICAgICAgaWYgKGZpbmlzaGVkQ2RsID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSAiICsgVGVzdEZpbHRlci5jbGFzcyArICIgd2FzIG5vdCBwcm9wZXJseSBwcm9jZXNzZWQgYmVmb3JlIHRoaXMgcmVxdWVzdCEiKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlc3RDb250ZXh0LmFzeW5jUmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlOworICAgICAgICB0ZXN0Q29udGV4dC5maW5pc2hlZENkbCA9IGZpbmlzaGVkQ2RsOworICAgICAgICB0ZXN0Q29udGV4dC5zdGFydGVkQ2RsLmNvdW50RG93bigpOworCisgICAgICAgIExPR0dFUi5maW5lcigiRGVjcmVhc2luZyBzdGFydGVkIGNkbDogIiArIHRlc3RDb250ZXh0LnN0YXJ0ZWRDZGwpOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoInJlbGVhc2Uve3V1aWR9IikKKyAgICBwdWJsaWMgU3RyaW5nIHJlbGVhc2VMYXN0U3VzcGVuZGVkQXN5bmNSZXF1ZXN0KEBQYXRoUGFyYW0oInV1aWQiKSBTdHJpbmcgdXVpZCkgeworCisgICAgICAgIExPR0dFUi5maW5lcigiUmVsZWFzaW5nIGFzeW5jIHJlc3BvbnNlIik7CisKKyAgICAgICAgaWYgKCF0ZXN0Q29udGV4dE1hcC5jb250YWluc0tleSh1dWlkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oIlVVSUQgbm90IGZvdW5kISIgKyB1dWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNsZWFuIGl0IHVwCisgICAgICAgIGZpbmFsIFRlc3RDb250ZXh0IHJlbGVhc2VkVGVzdENvbnRleHQgPSB0ZXN0Q29udGV4dE1hcC5yZW1vdmUodXVpZCk7CisgICAgICAgIHJlbGVhc2VkVGVzdENvbnRleHQuZmluaXNoZWRDZGwuY291bnREb3duKCk7CisgICAgICAgIHJlbGVhc2VkVGVzdENvbnRleHQuc3RhcnRlZENkbC5jb3VudERvd24oKTsKKyAgICAgICAgcmVsZWFzZWRUZXN0Q29udGV4dC5hc3luY1Jlc3BvbnNlLnJlc3VtZSgiYXN5bmMtT0stIiArIHV1aWQpOworCisgICAgICAgIHJldHVybiAiUkVMRUFTRUQiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXdhaXQve3V1aWR9L3N0YXJ0ZWQiKQorICAgIHB1YmxpYyBib29sZWFuIGF3YWl0Rm9yVGhlQXN5bmNSZXF1ZXN0VGhyZWFkVG9TdGFydChAUGF0aFBhcmFtKCJ1dWlkIikgU3RyaW5nIHV1aWQsIEBRdWVyeVBhcmFtKCJtaWxsaXMiKSBMb25nIG1pbGxpcykgeworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBzdGFydGVkQ2RsID0gdGVzdENvbnRleHRGb3JVVUlEKHV1aWQpLnN0YXJ0ZWRDZGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZXIoIkNoZWNraW5nIHN0YXJ0ZWQgY2RsOiAiICsgc3RhcnRlZENkbCk7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRlZENkbC5hd2FpdChtaWxsaXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoISIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJhd2FpdC97dXVpZH0vZmluaXNoZWQiKQorICAgIHB1YmxpYyBib29sZWFuIGF3YWl0Rm9yVGhlQXN5bmNSZXF1ZXN0VGhyZWFkVG9GaW5pc2goQFBhdGhQYXJhbSgidXVpZCIpIFN0cmluZyB1dWlkLCBAUXVlcnlQYXJhbSgibWlsbGlzIikgTG9uZyBtaWxsaXMpIHsKKyAgICAgICAgaWYgKCF0ZXN0Q29udGV4dE1hcC5jb250YWluc0tleSh1dWlkKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oIlVVSUQgbm90IGZvdW5kISIgKyB1dWlkKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgTE9HR0VSLmZpbmVyKCJEZWNyZWFzaW5nIGZpbmlzaGVkIGNkbDogIiArIHRlc3RDb250ZXh0TWFwLmdldCh1dWlkKS5maW5pc2hlZENkbCk7CisgICAgICAgICAgICByZXR1cm4gdGVzdENvbnRleHRNYXAuZ2V0KHV1aWQpLmZpbmlzaGVkQ2RsLmF3YWl0KG1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2ghIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNvbnRleHQgaG9sZGVyIGNsYXNzLgorICAgICAqIDxwLz4KKyAgICAgKiBIb2xkcyB0aGUgaW5mb3JtYXRpb24gZm9yIG9uZSB0ZXN0IGlkZW50aWZpZWQgYnkgVVVJRCBjaG9zZW4gYnkgY2xpZW50LgorICAgICAqCisgICAgICogQHNlZSAjdGVzdENvbnRleHRNYXAKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0Q29udGV4dCB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgQ0RMIGVuc3VyZXMgdGhlIHNlcnZlci1zaWRlIHRocmVhZCBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IHRvIC9hc3luYy93YWl0L3t1dWlkfSBoYXMgc3RhcnRlZCBoYW5kbGluZyB0aGUgcmVxdWVzdC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHN0YXJ0ZWRDZGwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgQ0RMIGVuc3VyZXMgdGhlIHNlcnZlci1zaWRlIHRocmVhZCBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IHRvIC9hc3luYy93YWl0L3t1dWlkfSB3YXMgcmV0dXJuZWQgdG8gdGhlIHRocmVhZC1wb29sLgorICAgICAgICAgKi8KKyAgICAgICAgdm9sYXRpbGUgQ291bnREb3duTGF0Y2ggZmluaXNoZWRDZGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhc3luYyByZXNwb25zZSB0aGF0IGRvZXMgZ2V0IHJlc3VtZWQgb3V0c2lkZSBvZiB0aGUgcmVxdWVzdCB0byAvYXN5bmMvd2FpdC97dXVpZH0uIFRoaXMgcmVwcm9kdWNlcyB0aGUgSkVSU0VZLTI4MTIKKyAgICAgICAgICogYnVnLgorICAgICAgICAgKi8KKyAgICAgICAgdm9sYXRpbGUgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZDE2NmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjAiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICAgIG1ldGFkYXRhLWNvbXBsZXRlPSJ0cnVlIj4KKworICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXkyODEyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODEyLlRlc3RGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGFzeW5jLXN1cHBvcnRlZD50cnVlPC9hc3luYy1zdXBwb3J0ZWQ+CisgICAgPC9maWx0ZXI+CisKKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+amVyc2V5PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGFzeW5jLXN1cHBvcnRlZD50cnVlPC9hc3luYy1zdXBwb3J0ZWQ+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uYXN5bmMuVGVzdEFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8IS0tIGxldCBTZXJ2bGV0Q29udGFpbmVyI2RvRmlsdGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSwgRmlsdGVyQ2hhaW4sIFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCisgICAgICAgICAgICByZXNvbHZlIHRoZSByZXNwb25zZSBzdGF0dXMgLS0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5mb3J3YXJkT240MDQ8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTI4MTI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FzeW5jVGVzdC9hc3luYy93YWl0Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXk8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2V4Y2VwdGlvblRlc3QvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXk8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FzeW5jVGVzdC8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPGFic29sdXRlLW9yZGVyaW5nIC8+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMvQWJzdHJhY3RBc3luY0plcnNleVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy9BYnN0cmFjdEFzeW5jSmVyc2V5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTE5MjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMvQWJzdHJhY3RBc3luY0plcnNleVRlc3QuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmFzeW5jOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKKy8qKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RBc3luY0plcnNleVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdEFwcGxpY2F0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL0plcnNleTI3MzBJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL0plcnNleTI3MzBJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2NhNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvSmVyc2V5MjczMElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjczMDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5hc3luYy5BYnN0cmFjdEFzeW5jSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKKworLyoqCisgKiBKRVJTRVktMjczMCByZXByb2R1Y2VyLgorICogPHAvPgorICogVGhpcyB0ZXN0IG11c3Qgbm90IHJ1biBpbiBwYXJhbGxlbC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyNzMwSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RBc3luY0plcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydExhc3RUaHJlYWROb3RTdHVjaygpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBsYXN0VGhyZWFkR290U3R1Y2sgPSB0YXJnZXQoIi9leGNlcHRpb25UZXN0L2V4Y2VwdGlvbi9ycGMvbGFzdHRocmVhZHN0dWNrIikucmVxdWVzdCgpLmdldChib29sZWFuLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiVGhyZWFkIHByb2Nlc3NpbmcgbGFzdCByZXF1ZXN0IGdvdCBzdHVjayB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICArIFRlc3RFeGNlcHRpb25SZXNvdXJjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksCisgICAgICAgICAgICAgICAgbGFzdFRocmVhZEdvdFN0dWNrKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFzeW5jUmVzb3VyY2VOdWxsVGhyb3dhYmxlUmV0dXJuczUwMEFuZERvZXNOb3RTdHVjaygpIHRocm93cyBFeGNlcHRpb24gIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9leGNlcHRpb25UZXN0L2V4Y2VwdGlvbi9udWxsIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0TGFzdFRocmVhZE5vdFN0dWNrKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhc3luY1Jlc291cmNlVW5tYXBwZWRFeGNlcHRpb25SZXR1cm5zNTAwQW5kRG9lc05vdFN0dWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiAgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2V4Y2VwdGlvblRlc3QvZXhjZXB0aW9uL3VubWFwcGVkIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0TGFzdFRocmVhZE5vdFN0dWNrKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhc3luY1Jlc291cmNlVW5tYXBwZWRSdW50aW1lRXhjZXB0aW9uUmV0dXJuczUwMEFuZERvZXNOb3RTdHVjaygpIHRocm93cyBFeGNlcHRpb24gIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9leGNlcHRpb25UZXN0L2V4Y2VwdGlvbi9ydW50aW1lIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0TGFzdFRocmVhZE5vdFN0dWNrKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhc3luY1Jlc291cmNlTWFwcGVkRXhjZXB0aW9uUmV0dXJuczQzMigpIHRocm93cyBFeGNlcHRpb24gIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9leGNlcHRpb25UZXN0L2V4Y2VwdGlvbi9tYXBwZWQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQzMiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRMYXN0VGhyZWFkTm90U3R1Y2soKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFzeW5jUmVzb3VyY2VOb25FeGlzdGVudFJldHVybnM0MDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9leGNlcHRpb25UZXN0L2V4Y2VwdGlvbi9ub3Rmb3VuZCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjgxMi9KZXJzZXkyODEySVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjgxMi9KZXJzZXkyODEySVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2YThmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODEyL0plcnNleTI4MTJJVENhc2UuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODEyOworCitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5hc3luYy5BYnN0cmFjdEFzeW5jSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEpFUlNFWS0yODEyIHJlcHJvZHVjZXIuCisgKiA8cC8+CisgKiBUaGlzIHRlc3QgbXVzdCBub3QgcnVuIGluIHBhcmFsbGVsLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI4MTJJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdEFzeW5jSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihKZXJzZXkyODEySVRDYXNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBXQUlUX1RJTUVPVVQgPSA1MDAwOworCisgICAgcHJpdmF0ZSBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPiBhc3luY1Jlc3VsdCA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgIHByaXZhdGUgU3RyaW5nIHV1aWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOworICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycworICAgICAgICAgICAgLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldERhZW1vbih0cnVlKS5idWlsZCgpKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyVGhlV2FpdFJlcXVlc3RJblNlcGFyYXRlVGhyZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dG9yU2VydmljZS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5maW5lcigiUnVubmluZyBhIHJlcXVlc3QgdG8gL2FzeW5jL3dhaXQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIik7CisgICAgICAgICAgICAgICAgYXN5bmNSZXN1bHQuc2V0KHRhcmdldCgiL2FzeW5jVGVzdC9hc3luYy93YWl0IikucGF0aCh1dWlkKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBzZXJ2ZXItc2lkZSB0aHJlYWQgdGhhdCBpcyBwcm9jZXNzaW5nIGEgaHR0cCByZXF1ZXN0IHRvIHRoZSBzZXJ2bGV0LWZpbHRlci1iYXNlZCBKZXJzZXkgc2V0dXAgZW5kcyB1cAorICAgICAqIHN0dWNrIG9yIHJldHVybmVkIGJhY2sgdG8gdGhlIHBvb2wgb2YgYXZhaWxhYmxlIHRocmVhZHMuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgdGVzdCBwcmV2ZW50cyBhIHJlZ3Jlc3Npb24gcmVwb3J0ZWQgaW4gSkVSU0VZLTI4MTIuCisgICAgICogPHAvPgorICAgICAqIFdoZW4gdGhlIHtAbGluayBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZX0gd2FzIGxlZnQgaW50YWN0IGluIHRoZSBSRVNUZnVsIHJlc291cmNlIChhcyBpbXBsZW1lbnRlZCBpbiB7QGxpbmsKKyAgICAgKiBUZXN0V2FpdFJlc291cmNlI3dhaXRGb3JFdmVudChBc3luY1Jlc3BvbnNlLCBIdHRwU2VydmxldFJlcXVlc3QsIFN0cmluZyl9KSwgdGhlIHNlcnZlci1zaWRlIEplcnNleSB0aHJlYWQgZW5kZWQgdXAgaW4KKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5SZXNwb25zZVdyaXRlciNnZXRSZXNwb25zZUNvbnRleHQoKX0gYmxvY2tlZCBiZWNhdXNlIG9mIHRoZSByZXNvbHV0aW9uIG9mIGh0dHAKKyAgICAgKiByZXNwb25zZSBzdGF0dXMgZnJvbSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyI2RvRmlsdGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSwKKyAgICAgKiBGaWx0ZXJDaGFpbiwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9CisgICAgICogPHAvPgorICAgICAqIFRoaXMgdGVzdCB1c2VzIGEgc2VwYXJhdGUgdGhyZWFkIHRvIGNhbGwge0Bjb2RlIC9hc3luYy93YWl0L3t1dWlkfX0gcmVzb3VyY2Ugd2hpY2ggYmxvY2tzIHVudGlsIHRoZSB7QGNvZGUKKyAgICAgKiAvYXN5bmMvcmVsZWFzZS97dXVpZH19IGlzIGNhbGxlZC4gSW4gdGhlIG1lYW50aW1lIHRoZSBKVW5pdCB0aHJlYWQgY2FsbHMge0Bjb2RlIC9hc3luYy9hd2FpdC97dXVpZH19IHRvIGRpc2NvdmVyIHdoZXRoZXIKKyAgICAgKiB0aGUgc2VydmVyLXNpZGUgdGhyZWFkIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgdG8ge0Bjb2RlIC9hc3luYy9hd2FpdC97dXVpZH0vc3RhcnRlZH0gZGlkIHN0YXJ0IHByb2Nlc3Npbmcgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQ29uc2VjdXRpdmVseSwgdGhlIEpVbml0IHRocmVhZCBjYWxscyB7QGNvZGUgL2FzeW5jL2F3YWl0L3t1dWlkfS9maW5pc2hlZH0gd2l0aCBhIHRpbWVvdXQge0Bjb2RlICNXQUlUX1RJTUVPVVR9IHRvIGRpc2NvdmVyCisgICAgICogd2hldGhlciB0aGUgc2VydmVyLXNpZGUgdGhyZWFkIGdvdCBzdHVjayAod2hpY2ggaXMgd2hhdCBKRVJTRVktMjgxMiByZXBvcnRlZCkgb3Igbm90LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFzeW5jU3VzcGVuZGVkUmVzb3VyY2VEb2VzTm90R2V0U3R1Y2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gWzFdIHdhaXQgZm9yIHRoZSAvYXN5bmMvd2FpdCByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZAorICAgICAgICBmaW5hbCBSZXNwb25zZSBzdGFydFJlc3BvbnNlID0gdGFyZ2V0KCIvYXN5bmNUZXN0L2FzeW5jL2F3YWl0IikucGF0aCh1dWlkKS5wYXRoKCJzdGFydGVkIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgibWlsbGlzIiwgV0FJVF9USU1FT1VUKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSBzZXJ2ZXItc2lkZSB0aHJlYWQgaGFuZGxpbmcgdGhlIHJlcXVlc3QgdG8gL2FzeW5jL3dhaXQgZGlkbid0IHN0YXJ0IGluIHRpbWVseSBmYXNoaW9uLiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJUaGlzIGVycm9yIGluZGljYXRlcyB0aGlzIHRlc3QgaXMgbm90IGV4ZWN1dGVkIC8gZGVzaWduZWQgcHJvcGVybHkgcmF0aGVyIHRoYW4gYSByZWdyZXNzaW9uIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkpFUlNFWS0yODEyIGZpeC4iLAorICAgICAgICAgICAgICAgIHN0YXJ0UmVzcG9uc2UucmVhZEVudGl0eShCb29sZWFuLmNsYXNzKSk7CisKKyAgICAgICAgLy8gWzJdIHdhaXQgZm9yIHRoZSAvYXN5bmMvd2FpdCByZXF1ZXN0IHRvIGZpbmlzaAorICAgICAgICBmaW5hbCBSZXNwb25zZSBmaW5pc2hSZXNwb25zZSA9IHRhcmdldCgiL2FzeW5jVGVzdC9hc3luYy9hd2FpdCIpLnBhdGgodXVpZCkucGF0aCgiZmluaXNoZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJtaWxsaXMiLCBXQUlUX1RJTUVPVVQpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHRocmVhZCBwcm9jZXNzaW5nIHRoZSAvYXN5bmMvd2FpdCByZXF1ZXN0IGRpZCBub3QgcmVzcG9uZCBpbiB0aW1lbHkgZmFzaGlvbi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVtb3J5IGxlYWsgLyB0aHJlYWQgZ290IHN0dWNrIGRldGVjdGVkISIsCisgICAgICAgICAgICAgICAgZmluaXNoUmVzcG9uc2UucmVhZEVudGl0eShCb29sZWFuLmNsYXNzKSk7CisKKyAgICAgICAgLy8gWzNdIHJlbGVhc2UgdGhlIGJsb2NrZWQgaHR0cCBjYWxsIHRvIC9hc3luYy93YWl0CisgICAgICAgIGZpbmFsIFN0cmluZyByZWxlYXNlUmVzcG9uc2UgPSB0YXJnZXQoIi9hc3luY1Rlc3QvYXN5bmMvcmVsZWFzZSIpLnBhdGgodXVpZCkucmVxdWVzdCgpLnBvc3QobnVsbCwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSRUxFQVNFRCIsIHJlbGVhc2VSZXNwb25zZSk7CisKKyAgICAgICAgLy8gWzRdIHRlc3Qgd2hldGhlciBldmVyeXRoaW5nIGVuZGVkIGFzIGV4cGVjdGVkCisgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdGVzdCB0aHJlYWQgZGlkIG5vdCBmaW5pc2ggaW4gdGltZWx5IGZhc2hpb24hIiwKKyAgICAgICAgICAgICAgICBleGVjdXRvclNlcnZpY2UuYXdhaXRUZXJtaW5hdGlvbihXQUlUX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFzeW5jLU9LLSIgKyB1dWlkLCBhc3luY1Jlc3VsdC5nZXQoKSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgcmVsZWFzZVJlc291cmNlcygpIHsKKyAgICAgICAgLy8gcmVsZWFzZSB0aGUgc2VydmVyLXNpZGUgdGhyZWFkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBsZWZ0IHVuLWF0dGVuZGVkCisgICAgICAgIHRhcmdldCgiL2FzeW5jVGVzdC9hc3luYy9yZWxlYXNlIikucGF0aCh1dWlkKS5yZXF1ZXN0KCkucG9zdChudWxsKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGVUaHJlYWQoKSB7CisgICAgICAgIC8vIGZvcmNpYmx5IHRlcm1pbmF0ZSB0aGUgdGVzdCBjbGllbnQgdGhyZWFkCisgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjAxZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSwxMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkvQmVhbiBWYWxpZGF0aW9uIHRlc3Qgd2ViIGFwcGxpY2F0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhpYmVybmF0ZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhpYmVybmF0ZS12YWxpZGF0b3ItY2RpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktd2VsZDItc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXgtdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cnVuLWV4dGVybmFsLXRlc3RzPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gRXh0ZXJuYWwgdGVzdCBjb250YWluZXIgY29uZmlndXJhdGlvbiBpcyBkb25lIHZpYSBwcm9wZXJ0aWVzIHRvIGFsbG93IG92ZXJyaWRpbmcgdmlhIGNvbW1hbmQgbGluZS4gLS0+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5wb3J0PjgwODA8L2V4dGVybmFsLmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgIDxtYXZlbi50ZXN0LnNraXA+ZmFsc2U8L21hdmVuLnRlc3Quc2tpcD4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkY2MxMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMuCisgKiBUaGlzIG9uZSBpcyBjb25maWd1cmVkIGFzIGEgQ0RJIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL2NkaSIpCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgYWRkKENkaUZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoQ2RpUGFyYW1JbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChDZGlQcm9wZXJ0eUluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKENkaU9sZEZhc2hpb25lZFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICAgICAgYWRkKENkaVZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIH19OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaUZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDA1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaUZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCisvKioKKyAqIFRoaXMgQ0RJIGJhY2tlZCByZXNvdXJjZSBzaG91bGQgZ2V0IHZhbGlkYXRlZCBhbmQgdmFsaWRhdGlvbiByZXN1bHQgZmllbGQgaW5qZWN0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInZhbGlkYXRlZC9maWVsZCIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENkaUZpZWxkSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0OworCisgICAgQEluamVjdAorICAgIE5vbkpheFJzVmFsaWRhdGVkQmVhbiBjZGlCZWFuOworCisgICAgQFF1ZXJ5UGFyYW0oInEiKQorICAgIEBOb3ROdWxsCisgICAgU3RyaW5nIHE7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIHZhbGlkYXRpb24gaXNzdWVzLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBmcm9tIGZpZWxkIGluamVjdGVkIHZhbGlkYXRpb24gYmVhbi4KKyAgICAgKi8KKyAgICBAUGF0aCgidmFsaWRhdGUiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgaW50IGdldFZhbGlkYXRlKCkgeworCisgICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LmdldFZpb2xhdGlvbkNvdW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG51bWJlciBvZiB2YWxpZGF0aW9uIGlzc3VlcyBmb3Igbm9uIEpBWC1SUyBiZWFuLgorICAgICAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoZSBpbXBsaWNpdCBIaWJlcm5hdGUgdmFsaWRhdG9yCisgICAgICogaXMgZnVuY3Rpb25pbmcgZm9yIHJhdyBDREkgYmVhbnMsIHdoZXJlIEplcnNleQorICAgICAqIGlzIG5vdCBpbnZvbHZlZCBpbiBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHZhbGlkYXRpb24gaXNzdWVzIHJldmVhbGVkIHdoZW4gaW52b2tpbmcgaW5qZWN0ZWQgQ0RJIGJlYW4uCisgICAgICovCisgICAgQFBhdGgoInZhbGlkYXRlL25vbi1qYXhycyIpCisgICAgQEdFVAorICAgIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGVOb25KYXhScyhAUXVlcnlQYXJhbSgiaCIpIFN0cmluZyBoKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNkaUJlYW4uZWNobyhoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGNhdGNoIChDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gZXguZ2V0Q29uc3RyYWludFZpb2xhdGlvbnMoKS5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpT2xkRmFzaGlvbmVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpT2xkRmFzaGlvbmVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2E1ODAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlPbGRGYXNoaW9uZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworLyoqCisgKiBUaGlzIENESSBiYWNrZWQgcmVzb3VyY2Ugc2hvdWxkIGdldCB2YWxpZGF0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm9sZC9mYXNoaW9uZWQiKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlPbGRGYXNoaW9uZWRSZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBwYXJhbSBnZXR0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHF1ZXJ5IHBhcmFtIHZhbHVlLgorICAgICAqLworICAgIEBQYXRoKCJ2YWxpZGF0ZSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UShAUXVlcnlQYXJhbSgicSIpIEBOb3ROdWxsIFN0cmluZyBxKSB7CisKKyAgICAgICAgcmV0dXJuIHE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlQYXJhbUluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpUGFyYW1JbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmNzRjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpUGFyYW1JbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKKy8qKgorICogVGhpcyBDREkgYmFja2VkIHJlc291cmNlIHNob3VsZCBnZXQgdmFsaWRhdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJ2YWxpZGF0ZWQvcGFyYW0iKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlQYXJhbUluamVjdGVkUmVzb3VyY2UgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIG51bWJlciBvZiB2YWxpZGF0aW9uIGlzc3Vlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUgZnJvbSBwYXJhbSBpbmplY3RlZCB2YWxpZGF0aW9uIGJlYW4uCisgICAgICovCisgICAgQFBhdGgoInZhbGlkYXRlIikKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRWYWxpZGF0ZShAUXVlcnlQYXJhbSgicSIpIEBOb3ROdWxsIFN0cmluZyBxLCBAQ29udGV4dCBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQpIHsKKworICAgICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5nZXRWaW9sYXRpb25Db3VudCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpUHJvcGVydHlJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVByb3BlcnR5SW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZjhhODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVByb3BlcnR5SW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5Bcm91bmRJbnZva2U7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuSW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuSW50ZXJjZXB0b3JzOworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkludm9jYXRpb25Db250ZXh0OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCisvKioKKyAqIFRoaXMgQ0RJIGJhY2tlZCByZXNvdXJjZSBzaG91bGQgZ2V0IHZhbGlkYXRlZCBhbmQgdmFsaWRhdGlvbiByZXN1bHQgcHJvcGVydHkgaW5qZWN0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInZhbGlkYXRlZC9wcm9wZXJ0eSIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENkaVByb3BlcnR5SW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdDsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUmVzdWx0KFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdCkgeworICAgICAgICB0aGlzLnZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0aW9uUmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IGdldFZhbGlkYXRpb25SZXN1bHQoKSB7CisgICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBudW1iZXIgb2YgdmFsaWRhdGlvbiBpc3N1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbHVlIGZyb20gZmllbGQgaW5qZWN0ZWQgdmFsaWRhdGlvbiBiZWFuLgorICAgICAqLworICAgIEBQYXRoKCJ2YWxpZGF0ZSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGUoQFF1ZXJ5UGFyYW0oInEiKSBATm90TnVsbCBTdHJpbmcgcSkgeworCisgICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uUmVzdWx0KCkuZ2V0VmlvbGF0aW9uQ291bnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y5ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5WYWxpZGF0aW9uSW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW50ZXJjZXB0b3IudXRpbC5wcm94eS5UYXJnZXRJbnN0YW5jZVByb3h5OworCisvKioKKyAqIENESSBiYWNrZWQgaW50ZXJjZXB0b3IgdG8gaGFuZGxlIHZhbGlkYXRpb24gaXNzdWVzLgorICoKKyAqIEBhdXRob3IgSmFrdSBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgQ2RpVmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkludGVyY2VwdG9yIHsKKworICAgIHByaXZhdGUgZmluYWwgQ2RpVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0OworICAgIHByaXZhdGUgZmluYWwgQ2RpUHJvcGVydHlJbmplY3RlZFJlc291cmNlIHBpcjsKKworICAgIC8qKgorICAgICAqIEVtcHR5IGNvbnN0cnVjdG9yIHRvIG1ha2UgQ0RJIGhhcHB5LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIENkaVZhbGlkYXRpb25JbnRlcmNlcHRvcigpIHsKKyAgICAgICAgdGhpcy52YWxpZGF0aW9uUmVzdWx0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5waXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWxpZGF0aW9uUmVzdWx0ICBDREkgaW1wbGVtZW50YXRpb24gb2YgdmFsaWRhdGlvbiByZXN1bHQuCisgICAgICogQHBhcmFtIHJlc291cmNlIENESSBwcm9wZXJ0eS1pbmplY3RlZCBKQVgtUlMgcmVzb3VyY2UuCisgICAgICovCisgICAgQEluamVjdAorICAgIHB1YmxpYyBDZGlWYWxpZGF0aW9uSW50ZXJjZXB0b3IoQ2RpVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0LCBDZGlQcm9wZXJ0eUluamVjdGVkUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy52YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGlvblJlc3VsdDsKKyAgICAgICAgdGhpcy5waXIgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblZhbGlkYXRlKFZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQgY3R4KSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgT2JqZWN0IHJlc291cmNlID0gY3R4LmdldFJlc291cmNlKCk7CisgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIFRhcmdldEluc3RhbmNlUHJveHkpIHsKKyAgICAgICAgICAgIGN0eC5zZXRSZXNvdXJjZSgoKFRhcmdldEluc3RhbmNlUHJveHkpIHJlc291cmNlKS5nZXRUYXJnZXRJbnN0YW5jZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdHgucHJvY2VlZCgpOworICAgICAgICB9IGNhdGNoIChDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIGNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24pIHsKKworICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIGEgcHJvcGVydHkKKyAgICAgICAgICAgIGlmIChWYWxpZGF0aW9uUmVzdWx0VXRpbC5oYXNWYWxpZGF0aW9uUmVzdWx0UHJvcGVydHkocmVzb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIHZhbGlkYXRpb25SZXN1bHRHZXR0ZXIgPSBWYWxpZGF0aW9uUmVzdWx0VXRpbC5nZXRWYWxpZGF0aW9uUmVzdWx0R2V0dGVyKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICBWYWxpZGF0aW9uUmVzdWx0VXRpbC51cGRhdGVWYWxpZGF0aW9uUmVzdWx0UHJvcGVydHkocmVzb3VyY2UsIHZhbGlkYXRpb25SZXN1bHRHZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uLmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCkpOworICAgICAgICAgICAgICAgIHBpci5zZXRWYWxpZGF0aW9uUmVzdWx0KHZhbGlkYXRpb25SZXN1bHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVuIGNoZWNrIGZvciBhIGZpZWxkCisgICAgICAgICAgICAgICAgZmluYWwgRmllbGQgdnIgPSBWYWxpZGF0aW9uUmVzdWx0VXRpbC5nZXRWYWxpZGF0aW9uUmVzdWx0RmllbGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIGlmICh2ciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdGhlIHJpZ2h0IGd1eSwgbm8gbmVlZCB0byB1c2UgcmVmbGVjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5zZXRWaW9sYXRpb25zKGNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24uZ2V0Q29uc3RyYWludFZpb2xhdGlvbnMoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWRhdGlvblJlc3VsdEluQXJncyhjdHguZ2V0QXJncygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uUmVzdWx0LnNldFZpb2xhdGlvbnMoY29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbi5nZXRDb25zdHJhaW50VmlvbGF0aW9ucygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVzdWx0SW5BcmdzKE9iamVjdFtdIGFyZ3MpIHsKKyAgICAgICAgZm9yIChPYmplY3QgYSA6IGFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBhcmdDbGFzcyA9IGEuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGlmIChWYWxpZGF0aW9uUmVzdWx0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYXJnQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhcmdDbGFzcyA9IGFyZ0NsYXNzLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChhcmdDbGFzcyAhPSBPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVZhbGlkYXRpb25SZXN1bHQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpVmFsaWRhdGlvblJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWQzZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVZhbGlkYXRpb25SZXN1bHQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247CisKKy8qKgorICogQ0RJIGltcGxlbWVudGF0aW9uIG9mIHZhbGlkYXRpb24gcmVzdWx0LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgQ2RpVmFsaWRhdGlvblJlc3VsdCBpbXBsZW1lbnRzIFZhbGlkYXRpb25SZXN1bHQgeworCisgICAgcHJpdmF0ZSBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4gY29uc3RyYWludFZpb2xhdGlvblNldDsKKworICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvbnMoU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Pz4+IHZpb2xhdGlvbnMpIHsKKyAgICAgICAgdGhpcy5jb25zdHJhaW50VmlvbGF0aW9uU2V0ID0gbmV3IEhhc2hTZXQ8Pih2aW9sYXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Pz4+IGdldEFsbFZpb2xhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBjb25zdHJhaW50VmlvbGF0aW9uU2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbGVkKCkgeworICAgICAgICByZXR1cm4gKGNvbnN0cmFpbnRWaW9sYXRpb25TZXQgIT0gbnVsbCkgPyAhY29uc3RyYWludFZpb2xhdGlvblNldC5pc0VtcHR5KCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFZpb2xhdGlvbkNvdW50KCkgeworICAgICAgICByZXR1cm4gKGNvbnN0cmFpbnRWaW9sYXRpb25TZXQgIT0gbnVsbCkgPyBjb25zdHJhaW50VmlvbGF0aW9uU2V0LnNpemUoKSA6IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlWYWxpZGF0aW9uUmVzdWx0QmluZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVZhbGlkYXRpb25SZXN1bHRCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmJkYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlWYWxpZGF0aW9uUmVzdWx0QmluZGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb247CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5DZGlVdGlsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5HZW5lcmljQ2RpQmVhblN1cHBsaWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworCisvKioKKyAqIFV0aWxpdHkgdGhhdCBiaW5kcyBISzIgZmFjdG9yeSB0byBwcm92aWRlIENESSBtYW5hZ2VkIHZhbGlkYXRpb24gcmVzdWx0IGJlYW4uCisgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB2YWxpZGF0aW9uIHJlc3VsdCBjb3VsZCBiZSBpbmplY3RlZCBhcyBhIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXIKKyAqIGV2ZW4gd2hlbiBydW5uaW5nIGluIENESSBlbnZpcm9ubWVudC4KKyAqLworcHVibGljIGNsYXNzIENkaVZhbGlkYXRpb25SZXN1bHRCaW5kZXIgaW1wbGVtZW50cyBFeHRlbnNpb24sIENvbXBvbmVudFByb3ZpZGVyIHsKKworICAgIEBJbmplY3QKKyAgICBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcjsKKworICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IGluamVjdGlvbk1hbmFnZXI7CisgICAgICAgIHRoaXMuYmVhbk1hbmFnZXIgPSBDZGlVdGlsLmdldEJlYW5NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYmluZChDbGFzczw/PiBjb21wb25lbnQsIFNldDxDbGFzczw/Pj4gcHJvdmlkZXJDb250cmFjdHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB7CisgICAgICAgIGlmIChiZWFuTWFuYWdlciAhPSBudWxsKSB7IC8vIGluIENESSBlbnZpcm9ubWVudAorICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gQmluZGluZ3MKKyAgICAgICAgICAgICAgICAgICAgLnN1cHBsaWVyKG5ldyBHZW5lcmljQ2RpQmVhblN1cHBsaWVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENkaVZhbGlkYXRpb25SZXN1bHQuY2xhc3MsIGluamVjdGlvbk1hbmFnZXIsIGJlYW5NYW5hZ2VyLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKENkaVZhbGlkYXRpb25SZXN1bHQuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhWYWxpZGF0aW9uUmVzdWx0LmNsYXNzKTsKKworICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kaW5nKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVmYjExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMuCisgKiBUaGlzIG9uZSB3aWxsIGdldCBmdWxseSBtYW5hZ2VkIGJ5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvaGsyIikKK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBIazJBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBIazJBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgc3VwZXIoSGsyUGFyYW1JbmplY3RlZFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEhrMkZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBIazJQcm9wZXJ0eUluamVjdGVkUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgSGsyT2xkRmFzaGlvbmVkUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlZ2lzdGVyKG5ldyBIazJWYWxpZGF0aW9uSW50ZXJjZXB0b3IuQmluZGVyKCkpOworICAgICAgICByZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKXsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoSGsyVmFsaWRhdGlvblJlc3VsdC5jbGFzcykudG8oVmFsaWRhdGlvblJlc3VsdC5jbGFzcykuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzYjg1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCisvKioKKyAqIFRoaXMgb25lIHNob3VsZCBnZXQgdmFsaWRhdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJ2YWxpZGF0ZWQvZmllbGQiKQorQFZldG9lZAorcHVibGljIGNsYXNzIEhrMkZpZWxkSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBAUXVlcnlQYXJhbSgicSIpCisgICAgQE5vdE51bGwKKyAgICBTdHJpbmcgcTsKKworICAgIEBDb250ZXh0CisgICAgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIG51bWJlciBvZiB2YWxpZGF0aW9uIGlzc3Vlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUgZnJvbSBmaWVsZCBwcm9kdWNlZCBiZWFuLgorICAgICAqLworICAgIEBQYXRoKCJ2YWxpZGF0ZSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGUoKSB7CisgICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LmdldFZpb2xhdGlvbkNvdW50KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJPbGRGYXNoaW9uZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJPbGRGYXNoaW9uZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYzg1OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMk9sZEZhc2hpb25lZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworLyoqCisgKiBUaGlzIEhLMiBtYW5hZ2VkIHJlc291cmNlIHNob3VsZCBnZXQgdmFsaWRhdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJvbGQvZmFzaGlvbmVkIikKK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBIazJPbGRGYXNoaW9uZWRSZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBwYXJhbSBnZXR0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBAUGF0aCgidmFsaWRhdGUiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFEoQFF1ZXJ5UGFyYW0oInEiKSBATm90TnVsbCBTdHJpbmcgcSkgeworCisgICAgICAgIHJldHVybiBxOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyUGFyYW1JbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlBhcmFtSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWE2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlBhcmFtSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworLyoqCisgKiBUaGlzIEhLMiBtYW5hZ2VkIHJlc291cmNlIHNob3VsZCBnZXQgdmFsaWRhdGVkIGFuZCB2YWxpZGF0aW9uCisgKiByZXN1bHQgaW5qZWN0ZWQgdmlhIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInZhbGlkYXRlZC9wYXJhbSIpCitAVmV0b2VkCitwdWJsaWMgY2xhc3MgSGsyUGFyYW1JbmplY3RlZFJlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiBudW1iZXIgb2YgdmFsaWRhdGlvbiBpc3N1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbHVlIGZyb20gZmllbGQgcHJvZHVjZWQgYmVhbi4KKyAgICAgKi8KKyAgICBAUGF0aCgidmFsaWRhdGUiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgaW50IGdldFZhbGlkYXRlKEBRdWVyeVBhcmFtKCJxIikgQE5vdE51bGwgU3RyaW5nIHEsIEBDb250ZXh0IEhrMlZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdCkgeworCisgICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LmdldFZpb2xhdGlvbkNvdW50KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJQcm9wZXJ0eUluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyUHJvcGVydHlJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwMmIwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyUHJvcGVydHlJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCisvKioKKyAqIFRoaXMgb25lIHNob3VsZCBnZXQgdmFsaWRhdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJ2YWxpZGF0ZWQvcHJvcGVydHkiKQorQFZldG9lZAorcHVibGljIGNsYXNzIEhrMlByb3BlcnR5SW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBAUXVlcnlQYXJhbSgicSIpCisgICAgQE5vdE51bGwKKyAgICBTdHJpbmcgcTsKKworICAgIFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdDsKKworICAgIHB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IGdldFZhbGlkYXRpb25SZXN1bHQoKSB7CisgICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0OworICAgIH0KKworICAgIEBDb250ZXh0CisgICAgcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblJlc3VsdChWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQpIHsKKyAgICAgICAgdGhpcy52YWxpZGF0aW9uUmVzdWx0ID0gdmFsaWRhdGlvblJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIHZhbGlkYXRpb24gaXNzdWVzLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBmcm9tIGZpZWxkIHByb2R1Y2VkIGJlYW4uCisgICAgICovCisgICAgQFBhdGgoInZhbGlkYXRlIikKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRWYWxpZGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZ2V0VmlvbGF0aW9uQ291bnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU0NTNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJWYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogSEsyIG1hbmFnZWQgdmFsaWRhdGlvbiBpbnRlcmNlcHRvci4KKyAqLworQFZldG9lZAorcHVibGljIGNsYXNzIEhrMlZhbGlkYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFZhbGlkYXRpb25JbnRlcmNlcHRvciB7CisKKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8SGsyVmFsaWRhdGlvblJlc3VsdD4gdmFsaWRhdGlvblJlc3VsdDsKKworICAgIHB1YmxpYyBIazJWYWxpZGF0aW9uSW50ZXJjZXB0b3IoUHJvdmlkZXI8SGsyVmFsaWRhdGlvblJlc3VsdD4gdmFsaWRhdGlvblJlc3VsdCkgeworICAgICAgICB0aGlzLnZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0aW9uUmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBiaW5kRmFjdG9yeShWYWxpZGF0aW9uSW50ZXJjZXB0b3JGYWN0b3J5LmNsYXNzLCBTaW5nbGV0b24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JGYWN0b3J5IGltcGxlbWVudHMgU3VwcGxpZXI8VmFsaWRhdGlvbkludGVyY2VwdG9yPiB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBQcm92aWRlcjxIazJWYWxpZGF0aW9uUmVzdWx0PiB2YWxpZGF0aW9uUmVzdWx0UHJvdmlkZXI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIazJWYWxpZGF0aW9uSW50ZXJjZXB0b3IodmFsaWRhdGlvblJlc3VsdFByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVmFsaWRhdGUoCisgICAgICAgICAgICBWYWxpZGF0aW9uSW50ZXJjZXB0b3JDb250ZXh0IGN0eCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3R4LnByb2NlZWQoKTsKKyAgICAgICAgfSBjYXRjaCAoQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZW5zdXJlVmFsaWRhdGlvblJlc3VsdEluamVjdGVkKGN0eCwgZXgpOworICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5nZXQoKS5zZXRWaW9sYXRpb25zKGV4LmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVZhbGlkYXRpb25SZXN1bHRJbmplY3RlZCgKKyAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQgY3R4LCBmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIGV4KSB7CisKKyAgICAgICAgaWYgKCFpc1ZhbGlkYXRpb25SZXN1bHRJbkFyZ3MoY3R4LmdldEFyZ3MoKSkKKyAgICAgICAgICAgICAgICAmJiAhaXNWYWxpZGF0aW9uUmVzdWx0SW5SZXNvdXJjZShjdHgpCisgICAgICAgICAgICAgICAgJiYgIWhhc1ZhbGlkYXRpb25SZXN1bHRQcm9wZXJ0eShjdHguZ2V0UmVzb3VyY2UoKSkpIHsKKworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVzdWx0SW5SZXNvdXJjZShWYWxpZGF0aW9uSW50ZXJjZXB0b3JDb250ZXh0IGN0eCkgeworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IGN0eC5nZXRSZXNvdXJjZSgpLmdldENsYXNzKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBPZiBWYWxpZGF0aW9uUmVzdWx0IGFuZCBKQVgtUlMgaW5qZWN0YWJsZQorICAgICAgICAgICAgICAgIGlmIChWYWxpZGF0aW9uUmVzdWx0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZi5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmLmdldEFubm90YXRpb24oQ29udGV4dC5jbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfSB3aGlsZSAoY2xhenogIT0gT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXN1bHRJbkFyZ3MoT2JqZWN0W10gYXJncykgeworICAgICAgICBmb3IgKE9iamVjdCBhIDogYXJncykgeworICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCAmJiBWYWxpZGF0aW9uUmVzdWx0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGEgcmVzb3VyY2UgaGFzIGEgcHJvcGVydHkgb2YgdHlwZSB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBvdXRjb21lIG9mIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1ZhbGlkYXRpb25SZXN1bHRQcm9wZXJ0eShmaW5hbCBPYmplY3QgcmVzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25SZXN1bHRHZXR0ZXIocmVzb3VyY2UpICE9IG51bGwgJiYgZ2V0VmFsaWRhdGlvblJlc3VsdFNldHRlcihyZXNvdXJjZSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZ2V0dGVyIGZvciB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0gb3Ige0Bjb2RlIG51bGx9CisgICAgICogaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGdldHRlciBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRWYWxpZGF0aW9uUmVzdWx0R2V0dGVyKGZpbmFsIE9iamVjdCByZXNvdXJjZSkgeworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IHJlc291cmNlLmdldENsYXNzKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZvciAoTWV0aG9kIG0gOiBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkYXRpb25SZXN1bHRHZXR0ZXIobSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0gd2hpbGUgKGNsYXp6ICE9IE9iamVjdC5jbGFzcyk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYSBtZXRob2QgaXMgYSBnZXR0ZXIgZm9yIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIG1ldGhvZCB0byB0ZXN0LgorICAgICAqIEByZXR1cm4gb3V0Y29tZSBvZiB0ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVzdWx0R2V0dGVyKE1ldGhvZCBtKSB7CisgICAgICAgIHJldHVybiBtLmdldE5hbWUoKS5zdGFydHNXaXRoKCJnZXQiKQorICAgICAgICAgICAgICAgICYmIFZhbGlkYXRpb25SZXN1bHQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShtLmdldFJldHVyblR5cGUoKSkKKyAgICAgICAgICAgICAgICAmJiBNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKSAmJiBtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldHRlciBmb3Ige0Bjb2RlIGphdmF4Lm12Yy52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHR9IG9yIHtAY29kZSBudWxsfQorICAgICAqIGlmIG9uZSBjYW5ub3QgYmUgZm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBzZXR0ZXIgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0VmFsaWRhdGlvblJlc3VsdFNldHRlcihmaW5hbCBPYmplY3QgcmVzb3VyY2UpIHsKKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSByZXNvdXJjZS5nZXRDbGFzcygpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBmb3IgKE1ldGhvZCBtIDogY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKG0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9IHdoaWxlIChjbGF6eiAhPSBPYmplY3QuY2xhc3MpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGEgbWV0aG9kIGlzIGEgc2V0dGVyIGZvciB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0uCisgICAgICogQXMgYSBDREkgaW5pdGlhbGl6ZXIgbWV0aG9kLCBpdCBtdXN0IGJlIGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC5pbmplY3QuSW5qZWN0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIG1ldGhvZCB0byB0ZXN0LgorICAgICAqIEByZXR1cm4gb3V0Y29tZSBvZiB0ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKE1ldGhvZCBtKSB7CisgICAgICAgIHJldHVybiBtLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzZXQiKSAmJiBtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICAmJiBWYWxpZGF0aW9uUmVzdWx0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20obS5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdKQorICAgICAgICAgICAgICAgICYmIG0uZ2V0UmV0dXJuVHlwZSgpID09IFZvaWQuVFlQRSAmJiBNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKQorICAgICAgICAgICAgICAgICYmIG0uZ2V0QW5ub3RhdGlvbihDb250ZXh0LmNsYXNzKSAhPSBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJWYWxpZGF0aW9uUmVzdWx0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlZhbGlkYXRpb25SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg2MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJWYWxpZGF0aW9uUmVzdWx0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKKworLyoqCisgKiBISzIgbWFuYWdlZCB2YWxpZGF0aW9uIHJlc3VsdCBiZWFuLgorICovCitAVmV0b2VkCitwdWJsaWMgY2xhc3MgSGsyVmFsaWRhdGlvblJlc3VsdCBpbXBsZW1lbnRzIFZhbGlkYXRpb25SZXN1bHQgeworCisgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Pz4+IGNvbnN0cmFpbnRWaW9sYXRpb25TZXQ7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWaW9sYXRpb25zKFNldDxDb25zdHJhaW50VmlvbGF0aW9uPD8+PiB2aW9sYXRpb25zKSB7CisgICAgICAgIHRoaXMuY29uc3RyYWludFZpb2xhdGlvblNldCA9IG5ldyBIYXNoU2V0PD4odmlvbGF0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPD8+PiBnZXRBbGxWaW9sYXRpb25zKCkgeworICAgICAgICByZXR1cm4gY29uc3RyYWludFZpb2xhdGlvblNldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxlZCgpIHsKKyAgICAgICAgcmV0dXJuIChjb25zdHJhaW50VmlvbGF0aW9uU2V0ICE9IG51bGwpID8gIWNvbnN0cmFpbnRWaW9sYXRpb25TZXQuaXNFbXB0eSgpIDogZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRWaW9sYXRpb25Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIChjb25zdHJhaW50VmlvbGF0aW9uU2V0ICE9IG51bGwpID8gY29uc3RyYWludFZpb2xhdGlvblNldC5zaXplKCkgOiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvTm9uSmF4UnNWYWxpZGF0ZWRCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L05vbkpheFJzVmFsaWRhdGVkQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGFjYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L05vbkpheFJzVmFsaWRhdGVkQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCisvKioKKyAqIENESSBiZWFuIHRoYXQgZ2V0cyB2YWxpZGF0ZWQgYnkgSGliZXJuYXRlIHZhbGlkYXRvciBkaXJlY3RseS4KKyAqIFRoaXMgaXMgdG8gZW5zdXJlIEplcnNleSBpbnRlcmNlcHRvciB3cmFwcGVyCisgKiBkb2VzIG5vdCBibG9jayB0aGUgb3JpZ2luYWwgdmFsaWRhdG9yIGZyb20gZnVuY3Rpb25pbmcKKyAqIG9uIHJhdyBDREkgYmVhbnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBOb25KYXhSc1ZhbGlkYXRlZEJlYW4geworCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBOb3ROdWxsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9WYWxpZGF0aW9uUmVzdWx0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1ZhbGlkYXRpb25SZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzIzNzkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9WYWxpZGF0aW9uUmVzdWx0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOworCisvKioKKyAqIEFuIGludGVyZmFjZSB0byBiZSB1dGlsaXplZCB3aGVuIHJlc291cmNlIG1ldGhvZCB2YWxpZGF0aW9uIGlzc3VlcworICogYXJlIHRvIGJlIGhhbmRsZWQgd2l0aGluIGFjdHVhbCByZXNvdXJjZSBtZXRob2QuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBzZXQgb2YgYWxsIGNvbnN0cmFpbnQgdmlvbGF0aW9ucyBkZXRlY3RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQWxsIGNvbnN0cmFpbnQgdmlvbGF0aW9ucyBkZXRlY3RlZAorICAgICAqLworICAgIHB1YmxpYyBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4gZ2V0QWxsVmlvbGF0aW9ucygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY29uc3RyYWludCB2aW9sYXRpb24uCisgICAgICogU2FtZSBhcyBjaGVja2luZyB3aGV0aGVyIHtAbGluayAjZ2V0VmlvbGF0aW9uQ291bnQoKX0gaXMgZ3JlYXRlciB0aGFuIHplcm8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjb25zdHJhaW50IHZpb2xhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhaWxlZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbnN0cmFpbnQgdmlvbGF0aW9ucyBkZXRlY3RlZC4gU2FtZSBhcyBjYWxsaW5nCisgICAgICogPGNvZGU+Z2V0QWxsVmlvbGF0aW9ucygpLnNpemUoKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY29uc3RyYWludCB2aW9sYXRpb25zCisgICAgICovCisgICAgaW50IGdldFZpb2xhdGlvbkNvdW50KCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1ZhbGlkYXRpb25SZXN1bHRVdGlsLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1ZhbGlkYXRpb25SZXN1bHRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ZGExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvVmFsaWRhdGlvblJlc3VsdFV0aWwuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fS4KKyAqCisgKiBAYXV0aG9yIFNhbnRpYWdvIFBlcmljYXMtR2VlcnRzZW4KKyAqLworQFZldG9lZAorcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25SZXN1bHRVdGlsIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX1JFU1VMVCA9IFZhbGlkYXRpb25SZXN1bHQuY2xhc3MuZ2V0TmFtZSgpOworCisgICAgcHJpdmF0ZSBWYWxpZGF0aW9uUmVzdWx0VXRpbCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJJbnN0YW50aWF0aW9uIG5vdCBhbGxvd2VkLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlYXJjaCBmb3IgYSB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0gZmllbGQgaW4gdGhlIHJlc291cmNlJ3MKKyAgICAgKiBjbGFzcyBoaWVyYXJjaHkuIEZpZWxkIG11c3QgYmUgYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LmluamVjdC5JbmplY3R9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gZmllbGQgb3Ige0Bjb2RlIG51bGx9IGlmIG5vbmUgaXMgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBGaWVsZCBnZXRWYWxpZGF0aW9uUmVzdWx0RmllbGQoZmluYWwgT2JqZWN0IHJlc291cmNlKSB7CisgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gcmVzb3VyY2UuZ2V0Q2xhc3MoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZm9yIChGaWVsZCBmIDogY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKSkgeworICAgICAgICAgICAgICAgIC8vIE9mIFZhbGlkYXRpb25SZXN1bHQgYW5kIENESSBpbmplY3RhYmxlCisgICAgICAgICAgICAgICAgaWYgKGYuZ2V0VHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoVkFMSURBVElPTl9SRVNVTFQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmLmdldEFubm90YXRpb24oSW5qZWN0LmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9IHdoaWxlIChjbGF6eiAhPSBPYmplY3QuY2xhc3MpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIGEge0Bjb2RlIGphdmF4Lm12Yy52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHR9IGZpZWxkLiBJbiBwc2V1ZG8tY29kZToKKyAgICAgKiA8cC8+CisgICAgICogcmVzb3VyY2UuZmllbGQuc2V0VmlvbGF0aW9ucyhjb25zdHJhaW50cykKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAgICByZXNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gZmllbGQgICAgICAgZmllbGQgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gY29uc3RyYWludHMgbmV3IHNldCBvZiBjb25zdHJhaW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlVmFsaWRhdGlvblJlc3VsdEZpZWxkKE9iamVjdCByZXNvdXJjZSwgRmllbGQgZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4gY29uc3RyYWludHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gZmllbGQuZ2V0KHJlc291cmNlKTsKKyAgICAgICAgICAgIE1ldGhvZCBzZXR0ZXI7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNldHRlciA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0VmlvbGF0aW9ucyIsIFNldC5jbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHNldHRlciA9IG9iai5nZXRDbGFzcygpLmdldFN1cGVyY2xhc3MoKS5nZXRNZXRob2QoInNldFZpb2xhdGlvbnMiLCBTZXQuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0dGVyLmludm9rZShvYmosIGNvbnN0cmFpbnRzKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlIGZvciBub3cKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGFtbiBpdC4uLiIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXaGF0IHRoZSBoZWNrLi4uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIGEge0Bjb2RlIGphdmF4Lm12Yy52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHR9IHByb3BlcnR5LiBJbiBwc2V1ZG8tY29kZToKKyAgICAgKiA8cC8+CisgICAgICogb2JqID0gZ2V0dGVyLmludm9rZShyZXNvdXJjZSk7CisgICAgICogb2JqLnNldFZpb2xhdGlvbnMoY29uc3RyYWludHMpOworICAgICAqIHNldHRlci5pbnZva2UocmVzb3VyY2UsIG9iaik7CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgICAgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIGdldHRlciAgICAgIGdldHRlciB0byBiZSB1c2VkLgorICAgICAqIEBwYXJhbSBjb25zdHJhaW50cyBuZXcgc2V0IG9mIGNvbnN0cmFpbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVWYWxpZGF0aW9uUmVzdWx0UHJvcGVydHkoT2JqZWN0IHJlc291cmNlLCBNZXRob2QgZ2V0dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Pz4+IGNvbnN0cmFpbnRzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gZ2V0dGVyLmludm9rZShyZXNvdXJjZSk7CisgICAgICAgICAgICBNZXRob2Qgc2V0VmlvbGF0aW9uczsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2V0VmlvbGF0aW9ucyA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0VmlvbGF0aW9ucyIsIFNldC5jbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHNldFZpb2xhdGlvbnMgPSBvYmouZ2V0Q2xhc3MoKS5nZXRTdXBlcmNsYXNzKCkuZ2V0TWV0aG9kKCJzZXRWaW9sYXRpb25zIiwgU2V0LmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFZpb2xhdGlvbnMuaW52b2tlKG9iaiwgY29uc3RyYWludHMpOworCisgICAgICAgICAgICBmaW5hbCBNZXRob2Qgc2V0dGVyID0gZ2V0VmFsaWRhdGlvblJlc3VsdFNldHRlcihyZXNvdXJjZSk7CisKKyAgICAgICAgICAgIGlmIChzZXR0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldHRlci5pbnZva2UocmVzb3VyY2UsIG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZSBmb3Igbm93CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGEgcmVzb3VyY2UgaGFzIGEgcHJvcGVydHkgb2YgdHlwZSB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBvdXRjb21lIG9mIHRlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1ZhbGlkYXRpb25SZXN1bHRQcm9wZXJ0eShmaW5hbCBPYmplY3QgcmVzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25SZXN1bHRHZXR0ZXIocmVzb3VyY2UpICE9IG51bGwgJiYgZ2V0VmFsaWRhdGlvblJlc3VsdFNldHRlcihyZXNvdXJjZSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZ2V0dGVyIGZvciB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0gb3Ige0Bjb2RlIG51bGx9CisgICAgICogaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGdldHRlciBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRWYWxpZGF0aW9uUmVzdWx0R2V0dGVyKGZpbmFsIE9iamVjdCByZXNvdXJjZSkgeworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IHJlc291cmNlLmdldENsYXNzKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZvciAoTWV0aG9kIG0gOiBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkYXRpb25SZXN1bHRHZXR0ZXIobSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0gd2hpbGUgKGNsYXp6ICE9IE9iamVjdC5jbGFzcyk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYSBtZXRob2QgaXMgYSBnZXR0ZXIgZm9yIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIG1ldGhvZCB0byB0ZXN0LgorICAgICAqIEByZXR1cm4gb3V0Y29tZSBvZiB0ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVzdWx0R2V0dGVyKE1ldGhvZCBtKSB7CisgICAgICAgIHJldHVybiBtLmdldE5hbWUoKS5zdGFydHNXaXRoKCJnZXQiKQorICAgICAgICAgICAgICAgICYmIG0uZ2V0UmV0dXJuVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoVkFMSURBVElPTl9SRVNVTFQpCisgICAgICAgICAgICAgICAgJiYgTW9kaWZpZXIuaXNQdWJsaWMobS5nZXRNb2RpZmllcnMoKSkgJiYgbS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXR0ZXIgZm9yIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fSBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiBpZiBvbmUgY2Fubm90IGJlIGZvdW5kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gc2V0dGVyIG9yIHtAY29kZSBudWxsfSBpZiBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFZhbGlkYXRpb25SZXN1bHRTZXR0ZXIoZmluYWwgT2JqZWN0IHJlc291cmNlKSB7CisgICAgICAgIHJldHVybiBnZXRWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKHJlc291cmNlLmdldENsYXNzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBnZXRWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKGZpbmFsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSByZXNvdXJjZUNsYXNzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBmb3IgKE1ldGhvZCBtIDogY2xhenouZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKG0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9IHdoaWxlIChjbGF6eiAhPSBPYmplY3QuY2xhc3MpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIGEgbWV0aG9kIGlzIGEgc2V0dGVyIGZvciB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0uCisgICAgICogQXMgYSBDREkgaW5pdGlhbGl6ZXIgbWV0aG9kLCBpdCBtdXN0IGJlIGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC5pbmplY3QuSW5qZWN0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIG1ldGhvZCB0byB0ZXN0LgorICAgICAqIEByZXR1cm4gb3V0Y29tZSBvZiB0ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKE1ldGhvZCBtKSB7CisgICAgICAgIHJldHVybiBtLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzZXQiKSAmJiBtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICAmJiBtLmdldFBhcmFtZXRlclR5cGVzKClbMF0uZ2V0TmFtZSgpLmVxdWFscyhWQUxJREFUSU9OX1JFU1VMVCkKKyAgICAgICAgICAgICAgICAmJiBtLmdldFJldHVyblR5cGUoKSA9PSBWb2lkLlRZUEUgJiYgTW9kaWZpZXIuaXNQdWJsaWMobS5nZXRNb2RpZmllcnMoKSkKKyAgICAgICAgICAgICAgICAmJiBtLmdldEFubm90YXRpb24oSW5qZWN0LmNsYXNzKSAhPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24gYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzZkNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idi5DZGlWYWxpZGF0aW9uUmVzdWx0QmluZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlciBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzNmQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2LkNkaVZhbGlkYXRpb25SZXN1bHRCaW5kZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOWNjNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQmFzZVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0Jhc2VWYWxpZGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZWIzZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0Jhc2VWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQ29tbW9uIHRlc3QgZm9yIHJlc291cmNlIHZhbGlkYXRpb24uIFRoZSBzYW1lIHNldCBvZiB0ZXN0cyBpcyB1c2VkCisgKiBmb3IgdGhlIGZvbGxvd2luZyBzY2VuYXJpb3M6IEdyaXp6bHkgYmFzZWQgY29tYmluZWQgZGVwbG95bWVudCB3aXRoIENESSBlbmFibGVkLAorICogV0FSIGJhc2VkIGNvbWJpbmVkIGRlcGxveW1lbnQgd2l0aCBDREkgZW5hYmxlZCwgR3JpenpseSBiYXNlZCBkZXBsb3ltZW50IHdpdGhvdXQgQ0RJIGVuYWJsZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRBcHBQYXRoKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJjZGktYmVhbnZhbGlkYXRpb24td2ViYXBwIikucGF0aChnZXRBcHBQYXRoKCkpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1WYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbSh0YXJnZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIF90ZXN0UGFyYW1WYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSW50ZWdlciBlcnJvcnMgPSB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnBhdGgoInZhbGlkYXRlZCIpLnBhdGgoInBhcmFtIikucGF0aCgidmFsaWRhdGUiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoZXJyb3JzLCBpcygxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1WYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZCh0YXJnZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIF90ZXN0UGFyYW1WYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVnZXIgZXJyb3JzID0gdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKS5wYXRoKCJ2YWxpZGF0ZWQiKS5wYXRoKCJmaWVsZCIpLnBhdGgoInZhbGlkYXRlIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJvbmUiKS5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGVycm9ycywgaXMoMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RmllbGRWYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0odGFyZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEludGVnZXIgZXJyb3JzID0gdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYXRoKCJ2YWxpZGF0ZWQiKS5wYXRoKCJmaWVsZCIpLnBhdGgoInZhbGlkYXRlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChJbnRlZ2VyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGVycm9ycywgaXMoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RmllbGRWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQodGFyZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlZ2VyIGVycm9ycyA9IHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykucGF0aCgidmFsaWRhdGVkIikucGF0aCgiZmllbGQiKS5wYXRoKCJ2YWxpZGF0ZSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInEiLCAib25lIikucmVxdWVzdCgpLmdldChJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlcnJvcnMsIGlzKDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RQcm9wZXJ0eVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJbnRlZ2VyIGVycm9ycyA9IHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucGF0aCgidmFsaWRhdGVkIikucGF0aCgicHJvcGVydHkiKS5wYXRoKCJ2YWxpZGF0ZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChlcnJvcnMsIGlzKDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RQcm9wZXJ0eVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZWdlciBlcnJvcnMgPSB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpLnBhdGgoInZhbGlkYXRlZCIpLnBhdGgoInByb3BlcnR5IikucGF0aCgidmFsaWRhdGUiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIm9uZSIpLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoZXJyb3JzLCBpcygwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2xkRmFzaGlvbmVkUmVzb3VyY2VOb1BhcmFtKCkgeworICAgICAgICBfdGVzdE9sZEZhc2hpb25lZFJlc291cmNlTm9QYXJhbSh0YXJnZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIF90ZXN0T2xkRmFzaGlvbmVkUmVzb3VyY2VOb1BhcmFtKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucGF0aCgib2xkIikucGF0aCgiZmFzaGlvbmVkIikucGF0aCgidmFsaWRhdGUiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2xkRmFzaGlvbmVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T2xkRmFzaGlvbmVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RPbGRGYXNoaW9uZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykucGF0aCgib2xkIikucGF0aCgiZmFzaGlvbmVkIikucGF0aCgidmFsaWRhdGUiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIm9uZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZSwgaXMoIm9uZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3ROb25KYXhSc1ZhbGlkYXRpb25GaWVsZFZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIEludGVnZXIgZXJyb3JzID0gdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYXRoKCJ2YWxpZGF0ZWQiKS5wYXRoKCJmaWVsZCIpLnBhdGgoInZhbGlkYXRlIikucGF0aCgibm9uLWpheHJzIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJub3QtaW1wb3J0YW50LWp1c3QtdG8tZ2V0LXRoaXMtdGhyb3VnaC1qYXgtcnMiKS5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoZXJyb3JzLCBpcygxKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIF90ZXN0Tm9uSmF4UnNWYWxpZGF0aW9uRmllbGRWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICBJbnRlZ2VyIGVycm9ycyA9IHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucGF0aCgidmFsaWRhdGVkIikucGF0aCgiZmllbGQiKS5wYXRoKCJ2YWxpZGF0ZSIpLnBhdGgoIm5vbi1qYXhycyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInEiLCAibm90LWltcG9ydGFudC1qdXN0LXRvLWdldC10aGlzLXRocm91Z2gtamF4LXJzIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiaCIsICJidW1tZXIiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoZXJyb3JzLCBpcygwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9Db21iaW5lZFRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ29tYmluZWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3YjBlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ29tYmluZWRUZXN0LmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBDb250YWluZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBIYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVyczsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5lbnZpcm9ubWVudC5zZS5XZWxkOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBib3RoIEplcnNleSBhcHBzIHJ1bm5pbmcgc2ltdWx0YW5lb3VzbHkgd2l0aGluIGEgc2luZ2xlIEdyaXp6bHkgSFRUUCBzZXJ2ZXIKKyAqIHRvIG1ha2Ugc3VyZSBpbmplY3Rpb24gbWFuYWdlcnMgZG8gbm90IGludGVyZmVyZS4gVGhlIHRlc3QgaXMgbm90IGV4ZWN1dGVkCisgKiBpZiBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IChHcml6emx5KSB0ZXN0IGNvbnRhaW5lciBoYXMgYmVlbiBzZXQuCisgKiBGb3IgU2VydmxldCBiYXNlZCBjb250YWluZXIgdGVzdGluZywgdGhlIG90aGVyIHR3byB0ZXN0cywge0BsaW5rIFJhd0NkaVRlc3R9IGFuZCB7QGxpbmsgUmF3SGsyVGVzdH0sCisgKiBkbyB0aGUgc2FtZSBqb2IsIGJlY2F1c2UgdGhlIFdBUiBhcHBsaWNhdGlvbiBjb250YWlucyBib3RoIEplcnNleSBhcHBzIGFscmVhZHkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENvbWJpbmVkVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRElfVVJJID0gIi9jZGkiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhLMl9VUkkgPSAiL2hrMiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05VTUJFUiA9IGdldFN5c3RlbVByb3BlcnR5KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoVGVzdFByb3BlcnRpZXMuREVGQVVMVF9DT05UQUlORVJfUE9SVCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfSEsyX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIFBPUlRfTlVNQkVSICsgSEsyX1VSSSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfQ0RJX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIFBPUlRfTlVNQkVSICsgQ0RJX1VSSSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0ID0gaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQoKTsKKworICAgIFdlbGQgd2VsZDsKKyAgICBIdHRwU2VydmVyIGNkaVNlcnZlcjsKKworICAgIENsaWVudCBjbGllbnQ7CisgICAgV2ViVGFyZ2V0IGNkaVRhcmdldCwgaGsyVGFyZ2V0OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCAmJiBIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemVXZWxkKCk7CisgICAgICAgICAgICBzdGFydEdyaXp6bHlDb250YWluZXIoKTsKKyAgICAgICAgICAgIGluaXRpYWxpemVDbGllbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmVJc0ltbWVkaWF0ZSgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlcigpIHsKKyAgICAgICAgaWYgKGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0ICYmIEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSkgeworICAgICAgICAgICAgY2RpU2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICB3ZWxkLnNodXRkb3duKCk7CisgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUaGF0KGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0LCBDb3JlTWF0Y2hlcnMuaXModHJ1ZSkpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShjZGlUYXJnZXQpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShoazJUYXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUaGF0KGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0LCBDb3JlTWF0Y2hlcnMuaXModHJ1ZSkpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChjZGlUYXJnZXQpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChoazJUYXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUaGF0KGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0LCBDb3JlTWF0Y2hlcnMuaXModHJ1ZSkpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RGaWVsZFZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShjZGlUYXJnZXQpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RGaWVsZFZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShoazJUYXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUaGF0KGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0LCBDb3JlTWF0Y2hlcnMuaXModHJ1ZSkpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RGaWVsZFZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChjZGlUYXJnZXQpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RGaWVsZFZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChoazJUYXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUaGF0KGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0LCBDb3JlTWF0Y2hlcnMuaXModHJ1ZSkpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RQcm9wZXJ0eVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShjZGlUYXJnZXQpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RQcm9wZXJ0eVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShoazJUYXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUaGF0KGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0LCBDb3JlTWF0Y2hlcnMuaXModHJ1ZSkpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RQcm9wZXJ0eVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChjZGlUYXJnZXQpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RQcm9wZXJ0eVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChoazJUYXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9sZEZhc2hpb25lZFJlc291cmNlTm9QYXJhbSgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdE9sZEZhc2hpb25lZFJlc291cmNlTm9QYXJhbShjZGlUYXJnZXQpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RPbGRGYXNoaW9uZWRSZXNvdXJjZU5vUGFyYW0oaGsyVGFyZ2V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbGRGYXNoaW9uZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdE9sZEZhc2hpb25lZFJlc291cmNlUGFyYW1Qcm92aWRlZChjZGlUYXJnZXQpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3RPbGRGYXNoaW9uZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoaGsyVGFyZ2V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25KYXhSc1ZhbGlkYXRpb25GaWVsZFZhbGlkYXRlZFJlc291cmNlTm9QYXJhbSgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdE5vbkpheFJzVmFsaWRhdGlvbkZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGNkaVRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uSmF4UnNWYWxpZGF0aW9uRmllbGRWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUaGF0KGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0LCBDb3JlTWF0Y2hlcnMuaXModHJ1ZSkpOworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3ROb25KYXhSc1ZhbGlkYXRpb25GaWVsZFZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChjZGlUYXJnZXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplV2VsZCgpIHsKKyAgICAgICAgd2VsZCA9IG5ldyBXZWxkKCk7CisgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydEdyaXp6bHlDb250YWluZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjZGlDb25maWcgPSBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKENkaUFwcGxpY2F0aW9uLmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgaGsyQ29uZmlnID0gUmVzb3VyY2VDb25maWcuZm9yQXBwbGljYXRpb25DbGFzcyhIazJBcHBsaWNhdGlvbi5jbGFzcyk7CisKKyAgICAgICAgY2RpU2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9DRElfVVJJLCBjZGlDb25maWcsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgSHR0cEhhbmRsZXIgaGsySGFuZGxlciA9IGNyZWF0ZUdyaXp6bHlDb250YWluZXIoaGsyQ29uZmlnKTsKKyAgICAgICAgY2RpU2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKS5hZGRIdHRwSGFuZGxlcihoazJIYW5kbGVyLCBISzJfVVJJKTsKKyAgICAgICAgY2RpU2VydmVyLnN0YXJ0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDbGllbnQoKSB7CisgICAgICAgIGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGNkaVRhcmdldCA9IGNsaWVudC50YXJnZXQoQkFTRV9DRElfVVJJKTsKKyAgICAgICAgaGsyVGFyZ2V0ID0gY2xpZW50LnRhcmdldChCQVNFX0hLMl9VUkkpOworICAgIH0KKworICAgIHByaXZhdGUgR3JpenpseUh0dHBDb250YWluZXIgY3JlYXRlR3JpenpseUNvbnRhaW5lcihSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZykgeworICAgICAgICByZXR1cm4gKG5ldyBHcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyKCkpLmNyZWF0ZUNvbnRhaW5lcihHcml6emx5SHR0cENvbnRhaW5lci5jbGFzcywgcmVzb3VyY2VDb25maWcpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0Q29udGFpbmVyRmFjdG9yeSA9IGdldFN5c3RlbVByb3BlcnR5KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9GQUNUT1JZLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIHRlc3RDb250YWluZXJGYWN0b3J5ID09IG51bGwgfHwgVGVzdFByb3BlcnRpZXMuREVGQVVMVF9DT05UQUlORVJfRkFDVE9SWS5lcXVhbHModGVzdENvbnRhaW5lckZhY3RvcnkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgc3lzdGVtUHJvcGVydGllcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIHJldHVybiBzeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZGVmYXVsdFZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1Jhd0NkaVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvUmF3Q2RpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjk5NmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1Jhd0NkaVRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5lbnZpcm9ubWVudC5zZS5XZWxkOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKioKKyAqIFZhbGlkYXRpb24gcmVzdWx0IHRlc3QgZm9yIENESSBlbnZpcm9ubWVudC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmF3Q2RpVGVzdCBleHRlbmRzIEJhc2VWYWxpZGF0aW9uVGVzdCB7CisKKyAgICBXZWxkIHdlbGQ7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSkgeworICAgICAgICAgICAgaWYgKCFFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHdlbGQgPSBuZXcgV2VsZCgpOworICAgICAgICAgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpIHsKKyAgICAgICAgICAgIGlmICghRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICB3ZWxkLnNodXRkb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoQ2RpQXBwbGljYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICJjZGkiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkpheFJzVmFsaWRhdGlvbkZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKCkgeworICAgICAgICBCYXNlVmFsaWRhdGlvblRlc3QuX3Rlc3ROb25KYXhSc1ZhbGlkYXRpb25GaWVsZFZhbGlkYXRlZFJlc291cmNlTm9QYXJhbSh0YXJnZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uSmF4UnNWYWxpZGF0aW9uRmllbGRWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdE5vbkpheFJzVmFsaWRhdGlvbkZpZWxkVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKHRhcmdldCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1Jhd0hrMlRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvUmF3SGsyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4M2VhNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1Jhd0hrMlRlc3QuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFZhbGlkYXRpb24gcmVzdWx0IHRlc3QgZm9yIHJhdyBISzIgZW52aXJvbm1lbnQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJhd0hrMlRlc3QgZXh0ZW5kcyBCYXNlVmFsaWRhdGlvblRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoSGsyQXBwbGljYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICJoazIiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWIwNTIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLWVqYi10ZXN0LXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1jZGktZWpiLXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgQ0RJL0VKQiB0ZXN0IHdlYiBhcHBsaWNhdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lamI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lamItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9CYXNpY1RpbWVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9CYXNpY1RpbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1ZmFlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0Jhc2ljVGltZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKKy8qKgorICogQmFzaWMgdGltZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgcmV1c2VkIGZvciB2YXJpb3VzIHR5cGVzIG9mIGJlYW5zLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2ljVGltZXIgeworCisgICAgbG9uZyBtczsKKworICAgLyoqCisgICAgKiBQcm92aWRlIGluZm9ybWF0aW9uIG9uIGludGVybmFsIHRpbWVyIG1pbGxpc2Vjb25kIHZhbHVlLgorICAgICoKKyAgICAqIEByZXR1cm4gbWlsbGlzZWNvbmRzIHdoZW4gdGhlIGN1cnJlbnQgYmVhbiBoYXMgYmVlbiBwb3N0LWNvbnN0cnVjdGVkLgorICAgICovCisgICBwdWJsaWMgbG9uZyBnZXRNaWxpc2Vjb25kcygpIHsKKyAgICAgICByZXR1cm4gbXM7CisgICB9CisKKyAgIC8qKgorICAgICogSW5pdGlhbGl6ZSB0aGlzIHRpbWVyIHdpdGggdGhlIGN1cnJlbnQgdGltZS4KKyAgICAqLworICAgQFBvc3RDb25zdHJ1Y3QKKyAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgdGhpcy5tcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpQXBwU2NvcGVkVGltZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaUFwcFNjb3BlZFRpbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5ZTY2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaUFwcFNjb3BlZFRpbWVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCisvKioKKyAqIEFwcGxpY2F0aW9uIHNjb3BlZCBDREkgYmVhbiB0byBiZSBpbmplY3RlZCBpbnRvIEVKQiByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgQ2RpQXBwU2NvcGVkVGltZXIgZXh0ZW5kcyBCYXNpY1RpbWVyIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVJlcXVlc3RTY29wZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpUmVxdWVzdFNjb3BlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlNjIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVJlcXVlc3RTY29wZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIFJlcXVlc3Qgc2NvcGVkIENESSBiZWFuIGluamVjdGVkIHdpdGggRUpCIHRpbWVycy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoInJlcXVlc3Qtc2NvcGVkIikKK3B1YmxpYyBjbGFzcyBDZGlSZXF1ZXN0U2NvcGVkUmVzb3VyY2UgeworCisgICAgQEVKQiBFamJTaW5nbGV0b25UaW1lciBlamJJbmplY3RlZFRpbWVyOworICAgIEBJbmplY3QgRWpiU2luZ2xldG9uVGltZXIganNyMzMwSW5qZWN0ZWRUaW1lcjsKKyAgICBASW5qZWN0IENkaUFwcFNjb3BlZFRpbWVyIGNkaVRpbWVyOworCisgICAgQEdFVAorICAgIEBQYXRoKCJlamItaW5qZWN0ZWQtdGltZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWpiVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoZWpiSW5qZWN0ZWRUaW1lci5nZXRNaWxpc2Vjb25kcygpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImpzcjMzMC1pbmplY3RlZC10aW1lciIpCisgICAgcHVibGljIFN0cmluZyBnZXRKc3IzMzBUaW1lKCkgeworICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhqc3IzMzBJbmplY3RlZFRpbWVyLmdldE1pbGlzZWNvbmRzKCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldE15c2VsZigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlSZXF1ZXN0U2NvcGVkVGltZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVJlcXVlc3RTY29wZWRUaW1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OGUxZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlSZXF1ZXN0U2NvcGVkVGltZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlZCBDREkgdGltZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlSZXF1ZXN0U2NvcGVkVGltZXIgZXh0ZW5kcyBCYXNpY1RpbWVyIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlNpbmdsZXRvblJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJTaW5nbGV0b25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDcyZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJTaW5nbGV0b25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVqYi5TaW5nbGV0b247CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBFSkIgc2luZ2xldG9uIHNlc3Npb24gYmVhbiBpbmplY3RlZCB3aXRoIENESSB0aW1lcnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorQFBhdGgoInNpbmdsZXRvbiIpCitwdWJsaWMgY2xhc3MgRWpiU2luZ2xldG9uUmVzb3VyY2UgeworCisgICAgQEluamVjdCBDZGlSZXF1ZXN0U2NvcGVkVGltZXIgcmVxdWVzdFNjb3BlZFRpbWVyOworICAgIEBJbmplY3QgQ2RpQXBwU2NvcGVkVGltZXIgYXBwU2NvcGVkVGltZXI7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3Qtc2NvcGVkLXRpbWVyIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcVRpbWUoKSB7CisgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHJlcXVlc3RTY29wZWRUaW1lci5nZXRNaWxpc2Vjb25kcygpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImFwcC1zY29wZWQtdGltZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoYXBwU2NvcGVkVGltZXIuZ2V0TWlsaXNlY29uZHMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU2luZ2xldG9uVGltZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlNpbmdsZXRvblRpbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlYzA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlNpbmdsZXRvblRpbWVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLlNpbmdsZXRvbjsKKworLyoqCisgKiBFSkIgc2luZ2xldG9uIHRpbWVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBFamJTaW5nbGV0b25UaW1lciBleHRlbmRzIEJhc2ljVGltZXIgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU3RhdGVmdWxSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU3RhdGVmdWxSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZmJjOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJTdGF0ZWZ1bFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLlN0YXRlZnVsOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogRUpCIGJhY2tlZCBKQVgtUlMgcmVzb3VyY2UgaW5qZWN0ZWQgd2l0aCBDREkgc2VydmljZSBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlZnVsCitAUGF0aCgic3RhdGVmdWwiKQorcHVibGljIGNsYXNzIEVqYlN0YXRlZnVsUmVzb3VyY2UgeworCisgICAgQEluamVjdCBDZGlSZXF1ZXN0U2NvcGVkVGltZXIgcmVxdWVzdFNjb3BlZFRpbWVyOworICAgIEBJbmplY3QgQ2RpQXBwU2NvcGVkVGltZXIgYXBwU2NvcGVkVGltZXI7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3Qtc2NvcGVkLXRpbWVyIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcVRpbWUoKSB7CisgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHJlcXVlc3RTY29wZWRUaW1lci5nZXRNaWxpc2Vjb25kcygpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImFwcC1zY29wZWQtdGltZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoYXBwU2NvcGVkVGltZXIuZ2V0TWlsaXNlY29uZHMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU3RhdGVsZXNzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlN0YXRlbGVzc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkYTFjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlN0YXRlbGVzc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEVKQiBzZXNzaW9uIGJlYW4gaW5qZWN0ZWQgd2l0aCBDREkgc2VydmljZSBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlbGVzcworQFBhdGgoInN0YXRlbGVzcyIpCitwdWJsaWMgY2xhc3MgRWpiU3RhdGVsZXNzUmVzb3VyY2UgeworCisgICAgQEluamVjdCBDZGlSZXF1ZXN0U2NvcGVkVGltZXIgcmVxdWVzdFNjb3BlZFRpbWVyOworICAgIEBJbmplY3QgQ2RpQXBwU2NvcGVkVGltZXIgYXBwU2NvcGVkVGltZXI7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3Qtc2NvcGVkLXRpbWVyIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcVRpbWUoKSB7CisgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHJlcXVlc3RTY29wZWRUaW1lci5nZXRNaWxpc2Vjb25kcygpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImFwcC1zY29wZWQtdGltZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoYXBwU2NvcGVkVGltZXIuZ2V0TWlsaXNlY29uZHMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU3RhdGVsZXNzVGltZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlN0YXRlbGVzc1RpbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxYWExOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlN0YXRlbGVzc1RpbWVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKKworLyoqCisgKiBFSkIgc2Vzc2lvbiB0aW1lciBiZWFuLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWxlc3MKK3B1YmxpYyBjbGFzcyBFamJTdGF0ZWxlc3NUaW1lciBleHRlbmRzIEJhc2ljVGltZXIgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTM5NWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiB0byBjb25maWd1cmUgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8qIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICBjbGFzc2VzLmFkZChDZGlSZXF1ZXN0U2NvcGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChDZGlSZXF1ZXN0U2NvcGVkVGltZXIuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChDZGlBcHBTY29wZWRUaW1lci5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEVqYlN0YXRlbGVzc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRWpiU3RhdGVmdWxSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEVqYlNpbmdsZXRvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTZiNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgoreG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICB2ZXJzaW9uPSIzLjAiPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpSW50b0VqYlRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaUludG9FamJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlODIyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaUludG9FamJUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IENESSB0aW1lcnMgaW5qZWN0ZWQgaW50byBFSkIgYmVhbnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENkaUludG9FamJUZXN0IGV4dGVuZHMgVGVzdEJhc2UgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVsZXNzKCkgeworICAgICAgICBfdGVzdFJlcXVlc3RTY29wZWQoInN0YXRlbGVzcyIpOworICAgICAgICBfdGVzdEFwcFNjb3BlZCgic3RhdGVsZXNzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGVmdWwoKSB7CisgICAgICAgIF90ZXN0UmVxdWVzdFNjb3BlZCgic3RhdGVmdWwiKTsKKyAgICAgICAgX3Rlc3RBcHBTY29wZWQoInN0YXRlZnVsIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uKCkgeworICAgICAgICBfdGVzdFJlcXVlc3RTY29wZWQoInNpbmdsZXRvbiIpOworICAgICAgICBfdGVzdEFwcFNjb3BlZCgic2luZ2xldG9uIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UmVxdWVzdFNjb3BlZChmaW5hbCBTdHJpbmcgZWpiVHlwZSkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKGVqYlR5cGUpLnBhdGgoInJlcXVlc3Qtc2NvcGVkLXRpbWVyIik7CisgICAgICAgIGxvbmcgZmlyc3RNaWxsaXMgPSBfZ2V0TWlsbGlzKHRhcmdldCk7CisgICAgICAgIHNsZWVwKDIpOworICAgICAgICBsb25nIHNlY29uZE1pbGxpcyA9IF9nZXRNaWxsaXModGFyZ2V0KTsKKworICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgcmVxdWVzdCBzaG91bGQgaGF2ZSBncmVhdGVyIG1pbGxpcyEiLCBzZWNvbmRNaWxsaXMgPiBmaXJzdE1pbGxpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0QXBwU2NvcGVkKGZpbmFsIFN0cmluZyBlamJUeXBlKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoZWpiVHlwZSkucGF0aCgiYXBwLXNjb3BlZC10aW1lciIpOworICAgICAgICBsb25nIGZpcnN0TWlsbGlzID0gX2dldE1pbGxpcyh0YXJnZXQpOworICAgICAgICBzbGVlcCgyKTsKKyAgICAgICAgbG9uZyBzZWNvbmRNaWxsaXMgPSBfZ2V0TWlsbGlzKHRhcmdldCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2Vjb25kIHJlcXVlc3Qgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbWlsbGlzISIsIHNlY29uZE1pbGxpcyA9PSBmaXJzdE1pbGxpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiSW50b0NkaVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYkludG9DZGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxODM2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYkludG9DZGlUZXN0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKKworLyoqCisgKiBUZXN0IEVKQiB0aW1lcnMgaW5qZWN0ZWQgaW50byBDREkgYmVhbnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVqYkludG9DZGlUZXN0IGV4dGVuZHMgVGVzdEJhc2UgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uKCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjZGlSZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoInJlcXVlc3Qtc2NvcGVkIik7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlamJJbmplY3RlZFRpbWVyID0gY2RpUmVzb3VyY2UucGF0aCgiZWpiLWluamVjdGVkLXRpbWVyIik7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBqc3IzMzBJbmplY3RlZFRpbWVyID0gY2RpUmVzb3VyY2UucGF0aCgianNyMzMwLWluamVjdGVkLXRpbWVyIik7CisKKyAgICAgICAgU3RyaW5nIGZpcnN0UmVzb3VyY2UgPSBjZGlSZXNvdXJjZS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGxvbmcgZmlyc3RNaWxsaXMgPSBfZ2V0TWlsbGlzKGVqYkluamVjdGVkVGltZXIpOworICAgICAgICBzbGVlcCgyKTsKKyAgICAgICAgU3RyaW5nIHNlY29uZFJlc291cmNlID0gY2RpUmVzb3VyY2UucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBsb25nIHNlY29uZE1pbGxpcyA9IF9nZXRNaWxsaXMoanNyMzMwSW5qZWN0ZWRUaW1lcik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChmaXJzdE1pbGxpcywgZXF1YWxUbyhzZWNvbmRNaWxsaXMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaXJzdFJlc291cmNlLCBub3QoZXF1YWxUbyhzZWNvbmRSZXNvdXJjZSkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9UZXN0QmFzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvVGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTExODlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvVGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKKworLyoqCisgKiBUZXN0IGZvciBDREkgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlcy4KKyAqIFJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgdGFyZ2V0L2NkaS10ZXN0LXdlYmFwcAorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEJhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImNkaS1lamItdGVzdC13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBsb25nIF9nZXRNaWxsaXMoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIHJldHVybiBMb25nLmRlY29kZShyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNsZWVwKGxvbmcgbXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChtcyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKENkaUludG9FamJUZXN0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGNmMjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWNkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkgdXNpbmcgbm9uIEpBWC1SUyBpbXBsZW1lbnRhdGlvbiBmb3IgQ0RJIGluamVjdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBUZXN0c308L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke3Rlc3RDb250YWluZXJGYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke3Rlc3RDb250YWluZXJQb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpRWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaUVjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTdhOTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaUVjaG8uamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogUmF3IENESSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgRWNob30gc2VydmljZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2RpRWNobyBpbXBsZW1lbnRzIEVjaG8geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJDREkgRUNIT0VEICVzIiwgcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3M2Q2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCisvKioKKyAqIEVjaG8gc2VydmljZSBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBFY2hvIHsKKworICAgIC8qKgorICAgICAqIEVjaG8gc2VydmljZSBtZXRob2Q7CisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBpbnB1dAorICAgICAqIEByZXR1cm4gZWNob2VkIGlucHV0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBzKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2EwYzdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgY2xhc3MgYmFja2VkIGJ5IENESSBiZWFuLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJlY2hvIikKK3B1YmxpYyBjbGFzcyBFY2hvUmVzb3VyY2UgeworCisgICAgLy8gQ0RJIGluamVjdGlvbiwgSEsyIHNob3VsZCBiYWNrIG9mZgorICAgIC8vIGV2ZW4gaWYgRWNob0ltcGwgaXMgbm90IGRpcmVjdGx5IHVzZWQgaGVyZQorICAgIC8vIGFuZCBjb3VsZCBhcHBlYXIgYXMgSEsyIGN1c3RvbSBib3VuZCB0eXBlCisgICAgLy8gdG8gSmVyc2V5IENESSBleHRlbnNpb24KKyAgICBASW5qZWN0IEVjaG8gZWNob1NlcnZpY2U7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBjZGlFY2hvKEBRdWVyeVBhcmFtKCJzIikgU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8ocyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTUwNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGNsYXNzZXMuYWRkKEVjaG9SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTZiNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKK3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgdmVyc2lvbj0iMy4wIj4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2VUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1Jlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZTU4YjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1Jlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5zdGFydHNXaXRoOworCisvKioKKyAqIFRlc3QgZm9yIENESSB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLgorICogUnVuIHdpdGg6CisgKiA8cHJlPgorICogbXZuIGNsZWFuIHBhY2thZ2UKKyAqICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSB0YXJnZXQvY2RpLXRlc3Qtd2ViYXBwCisgKiBtdm4gLURza2lwVGVzdHM9ZmFsc2UgdGVzdDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFY2hvUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJjZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcCIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2RpSW5qZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiZWNobyIpLnF1ZXJ5UGFyYW0oInMiLCAiSSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBzdGFydHNXaXRoKCJDREkgRUNIT0VEIikpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNsZWVwKGxvbmcgbXMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChtcyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEVjaG9SZXNvdXJjZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvZWFyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvZWFyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwMWQxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9lYXIvcG9tLnhtbApAQCAtMCwwICsxLDg1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNkaS1tdWx0aW1vZHVsZS1lYXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tY2RpLW11bHRpbW9kdWxlLWVhcjwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZWFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlZmF1bHRMaWJCdW5kbGVEaXI+QVBQLUlORi9saWI8L2RlZmF1bHRMaWJCdW5kbGVEaXI+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGUtd2FyMTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvd2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLXdhcjI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3dlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqYXJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvamFyTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1tdWx0aW1vZHVsZS13YXIxPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLXdhcjI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1tdWx0aW1vZHVsZS1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5qYXI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM4Yzk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9wb20ueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1jZGktbXVsdGltb2R1bGUtbGliPC9uYW1lPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lamI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lamItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS9saWIvSmF4UnNJbmplY3RlZERlcGVuZGVudEJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvbGliL0pheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlY2E0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvbGliL0pheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkubGliOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogQ0RJIG1hbmFnZWQgYmVhbiwgdGhhdCBnZXRzIEpBWC1SUyBpbmplY3RlZC4gVGhpcyBiZWFuIGlzIGJlaW5nIGNvbnN1bWVkCisgKiBieSBhbGwgd2ViIGFwcHMgd2l0aGluIGFuIEVBUiBwYWNrYWdlZCBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0luamVjdGVkRGVwZW5kZW50QmVhbiB7CisKKyAgICBAQ29udGV4dAorICAgIFVyaUluZm8gdXJpSW5mbzsKKworICAgIEBIZWFkZXJQYXJhbSgieC10ZXN0IikKKyAgICBTdHJpbmcgdGVzdEhlYWRlcjsKKworICAgIC8qKgorICAgICAqIEdldCBtZSBVUkkgaW5mby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVVJJIGluZm8gZnJvbSB0aGUgSkFYLVJTIGxheWVyLgorICAgICAqLworICAgIHB1YmxpYyBVcmlJbmZvIGdldFVyaUluZm8oKSB7CisgICAgICAgIHJldHVybiB1cmlJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtZSB0aGUgYWN0dWFsIHJlcXVlc3QgdGVzdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFjdHVhbCByZXF1ZXN0IFVSSSBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHRlc3RIZWFkZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL2xpYi9KYXhSc0luamVjdGVkUmVxdWVzdFNjb3BlZEJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvbGliL0pheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjRlZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL2xpYi9KYXhSc0luamVjdGVkUmVxdWVzdFNjb3BlZEJlYW4uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS5saWI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIENESSBtYW5hZ2VkIGJlYW4sIHRoYXQgZ2V0cyBKQVgtUlMgaW5qZWN0ZWQuIFRoaXMgYmVhbiBpcyBiZWluZyBjb25zdW1lZAorICogYnkgYWxsIHdlYiBhcHBzIHdpdGhpbiBhbiBFQVIgcGFja2FnZWQgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIEpheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbiB7CisKKyAgICBAQ29udGV4dAorICAgIFVyaUluZm8gdXJpSW5mbzsKKworICAgIEBIZWFkZXJQYXJhbSgieC10ZXN0IikKKyAgICBTdHJpbmcgdGVzdEhlYWRlcjsKKworICAgIC8qKgorICAgICAqIEdldCBtZSB0aGUgYWN0dWFsIEpBWC1SUyByZXF1ZXN0IFVSSSBpbmZvLgorICAgICAqCisgICAgICogQHJldHVybiBhY3R1YWwgcmVxdWVzdCBVUkkgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXJpSW5mbyBnZXRVcmlJbmZvKCkgeworICAgICAgICByZXR1cm4gdXJpSW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbWUgdGhlIGFjdHVhbCByZXF1ZXN0IHRlc3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBhY3R1YWwgcmVxdWVzdCBVUkkgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3RIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiB0ZXN0SGVhZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ2ZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzZjk3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9wb20ueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tY2RpLW11bHRpbW9kdWxlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBDREkgTXVsdGktTW9kdWxlCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmVhcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmxpYjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndhcjE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT53YXIyPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5Y2VhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3BvbS54bWwKQEAgLTAsMCArMSwxMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLXdhcjE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tY2RpLW11bHRpbW9kdWxlLXdhcjwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My4xLjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBUZXN0c308L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke3Rlc3RDb250YWluZXJGYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke3Rlc3RDb250YWluZXJQb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9BcHBTY29wZWRKYXhSc1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIxL0FwcFNjb3BlZEpheFJzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTFhNjljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9BcHBTY29wZWRKYXhSc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkud2ViMTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLmxpYi5KYXhSc0luamVjdGVkRGVwZW5kZW50QmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkubGliLkpheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbjsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgYmFja2VkIGJ5IGFuIGFwcGxpY2F0aW9uIHNjb3BlZCBDREkgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICAqLworQFBhdGgoImFwcC1zY29wZWQiKQorQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgQXBwU2NvcGVkSmF4UnNSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuIHJlcVNjb3BlZEJlYW47CisKKyAgICBAUGF0aCgicmVxL2hlYWRlciIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxSGVhZGVyKCkgeworICAgICAgICByZXR1cm4gcmVxU2NvcGVkQmVhbi5nZXRUZXN0SGVhZGVyKCk7CisgICAgfQorCisgICAgQFBhdGgoInJlcS91cmkve3B9IikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRSZXFVcmkoKSB7CisgICAgICAgIHJldHVybiByZXFTY29wZWRCZWFuLmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCkudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjEvSmF4UnNBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjEvSmF4UnNBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGI2NGRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9KYXhSc0FwcC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLndlYjE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgSmF4UnNBcHAgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgICAgIGFkZChSZXF1ZXN0U2NvcGVkSmF4UnNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoQXBwU2NvcGVkSmF4UnNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH19OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjEvUmVxdWVzdFNjb3BlZEpheFJzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjEvUmVxdWVzdFNjb3BlZEpheFJzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBmZjNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9SZXF1ZXN0U2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLndlYjE7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLmxpYi5KYXhSc0luamVjdGVkRGVwZW5kZW50QmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkubGliLkpheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbjsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgYmFja2VkIGJ5IGEgcmVxdWVzdCBzY29wZWQgQ0RJIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAgKi8KK0BQYXRoKCJyZXF1ZXN0LXNjb3BlZCIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIFJlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBKYXhSc0luamVjdGVkRGVwZW5kZW50QmVhbiBkZXBlbmRlbnRCZWFuOworCisgICAgQEluamVjdAorICAgIEpheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbiByZXFTY29wZWRCZWFuOworCisgICAgQFBhdGgoInJlcS9oZWFkZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcUhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHJlcVNjb3BlZEJlYW4uZ2V0VGVzdEhlYWRlcigpOworICAgIH0KKworICAgIEBQYXRoKCJkZXBlbmRlbnQvaGVhZGVyIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXREZXBlbmRlbnRIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBkZXBlbmRlbnRCZWFuLmdldFRlc3RIZWFkZXIoKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVxL3VyaS97cH0iKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcVNjb3BlZEJlYW4uZ2V0VXJpSW5mbygpLmdldFJlcXVlc3RVcmkoKS50b1N0cmluZygpOworICAgIH0KKworICAgIEBQYXRoKCJkZXBlbmRlbnQvdXJpL3twfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwVXJpKCkgeworICAgICAgICByZXR1cm4gZGVwZW5kZW50QmVhbi5nZXRVcmlJbmZvKCkuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljMDJlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKQEAgLTAsMCArMSwzMSBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgICAgICAgPHRpdGxlPkpTUCBQYWdlPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgICAgIDxoMT5IZWxsbyBXb3JsZCE8L2gxPgorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjEvSmF4UnNDZGlJbnRlZ3JhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjEvSmF4UnNDZGlJbnRlZ3JhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNmMjkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9KYXhSc0NkaUludGVncmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS53ZWIxOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIENESSB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLiBUaGUgSkFYLVJTIHJlc291cmNlcyB1c2UgQ0RJIGNvbXBvbmVudHMgZnJvbSBhIGxpYnJhcnkgamFyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0NkaUludGVncmF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImNkaS1tdWx0aW1vZHVsZS13YXIxIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUluZm9JbmplY3Rpb25SZXFTY29wZWRSZXNvdXJjZURlcGVuZGVudEJlYW4oKSB7CisgICAgICAgIF90ZXN0UmVzb3VyY2UoInJlcXVlc3Qtc2NvcGVkL2RlcGVuZGVudCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUluZm9JbmplY3Rpb25SZXFTY29wZWRSZXNvdXJjZVJlcXVlc3RTY29wZWRCZWFuKCkgeworICAgICAgICBfdGVzdFJlc291cmNlKCJyZXF1ZXN0LXNjb3BlZC9yZXEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlJbmZvSW5qZWN0aW9uQXBwU2NvcGVkUmVzb3VyY2VSZXF1ZXN0U2NvcGVkQmVhbigpIHsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZSgiYXBwLXNjb3BlZC9yZXEiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VQYXRoKSB7CisgICAgICAgIF90ZXN0VXJpSW5mbyhyZXNvdXJjZVBhdGgpOworICAgICAgICBfdGVzdEhlYWRlcihyZXNvdXJjZVBhdGgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFVyaUluZm8oU3RyaW5nIHJlc291cmNlUGF0aCkgeworCisgICAgICAgIF90ZXN0U2luZ2xlUGF0aFVyaVVuZm8ocmVzb3VyY2VQYXRoLCAib25lIik7CisgICAgICAgIF90ZXN0U2luZ2xlUGF0aFVyaVVuZm8ocmVzb3VyY2VQYXRoLCAidHdvIik7CisgICAgICAgIF90ZXN0U2luZ2xlUGF0aFVyaVVuZm8ocmVzb3VyY2VQYXRoLCAidGhyZWUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RTaW5nbGVQYXRoVXJpVW5mbyhmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgcGF0aFBhcmFtKSB7CisKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBnZXRCYXNlVXJpKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc3VsdCA9IGJhc2VVcmkucmVzb2x2ZShyZXNvdXJjZVBhdGggKyAiL3VyaS8iICsgcGF0aFBhcmFtKS50b1N0cmluZygpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZVBhdGgpLnBhdGgoInVyaSIpLnBhdGgocGF0aFBhcmFtKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhleHBlY3RlZFJlc3VsdCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdEhlYWRlcihmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoKSB7CisKKyAgICAgICAgX3Rlc3RTaW5nbGVIZWFkZXIocmVzb3VyY2VQYXRoLCAib25lIik7CisgICAgICAgIF90ZXN0U2luZ2xlSGVhZGVyKHJlc291cmNlUGF0aCwgInR3byIpOworICAgICAgICBfdGVzdFNpbmdsZUhlYWRlcihyZXNvdXJjZVBhdGgsICJ0aHJlZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFNpbmdsZUhlYWRlcihmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgaGVhZGVyVmFsdWUpIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSBoZWFkZXJWYWx1ZTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2VQYXRoKS5wYXRoKCJoZWFkZXIiKS5yZXF1ZXN0KCkuaGVhZGVyKCJ4LXRlc3QiLCBoZWFkZXJWYWx1ZSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhleHBlY3RlZFJlc3VsdCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDM1MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9wb20ueG1sCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNkaS1tdWx0aW1vZHVsZS13YXIyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWNkaS1tdWx0aW1vZHVsZS13YXIyPC9uYW1lPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGUtbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnN0YWxsLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL0pheFJzQXBwT25lLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL0pheFJzQXBwT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkNWNiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvSmF4UnNBcHBPbmUuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS53ZWIyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEZpcnN0IEpBWC1SUyBhcHBsaWNhdGlvbiByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIm9uZSIpCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBPbmUgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgICAgIGFkZChTaGFyZWRSZXF1ZXN0U2NvcGVkSmF4UnNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoU2hhcmVkQXBwU2NvcGVkSmF4UnNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH19OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9KYXhSc0FwcFR3by5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9KYXhSc0FwcFR3by5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmU3NzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL0pheFJzQXBwVHdvLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkud2ViMjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBTZWNvbmQgSkFYLVJTIGFwcGxpY2F0aW9uIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgidHdvIikKK3B1YmxpYyBjbGFzcyBKYXhSc0FwcFR3byBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgYWRkKFNoYXJlZFJlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChTaGFyZWRBcHBTY29wZWRKYXhSc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfX07CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL1NoYXJlZEFwcFNjb3BlZEpheFJzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvU2hhcmVkQXBwU2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzIyYjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL1NoYXJlZEFwcFNjb3BlZEpheFJzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS53ZWIyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkubGliLkpheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS5saWIuSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBiYWNrZWQgYnkgYW4gYXBwbGljYXRpb24gc2NvcGVkIENESSBiZWFuLgorICogVGhpcyBvbmUgaXMgYmVpbmcgc2hhcmVkIGJldHdlZW4gdGhlIHR3byBKQVgtUlMgYXBwcworICoge0BsaW5rIEpheFJzQXBwT25lfSBhbmQge0BsaW5rIEpheFJzQXBwVHdvfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiYXBwLXNjb3BlZCIpCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBTaGFyZWRBcHBTY29wZWRKYXhSc1Jlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBKYXhSc0luamVjdGVkRGVwZW5kZW50QmVhbiBkZXBlbmRlbnRCZWFuOworCisgICAgQEluamVjdAorICAgIEpheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbiByZXFTY29wZWRCZWFuOworCisgICAgQFBhdGgoInJlcS9oZWFkZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcUhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHJlcVNjb3BlZEJlYW4uZ2V0VGVzdEhlYWRlcigpOworICAgIH0KKworICAgIEBQYXRoKCJkZXBlbmRlbnQvaGVhZGVyIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXREZXBlbmRlbnRIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBkZXBlbmRlbnRCZWFuLmdldFRlc3RIZWFkZXIoKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVxL3VyaS97cH0iKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcVNjb3BlZEJlYW4uZ2V0VXJpSW5mbygpLmdldFJlcXVlc3RVcmkoKS50b1N0cmluZygpOworICAgIH0KKworICAgIEBQYXRoKCJkZXBlbmRlbnQvdXJpL3twfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwVXJpKCkgeworICAgICAgICByZXR1cm4gZGVwZW5kZW50QmVhbi5nZXRVcmlJbmZvKCkuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9TaGFyZWRSZXF1ZXN0U2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9TaGFyZWRSZXF1ZXN0U2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NmVlN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL1NoYXJlZFJlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkud2ViMjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkubGliLkpheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS5saWIuSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBiYWNrZWQgYnkgYSByZXF1ZXN0IHNjb3BlZCBDREkgYmVhbi4KKyAqIFRoaXMgb25lIGlzIGJlaW5nIHNoYXJlZCBiZXR3ZWVuIHRoZSB0d28gSkFYLVJTIGFwcHMKKyAqIHtAbGluayBKYXhSc0FwcE9uZX0gYW5kIHtAbGluayBKYXhSc0FwcFR3b30uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAgKi8KK0BQYXRoKCJyZXF1ZXN0LXNjb3BlZCIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIFNoYXJlZFJlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBKYXhSc0luamVjdGVkRGVwZW5kZW50QmVhbiBkZXBlbmRlbnRCZWFuOworCisgICAgQEluamVjdAorICAgIEpheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbiByZXFTY29wZWRCZWFuOworCisgICAgQFBhdGgoInJlcS9oZWFkZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcUhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHJlcVNjb3BlZEJlYW4uZ2V0VGVzdEhlYWRlcigpOworICAgIH0KKworICAgIEBQYXRoKCJkZXBlbmRlbnQvaGVhZGVyIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXREZXBlbmRlbnRIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBkZXBlbmRlbnRCZWFuLmdldFRlc3RIZWFkZXIoKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVxL3VyaS97cH0iKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcVNjb3BlZEJlYW4uZ2V0VXJpSW5mbygpLmdldFJlcXVlc3RVcmkoKS50b1N0cmluZygpOworICAgIH0KKworICAgIEBQYXRoKCJkZXBlbmRlbnQvdXJpL3twfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwVXJpKCkgeworICAgICAgICByZXR1cm4gZGVwZW5kZW50QmVhbi5nZXRVcmlJbmZvKCkuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljMDJlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKQEAgLTAsMCArMSwzMSBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgICAgICAgPHRpdGxlPkpTUCBQYWdlPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgICAgIDxoMT5IZWxsbyBXb3JsZCE8L2gxPgorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvSmF4UnNDZGlJbnRlZ3JhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvSmF4UnNDZGlJbnRlZ3JhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzNmOTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9KYXhSc0NkaUludGVncmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS53ZWIyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIENESSB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLiBUaGUgSkFYLVJTIHJlc291cmNlcyB1c2UgQ0RJIGNvbXBvbmVudHMgZnJvbSBhIGxpYnJhcnkgamFyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0NkaUludGVncmF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcE9uZSgpOworICAgIH0KKworLy8gICAgQE92ZXJyaWRlCisvLyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisvLyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImNkaS1tdWx0aW1vZHVsZS13YXIxIikuYnVpbGQoKTsKKy8vICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpSW5mb0luamVjdGlvblJlcVNjb3BlZFJlc291cmNlRGVwZW5kZW50QmVhbigpIHsKKworICAgICAgICBfdGVzdFJlc291cmNlKCJjZGktbXVsdGltb2R1bGUtd2FyMi9vbmUvcmVxdWVzdC1zY29wZWQvZGVwZW5kZW50Iik7CisgICAgICAgIF90ZXN0UmVzb3VyY2UoImNkaS1tdWx0aW1vZHVsZS13YXIyL3R3by9yZXF1ZXN0LXNjb3BlZC9kZXBlbmRlbnQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlJbmZvSW5qZWN0aW9uUmVxU2NvcGVkUmVzb3VyY2VSZXF1ZXN0U2NvcGVkQmVhbigpIHsKKworICAgICAgICBfdGVzdFJlc291cmNlKCJjZGktbXVsdGltb2R1bGUtd2FyMi9vbmUvcmVxdWVzdC1zY29wZWQvcmVxIik7CisgICAgICAgIF90ZXN0UmVzb3VyY2UoImNkaS1tdWx0aW1vZHVsZS13YXIyL3R3by9yZXF1ZXN0LXNjb3BlZC9yZXEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlJbmZvSW5qZWN0aW9uQXBwU2NvcGVkUmVzb3VyY2VSZXF1ZXN0U2NvcGVkQmVhbigpIHsKKworICAgICAgICBfdGVzdFJlc291cmNlKCJjZGktbXVsdGltb2R1bGUtd2FyMi9vbmUvYXBwLXNjb3BlZC9yZXEiKTsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZSgiY2RpLW11bHRpbW9kdWxlLXdhcjIvdHdvL2FwcC1zY29wZWQvcmVxIik7CisgICAgfQorCisgICAgQElnbm9yZSgidW50aWwgSkVSU0VZLTI5MTQgZ2V0cyByZXNvbHZlZCIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpSW5mb0luamVjdGlvbkFwcFNjb3BlZFJlc291cmNlRGVwZW5kZW50QmVhbigpIHsKKworICAgICAgICBfdGVzdFJlc291cmNlKCJjZGktbXVsdGltb2R1bGUtd2FyMi9vbmUvYXBwLXNjb3BlZC9kZXBlbmRlbnQiKTsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZSgiY2RpLW11bHRpbW9kdWxlLXdhcjIvdHdvL2FwcC1zY29wZWQvZGVwZW5kZW50Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UmVzb3VyY2UoU3RyaW5nIHJlc291cmNlUGF0aCkgeworICAgICAgICBfdGVzdFVyaUluZm8ocmVzb3VyY2VQYXRoKTsKKyAgICAgICAgX3Rlc3RIZWFkZXIocmVzb3VyY2VQYXRoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RVcmlJbmZvKFN0cmluZyByZXNvdXJjZVBhdGgpIHsKKworICAgICAgICBfdGVzdFNpbmdsZVBhdGhVcmlVbmZvKHJlc291cmNlUGF0aCwgIm9uZSIpOworICAgICAgICBfdGVzdFNpbmdsZVBhdGhVcmlVbmZvKHJlc291cmNlUGF0aCwgInR3byIpOworICAgICAgICBfdGVzdFNpbmdsZVBhdGhVcmlVbmZvKHJlc291cmNlUGF0aCwgInRocmVlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0U2luZ2xlUGF0aFVyaVVuZm8oZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aCwgZmluYWwgU3RyaW5nIHBhdGhQYXJhbSkgeworCisgICAgICAgIGZpbmFsIFVSSSBiYXNlVXJpID0gZ2V0QmFzZVVyaSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSBiYXNlVXJpLnJlc29sdmUocmVzb3VyY2VQYXRoICsgIi91cmkvIiArIHBhdGhQYXJhbSkudG9TdHJpbmcoKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2VQYXRoKS5wYXRoKCJ1cmkiKS5wYXRoKHBhdGhQYXJhbSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oZXhwZWN0ZWRSZXN1bHQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RIZWFkZXIoZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aCkgeworCisgICAgICAgIF90ZXN0U2luZ2xlSGVhZGVyKHJlc291cmNlUGF0aCwgIm9uZSIpOworICAgICAgICBfdGVzdFNpbmdsZUhlYWRlcihyZXNvdXJjZVBhdGgsICJ0d28iKTsKKyAgICAgICAgX3Rlc3RTaW5nbGVIZWFkZXIocmVzb3VyY2VQYXRoLCAidGhyZWUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RTaW5nbGVIZWFkZXIoZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aCwgZmluYWwgU3RyaW5nIGhlYWRlclZhbHVlKSB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gaGVhZGVyVmFsdWU7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlUGF0aCkucGF0aCgiaGVhZGVyIikucmVxdWVzdCgpLmhlYWRlcigieC10ZXN0IiwgaGVhZGVyVmFsdWUpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oZXhwZWN0ZWRSZXN1bHQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWYwYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNkaS1tdWx0aXBhcnQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWNkaS1tdWx0aXBhcnQtd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkgdGVzdCB3ZWIgYXBwbGljYXRpb24gdGhhdCB1c2VzIG11bHRpcGFydCBmZWF0dXJlPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0YTI2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTsKKworCisvKioKKyAqIEdGLTIxMDMzIHJlcHJvZHVjZXIuIEp1c3QgYSByZXNvdXJjZSB1c2luZyBtdWx0aS1wYXJ0IHN1cHBvcnQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9lY2hvIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgRWNob1Jlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIFdlIHdhbnQgdG8gY29uc3VtZSBmb3JtIGRhdGEgdXNpbmcgbXVsdGktcGFydCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCBmb3JtIGRhdGEKKyAgICAgKiBAcmV0dXJuIGlucHV0IGRhdGEKKyAgICAgKi8KKyAgICBAUE9TVAorICAgIHB1YmxpYyBSZXNwb25zZSBlY2hvTXVsdGlwYXJ0KEBGb3JtRGF0YVBhcmFtICgiaW5wdXQiKSBTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGlucHV0KS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzA3NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnRGZWF0dXJlOworCisvKioKKyAqIEdGLTIxMDMzIHJlcHJvZHVjZXIuIFRoaXMgaXMgdG8gbWFrZSBzdXJlIEplcnNleSdzIG11bHRpcGFydAorICogZmVhdHVyZSBjb3VsZCB3b3JrIGluIEdGIHdpdGggQ0RJLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8qIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRWNob1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoTXVsdGlQYXJ0RmVhdHVyZS5jbGFzcyk7CisgICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWYwNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NdWx0aXBhcnRGZWF0dXJlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL011bHRpcGFydEZlYXR1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiMTE4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NdWx0aXBhcnRGZWF0dXJlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YU11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFBhcnQgb2YgR0YtMjEwMzMgcmVwcm9kdWNlci4gTWFrZSBzdXJlIGZvcm0gZGF0YSBwcm9jZXNzZWQgYnkgdGhlIEplcnNleSBtdWx0aS1wYXJ0CisgKiBmZWF0dXJlIG1ha2UgaXQgZm9ydGggYW5kIGJhY2sgYWxsIHJpZ2h0LgorICoKKyAqIDxwLz5SdW4gd2l0aDoKKyAqIDxwcmU+CisgKiBtdm4gY2xlYW4gcGFja2FnZQorICogJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IHRhcmdldC9jZGktdGVzdC13ZWJhcHAKKyAqIG12biAtRHNraXBUZXN0cz1mYWxzZSB0ZXN0PC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNdWx0aXBhcnRGZWF0dXJlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgZmluYWwgU3RyaW5nIFRlc3RGb3JtREFUQTsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJObyBtYXR0ZXIgd2hhdCJ9LAorICAgICAgICAgICAgICAgIHsiWW91IHNob3VsZCBuZXZlciJ9LAorICAgICAgICAgICAgICAgIHsiZXZlciJ9LAorICAgICAgICAgICAgICAgIHsianVzdCBnaXZlIHVwIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIE11bHRpcGFydEZlYXR1cmVUZXN0KFN0cmluZyBUZXN0Rm9ybURBVEEpIHsKKyAgICAgICAgdGhpcy5UZXN0Rm9ybURBVEEgPSBUZXN0Rm9ybURBVEE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiY2RpLW11bHRpcGFydC13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0Rm9ybURhdGEoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoImVjaG8iKTsKKworICAgICAgICBGb3JtRGF0YU11bHRpUGFydCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpLmZpZWxkKCJpbnB1dCIsIFRlc3RGb3JtREFUQSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShmb3JtRGF0YSwgTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKFRlc3RGb3JtREFUQSkpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmRkYjBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSw5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jZGktdGVzdC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtY2RpLXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgQ0RJIHRlc3Qgd2ViIGFwcGxpY2F0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXdlbGQyLXNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cnVuLWV4dGVybmFsLXRlc3RzPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gRXh0ZXJuYWwgdGVzdCBjb250YWluZXIgY29uZmlndXJhdGlvbiBpcyBkb25lIHZpYSBwcm9wZXJ0aWVzIHRvIGFsbG93IG92ZXJyaWRpbmcgdmlhIGNvbW1hbmQgbGluZS4gLS0+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5wb3J0PjgwODA8L2V4dGVybmFsLmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgIDxtYXZlbi50ZXN0LnNraXA+ZmFsc2U8L21hdmVuLnRlc3Quc2tpcD4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvbnN0cnVjdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Db25zdHJ1Y3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzZkZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Db25zdHJ1Y3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBKRVJTRVktMjUyNiByZXByb2R1Y2VyLiBDREkgbWFuYWdlZCBKQVgtUlMgcm9vdCByZXNvdXJjZQorICogdGhhdCBpcyBjb25zdHJ1Y3RvciBpbmplY3RlZCB3aXRoIEpBWC1SUyBwYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IEplcnNleQorICogYW5kIGEgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIgY29taW5nIGZyb20gYXBwbGljYXRpb24gcHJvdmlkZWQgQ0RJIHByb2R1Y2VyLAorICoge0BsaW5rIEN1c3RvbUNkaVByb2R1Y2VyfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiY3Rvci1pbmplY3RlZC97cH0iKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckluamVjdGVkUmVzb3VyY2UgeworCisgICAgU3RyaW5nIHBhdGhQYXJhbTsKKyAgICBTdHJpbmcgcXVlcnlQYXJhbTsKKyAgICBTdHJpbmcgbWF0cml4UGFyYW07CisgICAgU3RyaW5nIGhlYWRlclBhcmFtOworICAgIFN0cmluZyBjZGlQYXJhbTsKKworICAgIC8qKgorICAgICAqIFdMUyByZXF1aXJlcyB0aGlzLgorICAgICAqLworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckluamVjdGVkUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB3aWxsIGdldCBDREkgaW5qZWN0ZWQgd2l0aCBKQVgtUlMgcHJvdmlkZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoUGFyYW0gcGF0aCBwYXJhbWV0ZXIgZnJvbSB0aGUgYWN0dWFsIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHF1ZXJ5UGFyYW0gcXVlcnkgcGFyYW1ldGVyIHEgZnJvbSB0aGUgYWN0dWFsIHJlcXVlc3QuCisgICAgICogQHBhcmFtIG1hdHJpeFBhcmFtIG1hdHJpeCBwYXJhbWV0ZXIgbSBmcm9tIHRoZSBhY3R1YWwgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gaGVhZGVyUGFyYW0gQWNjZXB0IGhlYWRlciBwYXJhbWV0ZXIgZnJvbSB0aGUgYWN0dWFsIHJlcXVlc3QuCisgICAgICogQHBhcmFtIGNkaVBhcmFtIGN1c3RvbSBDREkgcHJvZHVjZWQgc3RyaW5nLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JJbmplY3RlZFJlc291cmNlKAorICAgICAgICAgICAgQFBhdGhQYXJhbSgicCIpIFN0cmluZyBwYXRoUGFyYW0sCisgICAgICAgICAgICBAUXVlcnlQYXJhbSgicSIpIFN0cmluZyBxdWVyeVBhcmFtLAorICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJtIikgU3RyaW5nIG1hdHJpeFBhcmFtLAorICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJDdXN0b20tSGVhZGVyIikgU3RyaW5nIGhlYWRlclBhcmFtLAorICAgICAgICAgICAgQEN1c3RvbUNkaVByb2R1Y2VyLlF1YWxpZmllciBTdHJpbmcgY2RpUGFyYW0pIHsKKworICAgICAgICB0aGlzLnBhdGhQYXJhbSA9IHBhdGhQYXJhbTsKKyAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICAgICAgdGhpcy5tYXRyaXhQYXJhbSA9IG1hdHJpeFBhcmFtOworICAgICAgICB0aGlzLmhlYWRlclBhcmFtID0gaGVhZGVyUGFyYW07CisgICAgICAgIHRoaXMuY2RpUGFyYW0gPSBjZGlQYXJhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBpbmplY3RlZCBwYXJhbWV0ZXIKKyAgICAgKiBnaXZlbiBieSB0aGUgYWN0dWFsIHBhdGggcGFyYW1ldGVyICh0aGF0IGlzIGFsc28gaW5qZWN0ZWQpLgorICAgICAqCisgICAgICogQHJldHVybiBhIHNpbmdsZSBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICovCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKCkgeworCisgICAgICAgIHN3aXRjaCAocGF0aFBhcmFtKSB7CisKKyAgICAgICAgICAgIGNhc2UgInBhdGhQYXJhbSI6IHJldHVybiBwYXRoUGFyYW07CisgICAgICAgICAgICBjYXNlICJxdWVyeVBhcmFtIjogcmV0dXJuIHF1ZXJ5UGFyYW07CisgICAgICAgICAgICBjYXNlICJtYXRyaXhQYXJhbSI6IHJldHVybiBtYXRyaXhQYXJhbTsKKyAgICAgICAgICAgIGNhc2UgImhlYWRlclBhcmFtIjogcmV0dXJuIGhlYWRlclBhcmFtOworICAgICAgICAgICAgY2FzZSAiY2RpUGFyYW0iOiByZXR1cm4gY2RpUGFyYW07CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Db3VudGVyUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ291bnRlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0MmEwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ291bnRlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBQYXJ0IG9mIEpFUlNFWS0yNDYxIHJlcHJvZHVjZXIuIFRoaXMgb25lIHdpbGwgZ2V0IGluamVjdGVkIHdpdGggYSBDREkgZXh0ZW5zaW9uLgorICogSEsyIHNob3VsZCBub3QgbWVzcyB1cCB3aXRoIHRoaXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK0BQYXRoKCJjb3VudGVyIikKK3B1YmxpYyBjbGFzcyBDb3VudGVyUmVzb3VyY2UgeworCisgICAgZmluYWwgQ3VzdG9tRXh0ZW5zaW9uIGU7CisKKyAgICAvKioKKyAgICAgKiBUbyBtYWtlIENESSBoYXBweS4uLiBuYW1lbHkgdG8gbWFrZSB0aGUgYmVhbiBwcm94eS1hYmxlLgorICAgICAqLworICAgIHB1YmxpYyBDb3VudGVyUmVzb3VyY2UoKSB7CisgICAgICAgIHRoaXMuZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBvbmUgd2lsbCBnZXQgdXNlZCBhdCBydW50aW1lIGFjdHVhbGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGV4dGVuc2lvbiBjdXJyZW50IGFwcGxpY2F0aW9uIENESSBjdXN0b20gZXh0ZW5zaW9uLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgQ291bnRlclJlc291cmNlKEN1c3RvbUV4dGVuc2lvbiBleHRlbnNpb24pIHsKKyAgICAgICAgdGhpcy5lID0gZXh0ZW5zaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBjdXN0b20gZXh0ZW5zaW9uIGNvdW50ZXIgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5leHQgY291bnQuCisgICAgICovCisgICAgQEdFVAorICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBlLmdldENvdW50KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21DZGlQcm9kdWNlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21DZGlQcm9kdWNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDA4MzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUNkaVByb2R1Y2VyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5Qcm9kdWNlczsKKworLyoqCisgKiBDREkgcHJvZHVjZXIgdG8gaGVscCB1cyBtYWtlIHN1cmUgSEsyIGRvIG5vdCBtZXNzIHVwIHdpdGgKKyAqIHR5cGVzIGJhY2tlZCBieSBDREkgcHJvZHVjZXJzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21DZGlQcm9kdWNlciB7CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gcXVhbGlmaWVyIHRvIHdvcmsgYXJvdW5kIGh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvR0xBU1NGSVNILTIwMjg1CisgICAgICovCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5QQVJBTUVURVIsIEVsZW1lbnRUeXBlLkZJRUxELCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLlRZUEV9KQorICAgIEBqYXZheC5pbmplY3QuUXVhbGlmaWVyCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFF1YWxpZmllciB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVG8gY292ZXIgZmllbGQgcHJvZHVjZXIuCisgICAgICovCisgICAgQFByb2R1Y2VzCisgICAgcHVibGljIHN0YXRpYyBGaWVsZFByb2R1Y2VkQmVhbjxTdHJpbmc+IGZpZWxkID0gbmV3IEZpZWxkUHJvZHVjZWRCZWFuPD4oImZpZWxkIik7CisKKyAgICAvKioKKyAgICAgKiBUbyBjb3ZlciBtZXRob2QgcHJvZHVjZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJlYW4gaW5zdGFuY2UgdG8gaW5qZWN0CisgICAgICovCisgICAgQFByb2R1Y2VzCisgICAgcHVibGljIE1ldGhvZFByb2R1Y2VkQmVhbjxTdHJpbmc+IHByb2R1Y2VCZWFuKCkgeworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZFByb2R1Y2VkQmVhbjw+KCJtZXRob2QiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJ0IG9mIEpFUlNFWS0yNTI2IHJlcHJvZHVjZXIuIFRoaXMgb25lIGlzIHVzZWQKKyAgICAgKiB0byBpbmplY3QgY29uc3RydWN0b3Igb2Yge0BsaW5rIENvbnN0cnVjdG9ySW5qZWN0ZWRSZXNvdXJjZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZpeGVkIHN0cmluZyB2YWx1ZS4KKyAgICAgKi8KKyAgICBAUHJvZHVjZXMKKyAgICBAUXVhbGlmaWVyCisgICAgcHVibGljIFN0cmluZyBwcm9kdWNlU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gImNkaS1wcm9kdWNlZCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21FeHRlbnNpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tRXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxYmM1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkV4dGVuc2lvbjsKKworLyoqCisgKiBQYXJ0IG9mIEpFUlNFWS0yNDYxIHJlcHJvZHVjZXIuIFdlIG5lZWQgYW4gZXh0ZW5zaW9uIHRoYXQgd2UgY291bGQgaW5qZWN0LAorICogdG8gbWFrZSBzdXJlIEhLMiBjdXN0b20gYmluZGluZyBkb2VzIG5vdCBhdHRlbXB0IHRvIG1lc3MgdXAuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7CisKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICAvKioKKyAgICAgKiBBIG1hZGUgdXAgZnVuY3Rpb25hbGl0eS4gRG9lcyBub3QgcmVhbGx5IG1hdHRlci4gQ0RJCisgICAgICogd291bGQgcmVmdXNlIHRvIGRlcGxveSB0aGUgYXBwbGljYXRpb24gaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5leHQgY291bnQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4N2Q3MzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBTaW1wbGUgZWNobyBzZXJ2aWNlIHRvIHRlc3QgaW5qZWN0aW9ucyB1c2luZyB7QGxpbmsgUXVhbGlmaWVyfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjaG9TZXJ2aWNlIHsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgYW4gZWNob2VkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHMgU3RyaW5nIHRvIGJlIGVjaG9lZC4KKyAgICAgKiBAcmV0dXJuIGVjaG9lZCBpbnB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9GaWVsZFByb2R1Y2VkQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9GaWVsZFByb2R1Y2VkQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYmI2YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0ZpZWxkUHJvZHVjZWRCZWFuLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworCisvKioKKyAqIEEgYmVhbiB0aGF0IHdvdWxkIGJlIHByb2R1Y2VkIGJ5IGEgQ0RJIHByb2R1Y2VyIGZpZWxkLgorICogVGhpcyBpcyB0byBtYWtlIHN1cmUgd2UgZG8gbm90IG1lc3MgdXAgd2l0aCBDREkgcHJvZHVjZXJzIHdpdGggSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBGaWVsZFByb2R1Y2VkQmVhbjxUPiBpbXBsZW1lbnRzIFZhbHVlSG9sZGVyPFQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgVCB2YWx1ZTsKKworICAgIC8qKgorICAgICAqIE1ha2UgYW4gaW5zdGFuY2Ugd2l0aCBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBGaWVsZFByb2R1Y2VkQmVhbihUIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRmlyc3ROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0ZpcnN0Tm9uSmF4UnNCZWFuSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjU1MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0ZpcnN0Tm9uSmF4UnNCZWFuSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIHRoYXQgZ2V0cyBpbmplY3RlZCB3aXRoIGEgQ0RJIG1hbmFnZWQgYmVhbiwKKyAqIHRoYXQgaW5jbHVkZXMgSkFYLVJTIGluamVjdGlvbiBwb2ludHMuIFRoZSB2ZXJ5IHNhbWUgYmVhbgorICogZ2V0cyBpbmplY3RlZCBhbHNvIHRvIHtAbGluayBGaXJzdE5vbkpheFJzQmVhbkluamVjdGVkUmVzb3VyY2V9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJub24tamF4cnMtYmVhbi1pbmplY3RlZCIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIEZpcnN0Tm9uSmF4UnNCZWFuSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgSmF4UnNJbmplY3RlZEJlYW4gYmVhbjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC8xIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldFVyaUluZm8oKS5nZXRQYXRoKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJoZWFkZXIvMSIpCisgICAgcHVibGljIFN0cmluZyBnZXRBY2NlcHRIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldFRlc3RIZWFkZXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRGVwZW5kZW50RXhjZXB0aW9uTWFwcGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRGVwZW5kZW50RXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwZGM5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRFeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTWFuYWdlZEJlYW47CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCisvKioKKyAqIEpBWC1SUyBleGNlcHRpb24gbWFwcGVyIHJlZ2lzdGVyZWQgYXMgYSBDREkgbWFuYWdlZCBiZWFuLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQE1hbmFnZWRCZWFuCitwdWJsaWMgY2xhc3MgSkNESUJlYW5EZXBlbmRlbnRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8SkRDSUJlYW5EZXBlbmRlbnRFeGNlcHRpb24+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEpDRElCZWFuRGVwZW5kZW50RXhjZXB0aW9uTWFwcGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1aUZpZWxkSW5qZWN0OworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIFVyaUluZm8gdWlNZXRob2RJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHB1YmxpYyB2b2lkIHNldChVcmlJbmZvIHVpKSB7CisgICAgICAgIHRoaXMudWlNZXRob2RJbmplY3QgPSB1aTsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgU3RyaW5nLmZvcm1hdCgiSW4gcG9zdCBjb25zdHJ1Y3Qgb2YgJXMiLCB0aGlzKSk7CisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoSkRDSUJlYW5EZXBlbmRlbnRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eSgiSkRDSUJlYW5EZXBlbmRlbnRFeGNlcHRpb24iKS5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJbmplY3RlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAodWlGaWVsZEluamVjdCA9PSBudWxsIHx8IHVpTWV0aG9kSW5qZWN0ID09IG51bGwgfHwgcmVzb3VyY2VDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRQZXJSZXF1ZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRQZXJSZXF1ZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM2ZWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhbkRlcGVuZGVudFBlclJlcXVlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTWFuYWdlZEJlYW47CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworCisKKy8qKgorICogUmVxdWVzdCBzY29wZWQgSkFYLVJTIHJlc291cmNlIHJlZ2lzdGVyZWQgYXMgYSBDREkgbWFuYWdlZCBiZWFuLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvamNkaWJlYW4vZGVwZW5kZW50L3Blci1yZXF1ZXN0IikKK0BNYW5hZ2VkQmVhbgorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBKQ0RJQmVhbkRlcGVuZGVudFBlclJlcXVlc3RSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihKQ0RJQmVhbkRlcGVuZGVudFBlclJlcXVlc3RSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFJlc291cmNlKG5hbWUgPSAiaW5qZWN0ZWRSZXNvdXJjZSIpCisgICAgcHJpdmF0ZSBpbnQgaW5qZWN0ZWRSZXNvdXJjZSA9IDA7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1aUZpZWxkSW5qZWN0OworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFJlc291cmNlQ29udGV4dCByYzsKKworICAgIEBRdWVyeVBhcmFtKCJ4IikKKyAgICBwcml2YXRlIFN0cmluZyB4OworCisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpTWV0aG9kSW5qZWN0OworCisgICAgQENvbnRleHQKKyAgICBwdWJsaWMgdm9pZCBzZXQoVXJpSW5mbyB1aSkgeworICAgICAgICB0aGlzLnVpTWV0aG9kSW5qZWN0ID0gdWk7CisgICAgfQorCisgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgeworCisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisKKyAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAiSW4gcG9zdCBjb25zdHJ1Y3Qgb2YgJXM7IHVpRmllbGRJbmplY3Q6ICVzOyB1aU1ldGhvZEluamVjdDogJXMiLAorICAgICAgICAgICAgICAgIHRoaXMsIHVpRmllbGRJbmplY3QsIHVpTWV0aG9kSW5qZWN0KSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworCisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisKKyAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAiSW4gZ2V0TWVzc2FnZSBvZiAlczsgdWlGaWVsZEluamVjdDogJXM7IHVpTWV0aG9kSW5qZWN0OiAlcyIsCisgICAgICAgICAgICAgICAgdGhpcywgdWlGaWVsZEluamVjdCwgdWlNZXRob2RJbmplY3QpKTsKKworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXM6IHF1ZXJ5UGFyYW09JXMgJWQiLCB1aUZpZWxkSW5qZWN0LmdldFJlcXVlc3RVcmkoKS50b1N0cmluZygpLCB4LCBpbmplY3RlZFJlc291cmNlKyspOworICAgIH0KKworICAgIEBQcmVEZXN0cm95CisgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgiSW4gcHJlIGRlc3Ryb3kgb2YgJXMiLCB0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUluamVjdGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1aUZpZWxkSW5qZWN0ID09IG51bGwgfHwgdWlNZXRob2RJbmplY3QgPT0gbnVsbCB8fCByYyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRGVwZW5kZW50UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OWRlNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRGVwZW5kZW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRlc3QgY2FzZSBmb3IgSkVSU0VZLTE3NDcuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9qY2RpYmVhbi9kZXBlbmRlbnQvdGltZXIiKQorcHVibGljIGNsYXNzIEpDRElCZWFuRGVwZW5kZW50UmVzb3VyY2UgeworCisgICBASW5qZWN0CisgICBKQ0RJQmVhblJlcXVlc3RTY29wZWRUaW1lciB0aW1lcjsKKworICAgQEdFVAorICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcodGltZXIuZ2V0TWlsaXNlY29uZHMoKSk7CisgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRGVwZW5kZW50U2luZ2xldG9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRTaW5nbGV0b25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZWNmODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRGVwZW5kZW50U2luZ2xldG9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk1hbmFnZWRCZWFuOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKKy8qKgorICogQXBwbGljYXRpb24gc2NvcGVkIEpBWC1SUyByZXNvdXJjZSByZWdpc3RlcmVkIGFzIENESSBtYW5hZ2VkIGJlYW4uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9qY2RpYmVhbi9kZXBlbmRlbnQvc2luZ2xldG9uL3twfSIpCitAQXBwbGljYXRpb25TY29wZWQKK0BNYW5hZ2VkQmVhbgorcHVibGljIGNsYXNzIEpDRElCZWFuRGVwZW5kZW50U2luZ2xldG9uUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSkNESUJlYW5EZXBlbmRlbnRTaW5nbGV0b25SZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFJlc291cmNlKG5hbWUgPSAiaW5qZWN0ZWRSZXNvdXJjZSIpCisgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1aUZpZWxkaW5qZWN0OworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIFVyaUluZm8gdWlNZXRob2RJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHB1YmxpYyB2b2lkIHNldChVcmlJbmZvIHVpKSB7CisgICAgICAgIHRoaXMudWlNZXRob2RJbmplY3QgPSB1aTsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIkluIHBvc3QgY29uc3RydWN0IG9mICVzIiwgdGhpcykpOworICAgICAgICBlbnN1cmVJbmplY3RlZCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShAUGF0aFBhcmFtKCJwIikgU3RyaW5nIHApIHsKKyAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAiSW4gZ2V0TWVzc2FnZSBpbiAlczsgdWlGaWVsZEluamVjdDogJXM7IHVpTWV0aG9kSW5qZWN0OiAlcyIsIHRoaXMsIHVpRmllbGRpbmplY3QsIHVpTWV0aG9kSW5qZWN0KSk7CisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzOiBwPSVzLCBxdWVyeVBhcmFtPSVzIiwKKyAgICAgICAgICAgICAgICB1aUZpZWxkaW5qZWN0LmdldFJlcXVlc3RVcmkoKS50b1N0cmluZygpLCBwLCB1aU1ldGhvZEluamVjdC5nZXRRdWVyeVBhcmFtZXRlcnMoKS5nZXRGaXJzdCgieCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IEpEQ0lCZWFuRGVwZW5kZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQFBhdGgoImNvdW50ZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhjb3VudGVyKyspOworICAgIH0KKworICAgIEBQYXRoKCJjb3VudGVyIikKKyAgICBAUFVUCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENvdW50ZXIoU3RyaW5nIGNvdW50ZXIpIHsKKyAgICAgICAgdGhpcy5jb3VudGVyID0gSW50ZWdlci5kZWNvZGUoY291bnRlcik7CisgICAgfQorCisgICAgQFByZURlc3Ryb3kKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJJbiBwcmUgZGVzdHJveSBvZiAlcyIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5qZWN0ZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVpRmllbGRpbmplY3QgPT0gbnVsbCB8fCB1aU1ldGhvZEluamVjdCA9PSBudWxsIHx8IHJlc291cmNlQ29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRXhjZXB0aW9uTWFwcGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhMDZlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5FeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKKy8qKgorICogSkFYLVJTIGV4Y2VwdGlvbiBtYXBwZXIgcmVnaXN0ZXJlZCBhcyBDREkgbWFuYWdlZCBiZWFuLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworQFByb3ZpZGVyCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBKQ0RJQmVhbkV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxKRENJQmVhbkV4Y2VwdGlvbj4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSkNESUJlYW5FeGNlcHRpb25NYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpRmllbGRJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJjOworCisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpTWV0aG9kSW5qZWN0OworCisgICAgQENvbnRleHQKKyAgICBwdWJsaWMgdm9pZCBzZXQoVXJpSW5mbyB1aSkgeworICAgICAgICB0aGlzLnVpTWV0aG9kSW5qZWN0ID0gdWk7CisgICAgfQorCisgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgeworICAgICAgICBlbnN1cmVJbmplY3RlZCgpOworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJJbiBwb3N0IGNvbnN0cnVjdCBvZiAlcyIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShKRENJQmVhbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KCJKRENJQmVhbkV4Y2VwdGlvbiIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUluamVjdGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1aUZpZWxkSW5qZWN0ID09IG51bGwgfHwgdWlNZXRob2RJbmplY3QgPT0gbnVsbCB8fCByYyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuUGVyUmVxdWVzdFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuUGVyUmVxdWVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzZTlhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5QZXJSZXF1ZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogUmVxdWVzdCBzY29wZWQgSkFYLVJTIHJlc291cmNlIHJlZ2lzdGVyZWQuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9qY2RpYmVhbi9wZXItcmVxdWVzdCIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIEpDRElCZWFuUGVyUmVxdWVzdFJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEpDRElCZWFuUGVyUmVxdWVzdFJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUmVzb3VyY2UobmFtZSA9ICJpbmplY3RlZFJlc291cmNlIikKKyAgICBwcml2YXRlIGludCBpbmplY3RlZFJlc291cmNlID0gMDsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpRmllbGRJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJjOworCisgICAgQFF1ZXJ5UGFyYW0oIngiKQorICAgIHByaXZhdGUgU3RyaW5nIHg7CisKKyAgICBwcml2YXRlIFVyaUluZm8gdWlNZXRob2RJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHB1YmxpYyB2b2lkIHNldChVcmlJbmZvIHVpKSB7CisgICAgICAgIHRoaXMudWlNZXRob2RJbmplY3QgPSB1aTsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJJbiBwb3N0IGNvbnN0cnVjdCBvZiAlczsgdWlGaWVsZEluamVjdDogJXM7IHVpTWV0aG9kSW5qZWN0OiAlcyIsCisgICAgICAgICAgICAgICAgdGhpcywgdWlGaWVsZEluamVjdCwgdWlNZXRob2RJbmplY3QpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJJbiBnZXRNZXNzYWdlIG9mICVzOyB1aUZpZWxkSW5qZWN0OiAlczsgdWlNZXRob2RJbmplY3Q6ICVzIiwKKyAgICAgICAgICAgICAgICB0aGlzLCB1aUZpZWxkSW5qZWN0LCB1aU1ldGhvZEluamVjdCkpOworCisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlczogcXVlcnlQYXJhbT0lcyAlZCIsIHVpRmllbGRJbmplY3QuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCksIHgsIGluamVjdGVkUmVzb3VyY2UrKyk7CisgICAgfQorCisgICAgQFByZURlc3Ryb3kKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJJbiBwcmUgZGVzdHJveSBvZiAlcyIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5qZWN0ZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVpRmllbGRJbmplY3QgPT0gbnVsbCB8fCB1aU1ldGhvZEluamVjdCA9PSBudWxsIHx8IHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5SZXF1ZXN0U2NvcGVkVGltZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5SZXF1ZXN0U2NvcGVkVGltZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTlmNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhblJlcXVlc3RTY29wZWRUaW1lci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlZCBDREkgYmVhbiB0byBiZSBpbmplY3RlZCBpbnRvIHtAbGluayBKQ0RJQmVhbkRlcGVuZGVudFJlc291cmNlfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIEpDRElCZWFuUmVxdWVzdFNjb3BlZFRpbWVyIHsKKworICAgcHJpdmF0ZSBsb25nIG1zOworCisgICAvKioKKyAgICAqIFByb3ZpZGUgaW5mb3JtYXRpb24gb24gYWN0dWFsIHJlcXVlc3QgdGltZS4KKyAgICAqCisgICAgKiBAcmV0dXJuIG1pbGxpc2Vjb25kcyB3aGVuIHRoZSBjdXJyZW50IGJlYW4gd2FzIHBvc3QtY29uc3RydWN0ZWQuCisgICAgKi8KKyAgIHB1YmxpYyBsb25nIGdldE1pbGlzZWNvbmRzKCkgeworICAgICAgIHJldHVybiBtczsKKyAgIH0KKworICAgQFBvc3RDb25zdHJ1Y3QKKyAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgdGhpcy5tcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhblNpbmdsZXRvblJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuU2luZ2xldG9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTgxZjRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhblNpbmdsZXRvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBzY29wZWQgSkFYLVJTIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvamNkaWJlYW4vc2luZ2xldG9uL3twfSIpCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBKQ0RJQmVhblNpbmdsZXRvblJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEpDRElCZWFuU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBSZXNvdXJjZShuYW1lID0gImluamVjdGVkUmVzb3VyY2UiKQorICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFVyaUluZm8gdWlGaWVsZGluamVjdDsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZQorICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisKKyAgICBwcml2YXRlIFVyaUluZm8gdWlNZXRob2RJbmplY3Q7CisKKyAgICBASW5qZWN0CisgICAgUHJvdmlkZXI8SkNESUJlYW5FeGNlcHRpb25NYXBwZXI+IG1hcHBlclByb3ZpZGVyOworCisgICAgQENvbnRleHQKKyAgICBwdWJsaWMgdm9pZCBzZXQoVXJpSW5mbyB1aSkgeworICAgICAgICB0aGlzLnVpTWV0aG9kSW5qZWN0ID0gdWk7CisgICAgfQorCisgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgeworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJJbiBwb3N0IGNvbnN0cnVjdCBvZiAlcyIsIHRoaXMpKTsKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoQFBhdGhQYXJhbSgicCIpIFN0cmluZyBwKSB7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgIkluIGdldE1lc3NhZ2UgaW4gJXM7IHVpRmllbGRJbmplY3Q6ICVzOyB1aU1ldGhvZEluamVjdDogJXM7IHByb3ZpZGVyOiAlczsgcHJvdmlkZXIuZ2V0KCk6ICVzIiwgdGhpcywKKyAgICAgICAgICAgICAgICB1aUZpZWxkaW5qZWN0LCB1aU1ldGhvZEluamVjdCwgbWFwcGVyUHJvdmlkZXIsIG1hcHBlclByb3ZpZGVyLmdldCgpKSk7CisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzOiBwPSVzLCBxdWVyeVBhcmFtPSVzIiwKKyAgICAgICAgICAgICAgICB1aUZpZWxkaW5qZWN0LmdldFJlcXVlc3RVcmkoKS50b1N0cmluZygpLCBwLCB1aU1ldGhvZEluamVjdC5nZXRRdWVyeVBhcmFtZXRlcnMoKS5nZXRGaXJzdCgieCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IEpEQ0lCZWFuRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQFBhdGgoImNvdW50ZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRDb3VudGVyKCkgeworICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhjb3VudGVyKyspOworICAgIH0KKworICAgIEBQYXRoKCJjb3VudGVyIikKKyAgICBAUFVUCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldENvdW50ZXIoU3RyaW5nIGNvdW50ZXIpIHsKKyAgICAgICAgdGhpcy5jb3VudGVyID0gSW50ZWdlci5kZWNvZGUoY291bnRlcik7CisgICAgfQorCisgICAgQFByZURlc3Ryb3kKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJJbiBwcmUgZGVzdHJveSBvZiAlcyIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5qZWN0ZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVpRmllbGRpbmplY3QgPT0gbnVsbCB8fCB1aU1ldGhvZEluamVjdCA9PSBudWxsCisgICAgICAgICAgICAgICAgfHwgcmVzb3VyY2VDb250ZXh0ID09IG51bGwgfHwgbWFwcGVyUHJvdmlkZXIuZ2V0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KRENJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KRENJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZTgzN2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pEQ0lCZWFuRGVwZW5kZW50RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCisvKioKKyAqIEV4Y2VwdGlvbiB0byBiZSB0cmVhdGVkIGJ5IHtAbGluayBKQ0RJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbk1hcHBlcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgSkRDSUJlYW5EZXBlbmRlbnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkRDSUJlYW5FeGNlcHRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkRDSUJlYW5FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjgwYTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KRENJQmVhbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworLyoqCisgKiBFeGNlcHRpb24gdG8gYmUgdHJlYXRlZCBieSB7QGxpbmsgSkNESUJlYW5FeGNlcHRpb25NYXBwZXJ9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEpEQ0lCZWFuRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pheFJzSW5qZWN0ZWRCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pheFJzSW5qZWN0ZWRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3YTg4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSmF4UnNJbmplY3RlZEJlYW4uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIFRoaXMgaXMgdG8gYmUgSkFYLVJTIGluamVjdGVkIGF0IHJ1bnRpbWUuCisgKiBUaGUgYmVhbiBpcyBmdWxseSBDREkgbWFuYWdlZCwgY29udGFpbnMgSkFYLVJTIGluamVjdGlvbiBwb2ludHMgYW5kIGlzIGdldHRpbmcgaW5qZWN0ZWQgaW50byBKQVgtUlMKKyAqIHJlc291cmNlcyBpbmNsdWRlZCBpbiB0d28gZGlzdGluY3QgSkFYLVJTIGFwcGxpY2F0aW9ucyBydW5uaW5nIGluIHBhcmFsbGVsLgorICovCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIEpheFJzSW5qZWN0ZWRCZWFuIHsKKworICAgIEBIZWFkZXJQYXJhbSgieC10ZXN0IikKKyAgICBTdHJpbmcgdGVzdEhlYWRlcjsKKworICAgIEBDb250ZXh0CisgICAgVXJpSW5mbyB1cmlJbmZvOworCisgICAgcHVibGljIFVyaUluZm8gZ2V0VXJpSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHVyaUluZm87CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gdGVzdEhlYWRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01haW5BcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NYWluQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmVjMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NYWluQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiB0byBjb25maWd1cmUgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSm9uYXRoYW4gQmVub2l0IChqb25hdGhhbi5iZW5vaXQgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgibWFpbiIpCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBNYWluQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgQXRvbWljSW50ZWdlciBwb3N0Q29uc3RydWN0Q291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICBASW5qZWN0IEJlYW5NYW5hZ2VyIGJtOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTWFpbkFwcGxpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoSkNESUJlYW5EZXBlbmRlbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEpEQ0lCZWFuRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoSkRDSUJlYW5EZXBlbmRlbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChKQ0RJQmVhblNpbmdsZXRvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoSkNESUJlYW5QZXJSZXF1ZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChKQ0RJQmVhbkV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEpDRElCZWFuRGVwZW5kZW50U2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChKQ0RJQmVhbkRlcGVuZGVudFBlclJlcXVlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEpDRElCZWFuRGVwZW5kZW50RXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoU3R1dHRlcmluZ0VjaG9SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKFN0dXR0ZXJpbmdFY2hvLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoUmV2ZXJzaW5nRWNob1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoQ291bnRlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoQ29uc3RydWN0b3JJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoUHJvZHVjZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEZpcnN0Tm9uSmF4UnNCZWFuSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KKworICAgIC8vIEpFUlNFWS0yNTMxOiBtYWtlIHN1cmUgdGhpcyB0eXBlIGdldHMgbWFuYWdlZCBieSBDREkKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIiVzOiBQT1NUIENPTlNUUlVDVC4iLCB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIHBvc3RDb25zdHJ1Y3RDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICBpZiAoYm0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmVhbk1hbmFnZXIgc2hvdWxkIGhhdmUgYmVlbiBpbmplY3RlZCBpbnRvIGEgQ0RJIG1hbmFnZWQgYmVhbi4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9zdENvbnN0cnVjdENvdW50ZXIuaW50VmFsdWUoKSA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInBvc3RDb25zdHJ1Y3Qgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkIG9ubHkgb25jZSBvbiBhcHAgc2NvcGVkIGJlYW4uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJlRGVzdHJveQorICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIiVzOiBQUkUgREVTVFJPWS4iLCB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NZXRob2RQcm9kdWNlZEJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTWV0aG9kUHJvZHVjZWRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmODQyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTWV0aG9kUHJvZHVjZWRCZWFuLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworCisvKioKKyAqIEEgYmVhbiB0aGF0IHdvdWxkIGJlIHByb2R1Y2VkIGJ5IGEgQ0RJIHByb2R1Y2VyIG1ldGhvZC4KKyAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBtZXNzIHVwIHdpdGggQ0RJIHByb2R1Y2VycyB3aXRoIEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAVmV0b2VkCitwdWJsaWMgY2xhc3MgTWV0aG9kUHJvZHVjZWRCZWFuPFQ+IGltcGxlbWVudHMgVmFsdWVIb2xkZXI8VD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBUIHZhbHVlOworCisgICAgLyoqCisgICAgICogTWFrZSBhbiBpbnN0YW5jZSB3aXRoIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIE1ldGhvZFByb2R1Y2VkQmVhbihUIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBnZXR0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbHVlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Qcm9kdWNlclJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1Byb2R1Y2VyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTg4NjkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Qcm9kdWNlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBUaGlzIG9uZSB3aWxsIGdldCBpbmplY3RlZCB3aXRoIGEgQ0RJIHByb2R1Y2VyLgorICogSEsyIHNob3VsZCBub3QgbWVzcyB1cCB3aXRoIHRoaXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK0BQYXRoKCJwcm9kdWNlciIpCitwdWJsaWMgY2xhc3MgUHJvZHVjZXJSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgTWV0aG9kUHJvZHVjZWRCZWFuPFN0cmluZz4gbTsKKworICAgIEBJbmplY3QKKyAgICBGaWVsZFByb2R1Y2VkQmVhbjxTdHJpbmc+IGY7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZmllbGQgcHJvZHVjZWQgYmVhbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUgZnJvbSBmaWVsZCBwcm9kdWNlZCBiZWFuLgorICAgICAqLworICAgIEBQYXRoKCJmIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZFZhbHVlKCkgeworICAgICAgICByZXR1cm4gZi5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBtZXRob2QgcHJvZHVjZWQgYmVhbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUgZnJvbSBtZXRob2QgcHJvZHVjZWQgYmVhbi4KKyAgICAgKi8KKyAgICBAUGF0aCgibSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBtLmdldFZhbHVlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXZlcnNlRWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXZlcnNlRWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODU2NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2VFY2hvLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCisvKioKKyAqIEVjaG8gaW1wbGVtZW50YXRpb24gdG8gcmV2ZXJzZSBnaXZlbiBpbnB1dC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmV2ZXJzaW5nCitwdWJsaWMgY2xhc3MgUmV2ZXJzZUVjaG8gaW1wbGVtZW50cyBFY2hvU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIHJldmVyc2VTdHJpbmcocyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcmV2ZXJzZVN0cmluZyhmaW5hbCBTdHJpbmcgcykgeworICAgICAgICBmaW5hbCBpbnQgbGVuID0gcy5sZW5ndGgoKTsKKworICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcltsZW5dOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBjaGFyc1tpXSA9IHMuY2hhckF0KGxlbiAtIGkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXZlcnNpbmcuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmV2ZXJzaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlMGZmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmV2ZXJzaW5nLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogUXVhbGlmaWVyIGZvciByZXZlcnNpbmcgZWNobyBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFF1YWxpZmllcgorcHVibGljIEBpbnRlcmZhY2UgUmV2ZXJzaW5nIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmV2ZXJzaW5nRWNob1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2luZ0VjaG9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZWVmNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2luZ0VjaG9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIENESSBiYWNrZWQgSkFYLVJTIHJlc291cmNlIHRvIHJldmVyc2UgaW5wdXQgcXVlcnkgcGFyYW1ldGVyIHVzaW5nCisgKiBxdWFsaWZpZWQgaW5qZWN0aW9uIHRvIGdldCBhIENESSBiYWNrZWQgc2VydmljZSBwcm92aWRlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoInJldmVyc2UiKQorcHVibGljIGNsYXNzIFJldmVyc2luZ0VjaG9SZXNvdXJjZSB7CisKKyAgICBASW5qZWN0IEBSZXZlcnNpbmcgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBRdWVyeVBhcmFtKCJzIikgU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8ocyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TZWNvbmROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NlY29uZE5vbkpheFJzQmVhbkluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQ2NTBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TZWNvbmROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgdGhhdCBnZXRzIGluamVjdGVkIHdpdGggYSBDREkgbWFuYWdlZCBiZWFuLAorICogdGhhdCBpbmNsdWRlcyBKQVgtUlMgaW5qZWN0aW9uIHBvaW50cy4gVGhlIHZlcnkgc2FtZSBiZWFuCisgKiBnZXRzIGluamVjdGVkIGFsc28gdG8ge0BsaW5rIEZpcnN0Tm9uSmF4UnNCZWFuSW5qZWN0ZWRSZXNvdXJjZX0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm5vbi1qYXhycy1iZWFuLWluamVjdGVkIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgU2Vjb25kTm9uSmF4UnNCZWFuSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgSmF4UnNJbmplY3RlZEJlYW4gYmVhbjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC8yIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldFVyaUluZm8oKS5nZXRQYXRoKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJoZWFkZXIvMiIpCisgICAgcHVibGljIFN0cmluZyBnZXRBY2NlcHRIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldFRlc3RIZWFkZXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NlY29uZGFyeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NlY29uZGFyeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNjYzAzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2Vjb25kYXJ5QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFNlY29uZGFyeSBKQVgtUlMgYXBwbGljYXRpb24gdG8gY29uZmlndXJlIHJlc291cmNlcy4KKyAqIFRoaXMgb25lIGlzIHRvIG1ha2Ugc3VyZSB0d28gSmVyc2V5IGFwcHMgY291bGQgY28tZXhpc3QKKyAqIGluIENESSBtYW5hZ2VkIGVudmlyb25tZW50IGFuZCBKQVgtUlMgaW5qZWN0aW9uIGtlZXBzCisgKiBmdW5jdGlvbmluZyBhcyBleHBlY3RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJzZWNvbmRhcnkiKQorQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgU2Vjb25kYXJ5QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICBjbGFzc2VzLmFkZChTZWNvbmROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TdHV0dGVyaW5nLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWNjMWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TdHV0dGVyaW5nLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogUXVhbGlmaWVyIGZvciBzdHV0dGVyaW5nIGVjaG8gc2VydmljZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitARG9jdW1lbnRlZAorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BRdWFsaWZpZXIKK3B1YmxpYyBAaW50ZXJmYWNlIFN0dXR0ZXJpbmcgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TdHV0dGVyaW5nRWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TdHV0dGVyaW5nRWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NzlmOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJpbmdFY2hvLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworLyoqCisgKiBFY2hvIGltcGxlbWVudGF0aW9uIHRvIHN0dXR0ZXIgZ2l2ZW4gaW5wdXQgbi10aW1lcy4KKyAqIFRoZSBzdHV0dGVyIGZhY3RvciBjb3VsZCBiZSBzZXQgdmlhIEpBWC1SUyBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0dXR0ZXJpbmcKK0BBcHBsaWNhdGlvblNjb3BlZAorQFBhdGgoInN0dXR0ZXItc2VydmljZS1mYWN0b3IiKQorcHVibGljIGNsYXNzIFN0dXR0ZXJpbmdFY2hvIGltcGxlbWVudHMgRWNob1NlcnZpY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9GQUNUT1IgPSAyOworICAgIHByaXZhdGUgaW50IGZhY3RvciA9IE1JTl9GQUNUT1I7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZhY3RvcjsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgc2V0RmFjdG9yKFN0cmluZyBmYWN0b3IpIHsKKyAgICAgICAgdGhpcy5mYWN0b3IgPSBlbnN1cmVWYWxpZElucHV0KGZhY3Rvcik7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yKCkgeworICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhmYWN0b3IpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGVuc3VyZVZhbGlkSW5wdXQoU3RyaW5nIGZhY3RvcikgdGhyb3dzIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXdWYWx1ZSA9IEludGVnZXIucGFyc2VJbnQoZmFjdG9yKTsKKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA8IE1JTl9GQUNUT1IpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVXZWJBcHBFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTmV3IGZhY3RvciBjYW4gbm90IGJlIGxlc3NlciB0aGVuICVkISIsIE1JTl9GQUNUT1IpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgdGhyb3cgY3JlYXRlV2ViQXBwRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkVycm9yIHBhcnNpbmcgJXMgYXMgYW4gaW50ZWdlciEiLCBmYWN0b3IpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gY3JlYXRlV2ViQXBwRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisKKyAgICAgICAgcmV0dXJuIG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKworICAgICAgICAgICAgICAgIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QpCisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoRW50aXR5LnRleHQobWVzc2FnZSkpLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU3R1dHRlcmluZ0VjaG9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TdHV0dGVyaW5nRWNob1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkNWE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU3R1dHRlcmluZ0VjaG9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKKy8qKgorICogQ0RJIGJhY2tlZCBKQVgtUlMgcmVzb3VyY2UgdG8gc3R1dHRlciBpbnB1dCBxdWVyeSBwYXJhbWV0ZXIuCisgKiBVc2VzIHF1YWxpZmllZCBpbmplY3Rpb24gdG8gZ2V0IGEgQ0RJIGJhY2tlZCBzZXJ2aWNlIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorQFBhdGgoInN0dXR0ZXIiKQorcHVibGljIGNsYXNzIFN0dXR0ZXJpbmdFY2hvUmVzb3VyY2UgeworCisgICAgQEluamVjdCBAU3R1dHRlcmluZyBFY2hvU2VydmljZSBlY2hvU2VydmljZTsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1ZhbHVlSG9sZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1ZhbHVlSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNDZmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvVmFsdWVIb2xkZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogSGVscGVyIHR5cGUgdG8gY2hlY2sgQ0RJIHByb2R1Y2VyIG1lY2hhbmlzbSBpcyBub3QgYnJva2VuCisgKiBieSBhdXRvbWF0aWMgSEsyL0NESSBiaW5kaW5ncy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFZhbHVlSG9sZGVyPFQ+IHsKKworICAgIC8qKgorICAgICAqIFZhbHVlIGdldHRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUuCisgICAgICovCisgICAgVCBnZXRWYWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMzE2MTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24KQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlcy5DdXN0b21FeHRlbnNpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2N2NhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKK3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+aW5qZWN0ZWRSZXNvdXJjZTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+MTA8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICA8L2Vudi1lbnRyeT4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxMzdhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKKworLyoqCisgKiBUZXN0IGZvciBDREkgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlcy4KKyAqIFJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgdGFyZ2V0L2NkaS10ZXN0LXdlYmFwcAorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2RpVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgV2VsZCB3ZWxkOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2VsZCA9IG5ldyBXZWxkKCk7CisgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdlbGQuc2h1dGRvd24oKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE1haW5BcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImNkaS10ZXN0LXdlYmFwcC9tYWluIikuYnVpbGQoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ29uc3RydWN0b3JJbmplY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvbnN0cnVjdG9ySW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjMwODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvbnN0cnVjdG9ySW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFBhcnQgb2YgSkVSU0VZLTI1MjYgcmVwcm9kdWNlci4gV2l0aG91dCB0aGUgZml4LCB0aGUgYXBwbGljYXRpb24gd291bGQKKyAqIG5vdCBkZXBsb3kgYXQgYWxsLiBUaGlzIGlzIGp1c3QgdG8gbWFrZSBzdXJlIHRoZSBKQVgtUlMgcGFyYW1ldGVyIHByb2R1Y2VyCisgKiBrZWVwcyB3b3JraW5nIGFzIGV4cGVjdGVkIHdpdGhvdXQgcmVncmVzc2lvbnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhbGMuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JJbmplY3Rpb25UZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckluamVjdGVkUmVzb3VyY2UoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoImN0b3ItaW5qZWN0ZWQiKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBwYXRoUGFyYW1SZXNwb25zZSA9IHRhcmdldC5wYXRoKCJwYXRoUGFyYW0iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocGF0aFBhcmFtUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHBhdGhQYXJhbVJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInBhdGhQYXJhbSIpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBxdWVyeVBhcmFtUmVzcG9uc2UgPSB0YXJnZXQucGF0aCgicXVlcnlQYXJhbSIpLnF1ZXJ5UGFyYW0oInEiLCAiMTIzIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHF1ZXJ5UGFyYW1SZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocXVlcnlQYXJhbVJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIjEyMyIpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBtYXRyaXhQYXJhbVJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoIm1hdHJpeFBhcmFtIikubWF0cml4UGFyYW0oIm0iLCAiNDU2IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KG1hdHJpeFBhcmFtUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hdHJpeFBhcmFtUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiNDU2IikpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGhlYWRlclBhcmFtUmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiaGVhZGVyUGFyYW0iKS5yZXF1ZXN0KCkuaGVhZGVyKCJDdXN0b20tSGVhZGVyIiwgIjc4OSIpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGhlYWRlclBhcmFtUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KGhlYWRlclBhcmFtUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiNzg5IikpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNkaVBhcmFtUmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiY2RpUGFyYW0iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoY2RpUGFyYW1SZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2RpUGFyYW1SZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJjZGktcHJvZHVjZWQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Db3VudGVyVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Db3VudGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjRmNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvdW50ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworCisvKioKKyAqIFBhcnQgb2YgSkVSU0VZLTI2NDEgcmVwcm9kdWNlci4gQWNjZXNzaW5nIENESSBiZWFuIHRoYXQgaGFzIGN1c3RvbSBDREkKKyAqIGV4dGVuc2lvbiBpbmplY3RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ291bnRlclRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiY291bnRlciIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGZpcnN0UmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpcnN0UmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBpbnQgZmlyc3ROdW1iZXIgPSBJbnRlZ2VyLmRlY29kZShmaXJzdFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2Ugc2Vjb25kUmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHNlY29uZFJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgaW50IHNlY29uZE51bWJlciA9IEludGVnZXIuZGVjb2RlKHNlY29uZFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2Vjb25kIHJlcXVlc3Qgc2hvdWxkIGhhdmUgZ3JlYXRlciBudW1iZXIhIiwgc2Vjb25kTnVtYmVyID4gZmlyc3ROdW1iZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pheFJzSW5qZWN0ZWRDZGlCZWFuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2M4N2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pheFJzSW5qZWN0ZWRDZGlCZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgdGhhdCBhIHJhdyBDREkgbWFuYWdlZCBiZWFuIGdldHMgSkFYLVJTIGluamVjdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0luamVjdGVkQ2RpQmVhblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhBbmRIZWFkZXIoKSB7CisgICAgICAgIF90ZXN0UGF0aEFuZEhlYWRlcih0YXJnZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIF90ZXN0UGF0aEFuZEhlYWRlcihmaW5hbCBXZWJUYXJnZXQgd2ViVGFyZ2V0KSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB3ZWJUYXJnZXQucGF0aCgibm9uLWpheHJzLWJlYW4taW5qZWN0ZWQiKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBwYXRoUmVzcG9uc2UgPSB0YXJnZXQucGF0aCgicGF0aC8xIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHBhdGhSZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gcGF0aFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KHBhdGgsIGlzKCJub24tamF4cnMtYmVhbi1pbmplY3RlZC9wYXRoLzEiKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgaGVhZGVyUmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiaGVhZGVyLzEiKS5yZXF1ZXN0KCkuaGVhZGVyKCJ4LXRlc3QiLCAiYnVtbWVyIikuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoaGVhZGVyUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gaGVhZGVyUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoaGVhZGVyLCBpcygiYnVtbWVyIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTm9uSmF4UnNCZWFuSmF4UnNJbmplY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL05vbkpheFJzQmVhbkpheFJzSW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL05vbkpheFJzQmVhbkpheFJzSW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsySW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cEhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmVudmlyb25tZW50LnNlLldlbGQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IHR3byBKZXJzZXkgYXBwcyBydW5uaW5nIHNpbXVsdGFuZW91c2x5IHdpdGhpbiBhIHNpbmdsZSBHcml6emx5IEhUVFAgc2VydmVyCisgKiB0byBtYWtlIHN1cmUgdHdvIGluamVjdGlvbiBtYW5hZ2VycyBkbyBub3QgaW50ZXJmZXJlLiBUaGUgdGVzdCBpcyBub3QgZXhlY3V0ZWQKKyAqIGlmIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgKEdyaXp6bHkpIHRlc3QgY29udGFpbmVyIGhhcyBiZWVuIHNldC4KKyAqIEZvciBTZXJ2bGV0IGJhc2VkIGNvbnRhaW5lciB0ZXN0aW5nLCB0aGUgb3RoZXIgdHdvIHRlc3RzLCB7QGxpbmsgSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0fQorICogYW5kIHtAbGluayBTZWNvbmRKYXhSc0luamVjdGVkQ2RpQmVhblRlc3R9LAorICogZG8gdGhlIHNhbWUgam9iLCBiZWNhdXNlIHRoZSBXQVIgYXBwbGljYXRpb24gY29udGFpbnMgYm90aCBKZXJzZXkgYXBwcyBhbHJlYWR5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBOb25KYXhSc0JlYW5KYXhSc0luamVjdGlvblRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9VUkkgPSAiL21haW4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9VUkkgPSAiL3NlY29uZGFyeSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1JUX05VTUJFUiA9IGdldFN5c3RlbVByb3BlcnR5KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoVGVzdFByb3BlcnRpZXMuREVGQVVMVF9DT05UQUlORVJfUE9SVCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIE1BSU5fQVBQX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIFBPUlRfTlVNQkVSICsgTUFJTl9VUkkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBTRUNPTkRBUllfQVBQX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6IiArIFBPUlRfTlVNQkVSICsgU0VDT05EQVJZX1VSSSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0ID0gaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQoKTsKKworICAgIFdlbGQgd2VsZDsKKyAgICBIdHRwU2VydmVyIGh0dHBTZXJ2ZXI7CisKKyAgICBDbGllbnQgY2xpZW50OworICAgIFdlYlRhcmdldCBtYWluVGFyZ2V0LCBzZWNvbmRhcnlUYXJnZXQ7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKTsKKworICAgICAgICBpZiAoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQpIHsKKyAgICAgICAgICAgIGluaXRpYWxpemVXZWxkKCk7CisgICAgICAgICAgICBzdGFydEdyaXp6bHlDb250YWluZXIoKTsKKyAgICAgICAgICAgIGluaXRpYWxpemVDbGllbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGFmdGVyKCkgeworICAgICAgICBpZiAoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKSB7CisgICAgICAgICAgICBpZiAoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQpIHsKKyAgICAgICAgICAgICAgICBodHRwU2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgd2VsZC5zaHV0ZG93bigpOworICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aEFuZEhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBc3N1bWUuYXNzdW1lVGhhdChpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCwgQ29yZU1hdGNoZXJzLmlzKHRydWUpKTsKKyAgICAgICAgSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0Ll90ZXN0UGF0aEFuZEhlYWRlcihtYWluVGFyZ2V0KTsKKyAgICAgICAgU2Vjb25kSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0Ll90ZXN0UGF0aEFuZEhlYWRlcihzZWNvbmRhcnlUYXJnZXQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplV2VsZCgpIHsKKyAgICAgICAgd2VsZCA9IG5ldyBXZWxkKCk7CisgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydEdyaXp6bHlDb250YWluZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBmaXJzdENvbmZpZyA9IFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoTWFpbkFwcGxpY2F0aW9uLmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgc2Vjb25kQ29uZmlnID0gUmVzb3VyY2VDb25maWcuZm9yQXBwbGljYXRpb25DbGFzcyhTZWNvbmRhcnlBcHBsaWNhdGlvbi5jbGFzcyk7CisKKyAgICAgICAgaHR0cFNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKE1BSU5fQVBQX1VSSSwgZmlyc3RDb25maWcsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgSHR0cEhhbmRsZXIgc2Vjb25kSGFuZGxlciA9IGNyZWF0ZUdyaXp6bHlDb250YWluZXIoc2Vjb25kQ29uZmlnKTsKKyAgICAgICAgaHR0cFNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uKCkuYWRkSHR0cEhhbmRsZXIoc2Vjb25kSGFuZGxlciwgU0VDT05EQVJZX1VSSSk7CisgICAgICAgIGh0dHBTZXJ2ZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEdyaXp6bHlIdHRwQ29udGFpbmVyIGNyZWF0ZUdyaXp6bHlDb250YWluZXIoZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgR3JpenpseUh0dHBDb250YWluZXJQcm92aWRlcigpKS5jcmVhdGVDb250YWluZXIoR3JpenpseUh0dHBDb250YWluZXIuY2xhc3MsIHJlc291cmNlQ29uZmlnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNsaWVudCgpIHsKKyAgICAgICAgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgbWFpblRhcmdldCA9IGNsaWVudC50YXJnZXQoTUFJTl9BUFBfVVJJKTsKKyAgICAgICAgc2Vjb25kYXJ5VGFyZ2V0ID0gY2xpZW50LnRhcmdldChTRUNPTkRBUllfQVBQX1VSSSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RDb250YWluZXJGYWN0b3J5ID0gZ2V0U3lzdGVtUHJvcGVydHkoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX0ZBQ1RPUlksIG51bGwpOworICAgICAgICByZXR1cm4gdGVzdENvbnRhaW5lckZhY3RvcnkgPT0gbnVsbCB8fCBUZXN0UHJvcGVydGllcy5ERUZBVUxUX0NPTlRBSU5FUl9GQUNUT1JZLmVxdWFscyh0ZXN0Q29udGFpbmVyRmFjdG9yeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgZmluYWwgUHJvcGVydGllcyBzeXN0ZW1Qcm9wZXJ0aWVzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgcmV0dXJuIHN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBkZWZhdWx0VmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUGVyUmVxdWVzdEJlYW5UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1BlclJlcXVlc3RCZWFuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZDM5ODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1BlclJlcXVlc3RCZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciB0aGUgcmVxdWVzdCBzY29wZWQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQZXJSZXF1ZXN0QmVhblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsiQUFBIn0sCisgICAgICAgICAgICAgICAgeyIkJV4ifSwKKyAgICAgICAgICAgICAgICB7ImEgYiJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyB4OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHggbmV3IHRlc3QgY2FzZSBiYXNlZCBvbiB0aGUgYWJvdmUgZGVmaW5lZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHggcXVlcnkgcGFyYW1ldGVyIHZhbHVlCisgICAgICovCisgICAgcHVibGljIFBlclJlcXVlc3RCZWFuVGVzdChTdHJpbmcgeCkgeworICAgICAgICB0aGlzLnggPSB4OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiamNkaWJlYW4vcGVyLXJlcXVlc3QiKS5xdWVyeVBhcmFtKCJ4IiwgeCk7CisKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcodGFyZ2V0LmdldFVyaSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZyhTdHJpbmcuZm9ybWF0KCJxdWVyeVBhcmFtPSVzIiwgeCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1BlclJlcXVlc3REZXBlbmRlbnRCZWFuVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9QZXJSZXF1ZXN0RGVwZW5kZW50QmVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDJlODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9QZXJSZXF1ZXN0RGVwZW5kZW50QmVhblRlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIHJlcXVlc3Qgc2NvcGVkIG1hbmFnZWQgYmVhbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFBlclJlcXVlc3REZXBlbmRlbnRCZWFuVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJBQUEifSwKKyAgICAgICAgICAgICAgICB7IiQlXiJ9LAorICAgICAgICAgICAgICAgIHsiYSBiIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHg7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgeCBuZXcgdGVzdCBjYXNlIGJhc2VkIG9uIHRoZSBhYm92ZSBkZWZpbmVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0geCBxdWVyeSBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUGVyUmVxdWVzdERlcGVuZGVudEJlYW5UZXN0KFN0cmluZyB4KSB7CisgICAgICAgIHRoaXMueCA9IHg7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJqY2RpYmVhbi9kZXBlbmRlbnQvcGVyLXJlcXVlc3QiKS5xdWVyeVBhcmFtKCJ4IiwgeCk7CisKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcodGFyZ2V0LmdldFVyaSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZyhTdHJpbmcuZm9ybWF0KCJxdWVyeVBhcmFtPSVzIiwgeCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1Byb2R1Y2VyVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Qcm9kdWNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWNmOGNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Qcm9kdWNlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworCisvKioKKyAqIENoZWNrIHRoYXQgYXV0b21hdGljIEhLMiBiaW5kaW5ncyBkbyBub3QgYnJlYWsgQ0RJIHByb2R1Y2VyIG1lY2hhbmlzbS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUHJvZHVjZXJUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInByb2R1Y2VyIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgZmllbGRSZXNwb25zZSA9IHRhcmdldC5wYXRoKCJmIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpZWxkUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpZWxkUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiZmllbGQiKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgbWV0aG9kUmVzcG9uc2UgPSB0YXJnZXQucGF0aCgibSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRob2RSZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygibWV0aG9kIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUXVhbGlmaWVkSW5qZWN0aW9uU2V0R2V0VGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9RdWFsaWZpZWRJbmplY3Rpb25TZXRHZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwMTc2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUXVhbGlmaWVkSW5qZWN0aW9uU2V0R2V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKKworLyoqCisgKiBUZXN0IENESSBiZWFuIGluamVjdGVkIHVzaW5nIGEge0BsaW5rIFF1YWxpZmllcn0KKyAqIGlzIHNldHVwIHZpYSBKQVgtUlMgaW50ZXJmYWNlIGZpcnN0LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBRdWFsaWZpZWRJbmplY3Rpb25TZXRHZXRUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRHZXQoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGZhY3RvclRhcmdldCA9IHRhcmdldCgpLnBhdGgoInN0dXR0ZXItc2VydmljZS1mYWN0b3IiKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHN0dXR0ZXJUYXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJzdHV0dGVyIik7CisKKyAgICAgICAgZmFjdG9yVGFyZ2V0LnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjMiKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzaG91bGRCZVRyaXBwbGVkID0gc3R1dHRlclRhcmdldC5xdWVyeVBhcmFtKCJzIiwgImxpbmNvbG4iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChzaG91bGRCZVRyaXBwbGVkLCBpcygibGluY29sbmxpbmNvbG5saW5jb2xuIikpOworCisgICAgICAgIGZhY3RvclRhcmdldC5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCIyIikpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2hvdWxkQmVEb3VibGVkID0gc3R1dHRlclRhcmdldC5xdWVyeVBhcmFtKCJzIiwgImxpbmNvbG4iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChzaG91bGRCZURvdWJsZWQsIGlzKCJsaW5jb2xubGluY29sbiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2VFY2hvVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXZlcnNlRWNob1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzNjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXZlcnNlRWNob1Rlc3QuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBxdWFsaWZpZWQgaW5qZWN0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUmV2ZXJzZUVjaG9UZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYWxwaGEiLCAiYWhwbGEifSwKKyAgICAgICAgICAgICAgICB7ImdvZ29sIiwgImxvZ29nIn0sCisgICAgICAgICAgICAgICAgeyJlbGNhcm8iLCAib3JhY2xlIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIGluLCBvdXQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGluIHF1ZXJ5IHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gb3V0IGV4cGVjdGVkIG91dHB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmV2ZXJzZUVjaG9UZXN0KFN0cmluZyBpbiwgU3RyaW5nIG91dCkgeworICAgICAgICB0aGlzLmluID0gaW47CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHJldmVyc2VTZXJ2aWNlID0gdGFyZ2V0KCkucGF0aCgicmV2ZXJzZSIpLnF1ZXJ5UGFyYW0oInMiLCBpbik7CisgICAgICAgIFN0cmluZyBzID0gcmV2ZXJzZVNlcnZpY2UucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGVxdWFsVG8ob3V0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TZWNvbmRKYXhSc0luamVjdGVkQ2RpQmVhblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2Vjb25kSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3M2RlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2Vjb25kSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IHRoYXQgYSByYXcgQ0RJIG1hbmFnZWQgYmVhbiBnZXRzIEpBWC1SUyBpbmplY3RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU2Vjb25kSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgV2VsZCB3ZWxkOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2VsZCA9IG5ldyBXZWxkKCk7CisgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdlbGQuc2h1dGRvd24oKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFNlY29uZGFyeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiY2RpLXRlc3Qtd2ViYXBwL3NlY29uZGFyeSIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aEFuZEhlYWRlcigpIHsKKyAgICAgICAgX3Rlc3RQYXRoQW5kSGVhZGVyKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RQYXRoQW5kSGVhZGVyKGZpbmFsIFdlYlRhcmdldCB3ZWJUYXJnZXQpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHdlYlRhcmdldC5wYXRoKCJub24tamF4cnMtYmVhbi1pbmplY3RlZCIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHBhdGhSZXNwb25zZSA9IHRhcmdldC5wYXRoKCJwYXRoLzIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocGF0aFJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBwYXRoUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocGF0aCwgaXMoIm5vbi1qYXhycy1iZWFuLWluamVjdGVkL3BhdGgvMiIpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBoZWFkZXJSZXNwb25zZSA9IHRhcmdldC5wYXRoKCJoZWFkZXIvMiIpLnJlcXVlc3QoKS5oZWFkZXIoIngtdGVzdCIsICJidW1tZXIyIikuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoaGVhZGVyUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gaGVhZGVyUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoaGVhZGVyLCBpcygiYnVtbWVyMiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NpbmdsZXRvbkJlYW5UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NpbmdsZXRvbkJlYW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzNWUzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2luZ2xldG9uQmVhblRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHNjb3BlZCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFNpbmdsZXRvbkJlYW5UZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYWxwaGEiLCAiYmV0YSJ9LAorICAgICAgICAgICAgICAgIHsiMSIsICIyIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHAsIHg7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHAgcGF0aCBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHggcXVlcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBTaW5nbGV0b25CZWFuVGVzdChTdHJpbmcgcCwgU3RyaW5nIHgpIHsKKyAgICAgICAgdGhpcy5wID0gcDsKKyAgICAgICAgdGhpcy54ID0geDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBzaW5nbGV0b24gPSB0YXJnZXQoKS5wYXRoKCJqY2RpYmVhbi9zaW5nbGV0b24iKS5wYXRoKHApLnF1ZXJ5UGFyYW0oIngiLCB4KTsKKyAgICAgICAgU3RyaW5nIHMgPSBzaW5nbGV0b24ucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKHNpbmdsZXRvbi5nZXRVcmkoKS50b1N0cmluZygpKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoU3RyaW5nLmZvcm1hdCgicD0lcyIsIHApKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoU3RyaW5nLmZvcm1hdCgicXVlcnlQYXJhbT0lcyIsIHgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRlcigpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgY291bnRlciA9IHRhcmdldCgpLnBhdGgoImpjZGliZWFuL3NpbmdsZXRvbiIpLnBhdGgocCkucXVlcnlQYXJhbSgieCIsIHgpLnBhdGgoImNvdW50ZXIiKTsKKworICAgICAgICBpZiAoIUV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgd29ya2Fyb3VuZCBvbmNlIEpFUlNFWS0yNzQ0IGlzIHJlc29sdmVkCisgICAgICAgICAgICBjb3VudGVyLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjEwIikpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGMxMCA9IGNvdW50ZXIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGMxMCwgY29udGFpbnNTdHJpbmcoIjEwIikpOworCisgICAgICAgIFN0cmluZyBjMTEgPSBjb3VudGVyLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMTEsIGNvbnRhaW5zU3RyaW5nKCIxMSIpKTsKKworICAgICAgICBjb3VudGVyLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjMyIikpOworCisgICAgICAgIFN0cmluZyBjMzIgPSBjb3VudGVyLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMzIsIGNvbnRhaW5zU3RyaW5nKCIzMiIpKTsKKworICAgICAgICBjb3VudGVyLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjEwIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGV4Y2VwdGlvbiA9IHRhcmdldCgpLnBhdGgoImpjZGliZWFuL3NpbmdsZXRvbiIpLnBhdGgocCkucXVlcnlQYXJhbSgieCIsIHgpLnBhdGgoImV4Y2VwdGlvbiIpOworICAgICAgICBhc3NlcnRUaGF0KGV4Y2VwdGlvbi5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBjb250YWluc1N0cmluZygiSkRDSUJlYW5FeGNlcHRpb24iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TaW5nbGV0b25EZXBlbmRlbnRCZWFuVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TaW5nbGV0b25EZXBlbmRlbnRCZWFuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMjFhZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NpbmdsZXRvbkRlcGVuZGVudEJlYW5UZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIHRoZSBhcHBsaWNhdGlvbiBzY29wZWQgbWFuYWdlZCBiZWFuIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2luZ2xldG9uRGVwZW5kZW50QmVhblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhbHBoYSIsICJiZXRhIn0sCisgICAgICAgICAgICAgICAgeyIxIiwgIjIifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcCwgeDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCBwYXRoIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0geCBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIFNpbmdsZXRvbkRlcGVuZGVudEJlYW5UZXN0KFN0cmluZyBwLCBTdHJpbmcgeCkgeworICAgICAgICB0aGlzLnAgPSBwOworICAgICAgICB0aGlzLnggPSB4OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHNpbmdsZXRvbiA9IHRhcmdldCgpLnBhdGgoImpjZGliZWFuL2RlcGVuZGVudC9zaW5nbGV0b24iKS5wYXRoKHApLnF1ZXJ5UGFyYW0oIngiLCB4KTsKKyAgICAgICAgU3RyaW5nIHMgPSBzaW5nbGV0b24ucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKHNpbmdsZXRvbi5nZXRVcmkoKS50b1N0cmluZygpKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoU3RyaW5nLmZvcm1hdCgicD0lcyIsIHApKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoU3RyaW5nLmZvcm1hdCgicXVlcnlQYXJhbT0lcyIsIHgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRlcigpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgY291bnRlciA9IHRhcmdldCgpLnBhdGgoImpjZGliZWFuL2RlcGVuZGVudC9zaW5nbGV0b24iKS5wYXRoKHApLnF1ZXJ5UGFyYW0oIngiLCB4KS5wYXRoKCJjb3VudGVyIik7CisKKyAgICAgICAgaWYgKCFFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgd29ya2Fyb3VuZCBvbmNlIEpFUlNFWS0yNzQ0IGlzIHJlc29sdmVkCisgICAgICAgICAgICBjb3VudGVyLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjEwIikpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGMxMCA9IGNvdW50ZXIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGMxMCwgY29udGFpbnNTdHJpbmcoIjEwIikpOworCisgICAgICAgIFN0cmluZyBjMTEgPSBjb3VudGVyLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMTEsIGNvbnRhaW5zU3RyaW5nKCIxMSIpKTsKKworICAgICAgICBjb3VudGVyLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjMyIikpOworCisgICAgICAgIFN0cmluZyBjMzIgPSBjb3VudGVyLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMzIsIGNvbnRhaW5zU3RyaW5nKCIzMiIpKTsKKworICAgICAgICBjb3VudGVyLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjEwIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGV4Y2VwdGlvbiA9IHRhcmdldCgpLnBhdGgoImpjZGliZWFuL2RlcGVuZGVudC9zaW5nbGV0b24iKS5wYXRoKHApLnF1ZXJ5UGFyYW0oIngiLCB4KS5wYXRoKCJleGNlcHRpb24iKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleGNlcHRpb24ucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgY29udGFpbnNTdHJpbmcoIkpEQ0lCZWFuRGVwZW5kZW50RXhjZXB0aW9uIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU3R1dHRlckVjaG9UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJFY2hvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGRjMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJFY2hvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgcXVhbGlmaWVkIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFN0dXR0ZXJFY2hvVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICAgICAgeyJhbHBoYSIsICJhbHBoYWFscGhhIn0sCisgICAgICAgICAgICB7ImdvZ29sIiwgImdvZ29sZ29nb2wifSwKKyAgICAgICAgICAgIHsiZWxjYXJvIiwgImVsY2Fyb2VsY2FybyJ9CisgICAgICAgIH0pOworICAgIH07CisKKyAgICBmaW5hbCBTdHJpbmcgaW4sIG91dDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gcXVlcnkgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBvdXQgZXhwZWN0ZWQgb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHV0dGVyRWNob1Rlc3QoU3RyaW5nIGluLCBTdHJpbmcgb3V0KSB7CisgICAgICAgIHRoaXMuaW4gPSBpbjsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoInN0dXR0ZXIiKS5xdWVyeVBhcmFtKCJzIiwgaW4pLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBlcXVhbFRvKG91dCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvVGltZXJUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1RpbWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGJhMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1RpbWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE3NDcuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRpbWVyVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJqY2RpYmVhbi9kZXBlbmRlbnQvdGltZXIiKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBmaXJzdFJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaXJzdFJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgbG9uZyBmaXJzdE1pbGxpcyA9IExvbmcuZGVjb2RlKGZpcnN0UmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgc2xlZXAoMik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2Ugc2Vjb25kUmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHNlY29uZFJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgbG9uZyBzZWNvbmRNaWxsaXMgPSBMb25nLmRlY29kZShzZWNvbmRSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRydWUoIlNlY29uZCByZXF1ZXN0IHNob3VsZCBoYXZlIGdyZWF0ZXIgbWlsbGlzISIsIHNlY29uZE1pbGxpcyA+IGZpcnN0TWlsbGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2xlZXAobG9uZyBtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1zKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoVGltZXJUZXN0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MWVjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKZXJzZXkgQ0RJIHRlc3Qgd2ViIGFwcGxpY2F0aW9uLCB0aGlzIG9uZSB1c2VzIEplcnNleSAobm9uIEpBWC1SUykgY29tcG9uZW50IGluamVjdGlvbiBhbmQgSmVyc2V5L0NESSBTUEkgdG8gY29uZmlnCisgICAgICAgIEhLMiBjdXN0b20gYmluZGluZ3MuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4LXRyYW5zYWN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudHJhbnNhY3Rpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC50cmFuc2FjdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcEVjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcEVjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmYzZWZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwRWNoby5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworCisvKioKKyAqIEFwcGxpY2F0aW9uIHNwZWNpZmljIGVjaG8gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcFNwZWNpZmljCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBBcHBFY2hvIGltcGxlbWVudHMgRWNob1NlcnZpY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiAiQXBwOiAiICsgczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTUzYzAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworCisvKioKKyAqIENESSBiYWNrZWQsIGFwcGxpY2F0aW9uIHNjb3BlZCwgSkFYLVJTIHJlc291cmNlIHRvIGJlIGluamVjdGVkCisgKiB2aWEgaXQncyBjb25zdHJ1Y3RvciBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorQFBhdGgoImFwcC1jdG9yLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBFY2hvU2VydmljZSBlY2hvU2VydmljZTsKKworICAgIC8vIEplcnNleSBpbmplY3RlZAorICAgIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3Q7CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGVkCisgICAgTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbiBjdXN0b21JbmplY3RlZDsKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBIazJJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQ7CisKKyAgICAvLyB0byBtYWtlIHdlbGQgaGFwcHkKKyAgICBwdWJsaWMgQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgQEluamVjdAorICAgIHB1YmxpYyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZShAQXBwU3BlY2lmaWMgZmluYWwgRWNob1NlcnZpY2UgZWNob1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIazJJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQpIHsKKyAgICAgICAgdGhpcy5lY2hvU2VydmljZSA9IGVjaG9TZXJ2aWNlOworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB0aGlzLm1hcHBlcnMgPSBtYXBwZXJzOworICAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7CisgICAgICAgIHRoaXMuY3VzdG9tSW5qZWN0ZWQgPSBjdXN0b21JbmplY3RlZDsKKyAgICAgICAgdGhpcy5oazJJbmplY3RlZCA9IGhrMkluamVjdGVkOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBmaW5hbCBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXQoKS5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tMigpIHsKKyAgICAgICAgcmV0dXJuIGhrMkluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTlmNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlcy5NeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uOworCisvKioKKyAqIENESSBiYWNrZWQsIGFwcGxpY2F0aW9uIHNjb3BlZCwgSkFYLVJTIHJlc291cmNlLgorICogSXQncyBmaWVsZHMgYXJlIGluamVjdGVkIGZyb20gYm90aCBDREkgYW5kIEplcnNleSBISzIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitAUGF0aCgiYXBwLWZpZWxkLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBBcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UgeworCisgICAgLy8gQ0RJIGluamVjdGVkCisgICAgQEluamVjdAorICAgIEBBcHBTcGVjaWZpYworICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgQEluamVjdAorICAgIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3Q7CisgICAgQEluamVjdAorICAgIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVyczsKKyAgICBASW5qZWN0CisgICAgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzOworCisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0aW9uCisgICAgQEluamVjdAorICAgIE15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkOworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGlvbgorICAgIEBJbmplY3QKKyAgICBIazJJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQ7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBRdWVyeVBhcmFtKCJzIikgU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8ocyk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJwYXRoL3twYXJhbX0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0KCkuZ2V0UGF0aCh0cnVlKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1hcHBlcnMiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVycygpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlcnMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3RDb3VudCIpCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0aXN0aWNzUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihzdGF0cy5nZXQoKS5zbmFwc2hvdCgpLmdldFJlcXVlc3RTdGF0aXN0aWNzKCkuZ2V0VGltZVdpbmRvd1N0YXRpc3RpY3MoKS5nZXQoMEwpLmdldFJlcXVlc3RDb3VudCgpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20oKSB7CisgICAgICAgIHJldHVybiBjdXN0b21JbmplY3RlZC5nZXROYW1lKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20yIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbTIoKSB7CisgICAgICAgIHJldHVybiBoazJJbmplY3RlZC5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNwZWNpZmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwZmM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNwZWNpZmljLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogUXVhbGlmaWVyIGZvciBhcHBsaWNhdGlvbiBzcGVjaWZpYyBlY2hvIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBBcHBTcGVjaWZpYyB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQ1YjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKioKKyAqIFNpbXBsZSBlY2hvIHNlcnZpY2UgdG8gdGVzdCBpbmplY3Rpb25zIHVzaW5nIHtAbGluayBRdWFsaWZpZXJ9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNob1NlcnZpY2UgeworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBhbiBlY2hvZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBTdHJpbmcgdG8gYmUgZWNob2VkLgorICAgICAqIEByZXR1cm4gZWNob2VkIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9IazJJbmplY3RlZFR5cGUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0hrMkluamVjdGVkVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDczZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9IazJJbmplY3RlZFR5cGUuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogQ0RJIGNvbXBsaWFudCBiZWFuLiBJbmplY3Rpb24gd2lsbCBiZSBkZWxlZ2F0ZWQgdG8gSEsyIGFueXdheS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGsySW5qZWN0ZWRUeXBlIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBOby1hcmcgY29uc3RydWN0b3IgbWFrZXMgdGhpcyBiZWFuIHN1aXRhYmxlIGZvciBDREkgaW5qZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBIazJJbmplY3RlZFR5cGUoKSB7CisgICAgICAgIG5hbWUgPSAiQ0RJIHdvdWxkIGxvdmUgdGhpcyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGsyIGN1c3RvbSBiaW5kZXIgaXMgZ29pbmcgdG8gdXNlIHRoaXMgb25lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgSGsySW5qZWN0ZWRUeXBlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2ltcGxlIGdldHRlciB0byBwcm92ZSB3aGVyZSB0aGlzIGJlYW4gd2FzIGluaXRpYWxpemVkLgorICAgICAqCisgICAgICogQHJldHVybiBuYW1lIGFzIGRlZmluZWQgYXQgYmVhbiBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWZjMjQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuTW9uaXRvcmluZ0ZlYXR1cmU7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5qZWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgIHB1YmxpYyBNeUluamVjdGlvbihTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisKKyAgICAgICAgLy8gSkFYLVJTIHJlc291cmNlIGNsYXNzZXMKKyAgICAgICAgcmVnaXN0ZXIoQXBwU2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihSZXF1ZXN0U2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICByZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kKG5ldyBNeUluamVjdGlvbigiMXN0OiBubyB3YXkgQ0RJIHdvdWxkIGNoaW1lIGluIikpLnRvKE15SW5qZWN0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBiaW5kKG5ldyBIazJJbmplY3RlZFR5cGUoIjJuZDogbm8gd2F5IENESSB3b3VsZCBjaGltZSBpbiIpKS50byhIazJJbmplY3RlZFR5cGUuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBKZXJzZXkgbW9uaXRvcmluZworICAgICAgICByZWdpc3RlcihNb25pdG9yaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlIazJUeXBlc1Byb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUhrMlR5cGVzUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjVlNDFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlIazJUeXBlc1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXI7CisKKy8qKgorICogVGVsbCBKZXJzZXkgQ0RJIGV4dGVuc2lvbiB3aGF0IHR5cGVzIHNob3VsZCBiZSBicmlkZ2VkIGZyb20gSEsyIHRvIENESS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTXlIazJUeXBlc1Byb3ZpZGVyIGltcGxlbWVudHMgSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8VHlwZT4gZ2V0SGsyVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxUeXBlPigpIHt7CisgICAgICAgICAgICBhZGQoSGsySW5qZWN0ZWRUeXBlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uLmNsYXNzKTsKKyAgICAgICAgfX07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdEVjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RFY2hvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjMjZiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RFY2hvLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCisvKioKKyAqIFJlcXVlc3Qgc3BlY2lmaWMgZWNobyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNwZWNpZmljCitwdWJsaWMgY2xhc3MgUmVxdWVzdEVjaG8gaW1wbGVtZW50cyBFY2hvU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuICJSZXF1ZXN0OiAiICsgczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTg5NWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQ0RJIGJhY2tlZCwgcmVxdWVzdCBzY29wZWQsIEpBWC1SUyByZXNvdXJjZSB0byBiZSBpbmplY3RlZAorICogdmlhIGl0J3MgY29uc3RydWN0b3IgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoInJlcXVlc3QtY3Rvci1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlIHsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworICAgIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVyczsKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3RlZAorICAgIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0ZWQKKyAgICBIazJJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQ7CisKKyAgICAvLyB0byBtYWtlIHdlbGQgaGFwcHkKKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKCkgeworICAgIH0KKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKEBSZXF1ZXN0U3BlY2lmaWMgZmluYWwgRWNob1NlcnZpY2UgZWNob1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSGsySW5qZWN0ZWRUeXBlIGhrMkluamVjdGVkKSB7CisKKyAgICAgICAgdGhpcy5lY2hvU2VydmljZSA9IGVjaG9TZXJ2aWNlOworICAgICAgICB0aGlzLm1hcHBlcnMgPSBtYXBwZXJzOworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7CisgICAgICAgIHRoaXMuY3VzdG9tSW5qZWN0ZWQgPSBjdXN0b21JbmplY3RlZDsKKyAgICAgICAgdGhpcy5oazJJbmplY3RlZCA9IGhrMkluamVjdGVkOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBmaW5hbCBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tMigpIHsKKyAgICAgICAgcmV0dXJuIGhrMkluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0Zjg4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworCisvKioKKyAqIENESSBiYWNrZWQsIHJlcXVlc3Qgc2NvcGVkLCBKQVgtUlMgcmVzb3VyY2UuCisgKiBJdCdzIGZpZWxkcyBhcmUgaW5qZWN0ZWQgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoInJlcXVlc3QtZmllbGQtaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIFJlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UgeworCisgICAgLy8gYnVpbHQtaW4gQ0RJIGJlYW4KKyAgICBASW5qZWN0CisgICAgQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXI7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQFJlcXVlc3RTcGVjaWZpYworICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgQEluamVjdAorICAgIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdDsKKyAgICBASW5qZWN0CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIEBJbmplY3QKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBDdXN0b20gSmVyc2V5L0hLMiBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkOworICAgIC8vIEN1c3RvbSBKZXJzZXkvSEsyIGluamVjdGVkCisgICAgQEluamVjdAorICAgIEhrMkluamVjdGVkVHlwZSBoazJJbmplY3RlZDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tMigpIHsKKyAgICAgICAgcmV0dXJuIGhrMkluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImJtIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJtKCkgeworICAgICAgICByZXR1cm4gYmVhbk1hbmFnZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U3BlY2lmaWMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTcGVjaWZpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjA0OGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U3BlY2lmaWMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBRdWFsaWZpZXIgZm9yIHJlcXVlc3Qgc3BlY2lmaWMgZWNobyBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFF1YWxpZmllcgorcHVibGljIEBpbnRlcmZhY2UgUmVxdWVzdFNwZWNpZmljIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkMzVmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXMuTXlIazJUeXBlc1Byb3ZpZGVyCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2N2NhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCit4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmluamVjdGVkUmVzb3VyY2U8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmZTk2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBDREkgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlcy4KKyAqIFJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgdGFyZ2V0L2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwCisgKiBtdm4gLURza2lwVGVzdHM9ZmFsc2UgdGVzdDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDZGlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJjZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwIikuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21JbmplY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21JbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1OGY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUluamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgY3VzdG9tIEhLMiBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDdXN0b21JbmplY3Rpb25UZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcXVlcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBDdXN0b21JbmplY3Rpb25UZXN0KGZpbmFsIFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBmb3Igb25lIG5vIE5QRSBoYXBwZW5zIG9uIHRoZSBzZXJ2ZXIgc2lkZSwKKyAgICAgKiBhbmQgdGhlIGN1c3RvbSBib3VuZCBpbnN0YW5jZSBvZiB7QGxpbmsgSGsySW5qZWN0ZWRUeXBlfSBnZXRzIGluamVjdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUhrMkluamVjdGlvbjEoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJjdXN0b20iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiMXN0OiBubyB3YXkgQ0RJIHdvdWxkIGNoaW1lIGluIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgZm9yIG9uZSBubyBOUEUgaGFwcGVucyBvbiB0aGUgc2VydmVyIHNpZGUsCisgICAgICogYW5kIHRoZSBjdXN0b20gYm91bmQgaW5zdGFuY2Ugb2Yge0BsaW5rIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb259IGdldHMgaW5qZWN0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tSGsySW5qZWN0aW9uMigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2UpLnBhdGgoImN1c3RvbTIiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiMm5kOiBubyB3YXkgQ0RJIHdvdWxkIGNoaW1lIGluIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0V4Y2VwdGlvbk1hcHBlcnNUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FeGNlcHRpb25NYXBwZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzUzNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FeGNlcHRpb25NYXBwZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgZXhjZXB0aW9uIG1hcHBlciBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwZXJzVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCJ9LAorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHF1ZXJ5IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uTWFwcGVyc1Rlc3QoZmluYWwgU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IGZvciBvbmUgbm8gTlBFIGhhcHBlbnMgb24gdGhlIHNlcnZlciBzaWRlLCBhbmQgZm9yIHR3bworICAgICAqIHRoZSBpbmplY3RlZCBtYXBwZXJzIHJlbWFpbnMgdGhlIHNhbWUgYWNyb3NzIHJlcXVlc3RzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlcnNOb3ROdWxsKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgibWFwcGVycyIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSBmaXJzdFJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaXJzdFJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3RWYWx1ZSA9IGZpcnN0UmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oZmlyc3RWYWx1ZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01vbml0b3JpbmdUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Nb25pdG9yaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWVkODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Nb25pdG9yaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIG1vbml0b3Jpbmcgc3RhdGlzdGljcyBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNb25pdG9yaW5nVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdXJpIG9mIHJlc291cmNlIHRvIGJlIHRlc3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTW9uaXRvcmluZ1Rlc3QoZmluYWwgU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHNldmVyYWwgcmVxdWVzdHMgYW5kIGNoZWNrIHRoZSBjb3VudGVyIGtlZXBzIGluY3JlbWVudGluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdW5leHBlY3RlZCB0ZXN0IGZhaWx1cmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdENvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJyZXF1ZXN0Q291bnQiKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOyAvLyB0aGlzIGlzIHRvIGFsbG93IHN0YXRpc3RpY3Mgb24gdGhlIHNlcnZlciBzaWRlIHRvIGdldCB1cGRhdGVkCisgICAgICAgIGZpbmFsIGludCBzdGFydCA9IEludGVnZXIuZGVjb2RlKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOyAvLyB0aGlzIGlzIHRvIGFsbG93IHN0YXRpc3RpY3Mgb24gdGhlIHNlcnZlciBzaWRlIHRvIGdldCB1cGRhdGVkCisgICAgICAgICAgICBmaW5hbCBpbnQgbmV4dCA9IEludGVnZXIuZGVjb2RlKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChTdHJpbmcuZm9ybWF0KCJ0ZXN0aW5nICVzIiwgcmVzb3VyY2UpLCBuZXh0LCBlcXVhbFRvKHN0YXJ0ICsgaSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNlbnNpdGl2ZVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTZW5zaXRpdmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxYmVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTZW5zaXRpdmVUZXN0LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGluamVjdGlvbiBvZiByZXF1ZXN0IGRlcGVuZGluZyBpbnN0YW5jZXMgd29ya3MgYXMgZXhwZWN0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2Vuc2l0aXZlVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCIsICJhbHBoYSIsICJBcHA6IGFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQiLCAiZ29nb2wiLCAiQXBwOiBnb2dvbCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIiwgImVsY2FybyIsICJBcHA6IGVsY2FybyJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQiLCAiYWxwaGEiLCAiQXBwOiBhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQiLCAiZ29nb2wiLCAiQXBwOiBnb2dvbCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQiLCAiZWxjYXJvIiwgIkFwcDogZWxjYXJvIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIiwgImFscGhhIiwgIlJlcXVlc3Q6IGFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIiwgImdvZ29sIiwgIlJlcXVlc3Q6IGdvZ29sIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIiwgIm9yYWNsZSIsICJSZXF1ZXN0OiBvcmFjbGUifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCIsICJhbHBoYSIsICJSZXF1ZXN0OiBhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIiwgImdvZ29sIiwgIlJlcXVlc3Q6IGdvZ29sIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQiLCAib3JhY2xlIiwgIlJlcXVlc3Q6IG9yYWNsZSJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZSwgc3RyYWlnaHQsIGVjaG9lZDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdXJpIG9mIHRoZSByZXNvdXJjZSB0byBiZSB0ZXN0ZWQuCisgICAgICogQHBhcmFtIHN0cmFpZ2h0IHJlcXVlc3Qgc3BlY2lmaWMgaW5wdXQuCisgICAgICogQHBhcmFtIGVjaG9lZCAgIENESSBpbmplY3RlZCBzZXJ2aWNlIHNob3VsZCBwcm9kdWNlIHRoaXMgb3V0IG9mIHByZXZpb3VzLCBzdHJhaWdodCwgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0U2Vuc2l0aXZlVGVzdChmaW5hbCBTdHJpbmcgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBzdHJhaWdodCwgZmluYWwgU3RyaW5nIGVjaG9lZCkgeworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgICAgIHRoaXMuc3RyYWlnaHQgPSBzdHJhaWdodDsKKyAgICAgICAgdGhpcy5lY2hvZWQgPSBlY2hvZWQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2RpSW5qZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2UpLnF1ZXJ5UGFyYW0oInMiLCBzdHJhaWdodCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGVxdWFsVG8oZWNob2VkKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGsySW5qZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2UpLnBhdGgoInBhdGgiKS5wYXRoKHN0cmFpZ2h0KS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocywgZXF1YWxUbyhTdHJpbmcuZm9ybWF0KCIlcy9wYXRoLyVzIiwgcmVzb3VyY2UsIHN0cmFpZ2h0KSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODAyMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMTEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWNkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKZXJzZXkgQ0RJIHRlc3Qgd2ViIGFwcGxpY2F0aW9uLCB0aGlzIG9uZSB1c2VzIEplcnNleSAobm9uIEpBWC1SUykgY29tcG9uZW50IGluamVjdGlvbiBISzIgY3VzdG9tIGJpbmRpbmcgaGFzIGJlZW4gYmFubmVkLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXg8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeC10cmFuc2FjdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC50cmFuc2FjdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnRyYW5zYWN0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBFY2hvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwRWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjNlZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwRWNoby5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworCisvKioKKyAqIEFwcGxpY2F0aW9uIHNwZWNpZmljIGVjaG8gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcFNwZWNpZmljCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBBcHBFY2hvIGltcGxlbWVudHMgRWNob1NlcnZpY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiAiQXBwOiAiICsgczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MGE2ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworCisvKioKKyAqIENESSBiYWNrZWQsIGFwcGxpY2F0aW9uIHNjb3BlZCwgSkFYLVJTIHJlc291cmNlIHRvIGJlIGluamVjdGVkCisgKiB2aWEgaXQncyBjb25zdHJ1Y3RvciBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorQFBhdGgoImFwcC1jdG9yLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBFY2hvU2VydmljZSBlY2hvU2VydmljZTsKKworICAgIC8vIEplcnNleSBpbmplY3RlZAorICAgIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3Q7CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGVkCisgICAgTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbiBjdXN0b21JbmplY3RlZDsKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBDZGlJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQ7CisKKyAgICAvLyB0byBtYWtlIHdlbGQgaGFwcHkKKyAgICBwdWJsaWMgQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgQEluamVjdAorICAgIHB1YmxpYyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZShAQXBwU3BlY2lmaWMgZmluYWwgRWNob1NlcnZpY2UgZWNob1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDZGlJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQpIHsKKyAgICAgICAgdGhpcy5lY2hvU2VydmljZSA9IGVjaG9TZXJ2aWNlOworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB0aGlzLm1hcHBlcnMgPSBtYXBwZXJzOworICAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7CisgICAgICAgIHRoaXMuY3VzdG9tSW5qZWN0ZWQgPSBjdXN0b21JbmplY3RlZDsKKyAgICAgICAgdGhpcy5oazJJbmplY3RlZCA9IGhrMkluamVjdGVkOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBmaW5hbCBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXQoKS5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tMigpIHsKKyAgICAgICAgcmV0dXJuIGhrMkluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxNjQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlcy5NeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uOworCisvKioKKyAqIENESSBiYWNrZWQsIGFwcGxpY2F0aW9uIHNjb3BlZCwgSkFYLVJTIHJlc291cmNlLgorICogSXQncyBmaWVsZHMgYXJlIGluamVjdGVkIGZyb20gYm90aCBDREkgYW5kIEplcnNleSBISzIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitAUGF0aCgiYXBwLWZpZWxkLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBBcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UgeworCisgICAgLy8gQ0RJIGluamVjdGVkCisgICAgQEluamVjdAorICAgIEBBcHBTcGVjaWZpYworICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgQEluamVjdAorICAgIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3Q7CisgICAgQEluamVjdAorICAgIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVyczsKKyAgICBASW5qZWN0CisgICAgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzOworCisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0aW9uCisgICAgQEluamVjdAorICAgIE15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkOworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGlvbgorICAgIEBJbmplY3QKKyAgICBDZGlJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQ7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBRdWVyeVBhcmFtKCJzIikgU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8ocyk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJwYXRoL3twYXJhbX0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0KCkuZ2V0UGF0aCh0cnVlKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1hcHBlcnMiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVycygpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlcnMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3RDb3VudCIpCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0aXN0aWNzUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihzdGF0cy5nZXQoKS5zbmFwc2hvdCgpLmdldFJlcXVlc3RTdGF0aXN0aWNzKCkuZ2V0VGltZVdpbmRvd1N0YXRpc3RpY3MoKS5nZXQoMEwpLmdldFJlcXVlc3RDb3VudCgpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20oKSB7CisgICAgICAgIHJldHVybiBjdXN0b21JbmplY3RlZC5nZXROYW1lKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20yIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbTIoKSB7CisgICAgICAgIHJldHVybiBoazJJbmplY3RlZC5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNwZWNpZmljLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDBmYzZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNwZWNpZmljLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogUXVhbGlmaWVyIGZvciBhcHBsaWNhdGlvbiBzcGVjaWZpYyBlY2hvIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBBcHBTcGVjaWZpYyB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpSW5qZWN0ZWRUeXBlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpSW5qZWN0ZWRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiMWZjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlJbmplY3RlZFR5cGUuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogQ0RJIGNvbXBsaWFudCBiZWFuLiBJbmplY3Rpb24gd2lsbCBiZSBkb25lIGJ5IENESSBpbiB0aGlzIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDZGlJbmplY3RlZFR5cGUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIE5vLWFyZyBjb25zdHJ1Y3RvciBtYWtlcyB0aGlzIGJlYW4gc3VpdGFibGUgZm9yIENESSBpbmplY3Rpb24uCisgICAgICovCisgICAgcHVibGljIENkaUluamVjdGVkVHlwZSgpIHsKKyAgICAgICAgbmFtZSA9ICJDREkgd291bGQgbG92ZSB0aGlzIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIazIgY3VzdG9tIGJpbmRlciBpcyBnb2luZyB0byB1c2UgdGhpcyBvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBDZGlJbmplY3RlZFR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgZ2V0dGVyIHRvIHByb3ZlIHdoZXJlIHRoaXMgYmVhbiB3YXMgaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5hbWUgYXMgZGVmaW5lZCBhdCBiZWFuIGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9TZXJ2aWNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzQ1YjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9TZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBTaW1wbGUgZWNobyBzZXJ2aWNlIHRvIHRlc3QgaW5qZWN0aW9ucyB1c2luZyB7QGxpbmsgUXVhbGlmaWVyfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjaG9TZXJ2aWNlIHsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgYW4gZWNob2VkIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHMgU3RyaW5nIHRvIGJlIGVjaG9lZC4KKyAgICAgKiBAcmV0dXJuIGVjaG9lZCBpbnB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5ZjQzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5Nb25pdG9yaW5nRmVhdHVyZTsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gdG8gY29uZmlndXJlIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvKiIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3Rpb24geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIE15SW5qZWN0aW9uKCkgeworICAgICAgICAgICAgbmFtZSA9ICJDREkgaW5qZWN0ZWQiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE15SW5qZWN0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKworICAgICAgICAvLyBKQVgtUlMgcmVzb3VyY2UgY2xhc3NlcworICAgICAgICByZWdpc3RlcihBcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKFJlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmQobmV3IE15SW5qZWN0aW9uKCIxc3Q6IHVudXNlZCBISzIgYmluZGluZyIpKS50byhNeUluamVjdGlvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgYmluZChuZXcgQ2RpSW5qZWN0ZWRUeXBlKCIybmQ6IHVudXNlZCBISzIgYmluZGluZyIpKS50byhDZGlJbmplY3RlZFR5cGUuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBKZXJzZXkgbW9uaXRvcmluZworICAgICAgICByZWdpc3RlcihNb25pdG9yaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RFY2hvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdEVjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGMyNmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RFY2hvLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCisvKioKKyAqIFJlcXVlc3Qgc3BlY2lmaWMgZWNobyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNwZWNpZmljCitwdWJsaWMgY2xhc3MgUmVxdWVzdEVjaG8gaW1wbGVtZW50cyBFY2hvU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuICJSZXF1ZXN0OiAiICsgczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4MGUwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQ0RJIGJhY2tlZCwgcmVxdWVzdCBzY29wZWQsIEpBWC1SUyByZXNvdXJjZSB0byBiZSBpbmplY3RlZAorICogdmlhIGl0J3MgY29uc3RydWN0b3IgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoInJlcXVlc3QtY3Rvci1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlIHsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworICAgIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVyczsKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3RlZAorICAgIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0ZWQKKyAgICBDZGlJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQ7CisKKyAgICAvLyB0byBtYWtlIHdlbGQgaGFwcHkKKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKCkgeworICAgIH0KKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKEBSZXF1ZXN0U3BlY2lmaWMgZmluYWwgRWNob1NlcnZpY2UgZWNob1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2RpSW5qZWN0ZWRUeXBlIGhrMkluamVjdGVkKSB7CisKKyAgICAgICAgdGhpcy5lY2hvU2VydmljZSA9IGVjaG9TZXJ2aWNlOworICAgICAgICB0aGlzLm1hcHBlcnMgPSBtYXBwZXJzOworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7CisgICAgICAgIHRoaXMuY3VzdG9tSW5qZWN0ZWQgPSBjdXN0b21JbmplY3RlZDsKKyAgICAgICAgdGhpcy5oazJJbmplY3RlZCA9IGhrMkluamVjdGVkOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBmaW5hbCBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tMigpIHsKKyAgICAgICAgcmV0dXJuIGhrMkluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWNmMDFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworCisvKioKKyAqIENESSBiYWNrZWQsIHJlcXVlc3Qgc2NvcGVkLCBKQVgtUlMgcmVzb3VyY2UuCisgKiBJdCdzIGZpZWxkcyBhcmUgaW5qZWN0ZWQgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoInJlcXVlc3QtZmllbGQtaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIFJlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UgeworCisgICAgLy8gYnVpbHQtaW4gQ0RJIGJlYW4KKyAgICBASW5qZWN0CisgICAgQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXI7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQFJlcXVlc3RTcGVjaWZpYworICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgQEluamVjdAorICAgIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdDsKKyAgICBASW5qZWN0CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIEBJbmplY3QKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBDdXN0b20gSmVyc2V5L0hLMiBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkOworICAgIC8vIEN1c3RvbSBKZXJzZXkvSEsyIGluamVjdGVkCisgICAgQEluamVjdAorICAgIENkaUluamVjdGVkVHlwZSBoazJJbmplY3RlZDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tMigpIHsKKyAgICAgICAgcmV0dXJuIGhrMkluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImJtIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJtKCkgeworICAgICAgICByZXR1cm4gYmVhbk1hbmFnZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNwZWNpZmljLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNwZWNpZmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmMDQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U3BlY2lmaWMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBRdWFsaWZpZXIgZm9yIHJlcXVlc3Qgc3BlY2lmaWMgZWNobyBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFF1YWxpZmllcgorcHVibGljIEBpbnRlcmZhY2UgUmVxdWVzdFNwZWNpZmljIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjdjYTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKK3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+aW5qZWN0ZWRSZXNvdXJjZTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+MTA8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICA8L2Vudi1lbnRyeT4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Y2YyMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCisvKioKKyAqIFRlc3QgZm9yIENESSB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLgorICogUnVuIHdpdGg6CisgKiA8cHJlPgorICogbXZuIGNsZWFuIHBhY2thZ2UKKyAqICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSB0YXJnZXQvY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAKKyAqIG12biAtRHNraXBUZXN0cz1mYWxzZSB0ZXN0PC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENkaVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImNkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwIikuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tSW5qZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUluamVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDk4NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUluamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgY3VzdG9tIEhLMiBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDdXN0b21JbmplY3Rpb25UZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcXVlcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBDdXN0b21JbmplY3Rpb25UZXN0KGZpbmFsIFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBmb3Igb25lIG5vIE5QRSBoYXBwZW5zIG9uIHRoZSBzZXJ2ZXIgc2lkZSwKKyAgICAgKiBhbmQgdGhlIGN1c3RvbSBib3VuZCBpbnN0YW5jZSBvZiB7QGxpbmsgQ2RpSW5qZWN0ZWRUeXBlfSBnZXRzIENESSBpbmplY3RlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21IazJJbmplY3Rpb24xKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgiY3VzdG9tIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIkNESSBpbmplY3RlZCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IGZvciBvbmUgbm8gTlBFIGhhcHBlbnMgb24gdGhlIHNlcnZlciBzaWRlLAorICAgICAqIGFuZCB0aGUgY3VzdG9tIGJvdW5kIGluc3RhbmNlIG9mIHtAbGluayBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9ufSBnZXRzIENESSBpbmplY3RlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21IazJJbmplY3Rpb24yKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgiY3VzdG9tMiIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJDREkgd291bGQgbG92ZSB0aGlzIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FeGNlcHRpb25NYXBwZXJzVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0V4Y2VwdGlvbk1hcHBlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg3MzY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FeGNlcHRpb25NYXBwZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgZXhjZXB0aW9uIG1hcHBlciBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwZXJzVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcXVlcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBFeGNlcHRpb25NYXBwZXJzVGVzdChmaW5hbCBTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgZm9yIG9uZSBubyBOUEUgaGFwcGVucyBvbiB0aGUgc2VydmVyIHNpZGUsIGFuZCBmb3IgdHdvCisgICAgICogdGhlIGluamVjdGVkIG1hcHBlcnMgcmVtYWlucyB0aGUgc2FtZSBhY3Jvc3MgcmVxdWVzdHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGVyc05vdE51bGwoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJtYXBwZXJzIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGZpcnN0UmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpcnN0UmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaXJzdFZhbHVlID0gZmlyc3RSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhmaXJzdFZhbHVlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01vbml0b3JpbmdUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTW9uaXRvcmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWFlZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01vbml0b3JpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgbW9uaXRvcmluZyBzdGF0aXN0aWNzIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIE1vbml0b3JpbmdUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHJlc291cmNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSB1cmkgb2YgcmVzb3VyY2UgdG8gYmUgdGVzdGVkLgorICAgICAqLworICAgIHB1YmxpYyBNb25pdG9yaW5nVGVzdChmaW5hbCBTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2Ugc2V2ZXJhbCByZXF1ZXN0cyBhbmQgY2hlY2sgdGhlIGNvdW50ZXIga2VlcHMgaW5jcmVtZW50aW5nLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiB1bmV4cGVjdGVkIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0Q291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2UpLnBhdGgoInJlcXVlc3RDb3VudCIpOworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIHRoaXMgaXMgdG8gYWxsb3cgc3RhdGlzdGljcyBvbiB0aGUgc2VydmVyIHNpZGUgdG8gZ2V0IHVwZGF0ZWQKKyAgICAgICAgZmluYWwgaW50IHN0YXJ0ID0gSW50ZWdlci5kZWNvZGUodGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIHRoaXMgaXMgdG8gYWxsb3cgc3RhdGlzdGljcyBvbiB0aGUgc2VydmVyIHNpZGUgdG8gZ2V0IHVwZGF0ZWQKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXh0ID0gSW50ZWdlci5kZWNvZGUodGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KFN0cmluZy5mb3JtYXQoInRlc3RpbmcgJXMiLCByZXNvdXJjZSksIG5leHQsIGVxdWFsVG8oc3RhcnQgKyBpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNlbnNpdGl2ZVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2Vuc2l0aXZlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMWJlZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNlbnNpdGl2ZVRlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgaW5qZWN0aW9uIG9mIHJlcXVlc3QgZGVwZW5kaW5nIGluc3RhbmNlcyB3b3JrcyBhcyBleHBlY3RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFJlcXVlc3RTZW5zaXRpdmVUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIiwgImFscGhhIiwgIkFwcDogYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCIsICJnb2dvbCIsICJBcHA6IGdvZ29sIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQiLCAiZWxjYXJvIiwgIkFwcDogZWxjYXJvIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCIsICJhbHBoYSIsICJBcHA6IGFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCIsICJnb2dvbCIsICJBcHA6IGdvZ29sIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCIsICJlbGNhcm8iLCAiQXBwOiBlbGNhcm8ifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQiLCAiYWxwaGEiLCAiUmVxdWVzdDogYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQiLCAiZ29nb2wiLCAiUmVxdWVzdDogZ29nb2wifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQiLCAib3JhY2xlIiwgIlJlcXVlc3Q6IG9yYWNsZSJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIiwgImFscGhhIiwgIlJlcXVlc3Q6IGFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQiLCAiZ29nb2wiLCAiUmVxdWVzdDogZ29nb2wifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCIsICJvcmFjbGUiLCAiUmVxdWVzdDogb3JhY2xlIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHJlc291cmNlLCBzdHJhaWdodCwgZWNob2VkOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSB1cmkgb2YgdGhlIHJlc291cmNlIHRvIGJlIHRlc3RlZC4KKyAgICAgKiBAcGFyYW0gc3RyYWlnaHQgcmVxdWVzdCBzcGVjaWZpYyBpbnB1dC4KKyAgICAgKiBAcGFyYW0gZWNob2VkICAgQ0RJIGluamVjdGVkIHNlcnZpY2Ugc2hvdWxkIHByb2R1Y2UgdGhpcyBvdXQgb2YgcHJldmlvdXMsIHN0cmFpZ2h0LCBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RTZW5zaXRpdmVUZXN0KGZpbmFsIFN0cmluZyByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHN0cmFpZ2h0LCBmaW5hbCBTdHJpbmcgZWNob2VkKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgdGhpcy5zdHJhaWdodCA9IHN0cmFpZ2h0OworICAgICAgICB0aGlzLmVjaG9lZCA9IGVjaG9lZDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDZGlJbmplY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucXVlcnlQYXJhbSgicyIsIHN0cmFpZ2h0KS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocywgZXF1YWxUbyhlY2hvZWQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIazJJbmplY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgicGF0aCIpLnBhdGgoc3RyYWlnaHQpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBlcXVhbFRvKFN0cmluZy5mb3JtYXQoIiVzL3BhdGgvJXMiLCByZXNvdXJjZSwgc3RyYWlnaHQpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlMGM0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSw4NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgQ0RJIHRlc3Qgd2ViIGFwcGxpY2F0aW9uLCB0aGlzIG9uZSB1c2VzIEplcnNleSAobm9uIEpBWC1SUykgY29tcG9uZW50IGluamVjdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXg8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeC10cmFuc2FjdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBUZXN0c308L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke3Rlc3RDb250YWluZXJGYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke3Rlc3RDb250YWluZXJQb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcEVjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBFY2hvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmM2VmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBFY2hvLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCisKKy8qKgorICogQXBwbGljYXRpb24gc3BlY2lmaWMgZWNobyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwU3BlY2lmaWMKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEFwcEVjaG8gaW1wbGVtZW50cyBFY2hvU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuICJBcHA6ICIgKyBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmZmVlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhjZXB0aW9uTWFwcGVyczsKKworLyoqCisgKiBDREkgYmFja2VkLCBhcHBsaWNhdGlvbiBzY29wZWQsIEpBWC1SUyByZXNvdXJjZSB0byBiZSBpbmplY3RlZAorICogdmlhIGl0J3MgY29uc3RydWN0b3IgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK0BQYXRoKCJhcHAtY3Rvci1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UgeworCisgICAgLy8gQ0RJIGluamVjdGVkCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0PiByZXF1ZXN0OworICAgIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVyczsKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3RlZAorICAgIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisKKyAgICAvLyB0byBtYWtlIHdlbGQgaGFwcHkKKyAgICBwdWJsaWMgQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgQEluamVjdAorICAgIHB1YmxpYyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZShAQXBwU3BlY2lmaWMgZmluYWwgRWNob1NlcnZpY2UgZWNob1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkKSB7CisgICAgICAgIHRoaXMuZWNob1NlcnZpY2UgPSBlY2hvU2VydmljZTsKKyAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgdGhpcy5tYXBwZXJzID0gbWFwcGVyczsKKyAgICAgICAgdGhpcy5zdGF0cyA9IHN0YXRzOworICAgICAgICB0aGlzLmN1c3RvbUluamVjdGVkID0gY3VzdG9tSW5qZWN0ZWQ7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC97cGFyYW19IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldCgpLmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlcnMoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0Q291bnQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGlzdGljc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RhdHMuZ2V0KCkuc25hcHNob3QoKS5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KDBMKS5nZXRSZXF1ZXN0Q291bnQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworICAgICAgICByZXR1cm4gY3VzdG9tSW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzE5NmQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhjZXB0aW9uTWFwcGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzLk15QXBwbGljYXRpb24uTXlJbmplY3Rpb247CisKKy8qKgorICogQ0RJIGJhY2tlZCwgYXBwbGljYXRpb24gc2NvcGVkLCBKQVgtUlMgcmVzb3VyY2UuCisgKiBJdCdzIGZpZWxkcyBhcmUgaW5qZWN0ZWQgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK0BQYXRoKCJhcHAtZmllbGQtaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIEFwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQEFwcFNwZWNpZmljCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdDsKKyAgICBASW5qZWN0CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIEBJbmplY3QKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3Rpb24KKyAgICBASW5qZWN0CisgICAgTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBRdWVyeVBhcmFtKCJzIikgU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8ocyk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJwYXRoL3twYXJhbX0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0KCkuZ2V0UGF0aCh0cnVlKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1hcHBlcnMiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVycygpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlcnMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3RDb3VudCIpCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0aXN0aWNzUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihzdGF0cy5nZXQoKS5zbmFwc2hvdCgpLmdldFJlcXVlc3RTdGF0aXN0aWNzKCkuZ2V0VGltZVdpbmRvd1N0YXRpc3RpY3MoKS5nZXQoMEwpLmdldFJlcXVlc3RDb3VudCgpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20oKSB7CisgICAgICAgIHJldHVybiBjdXN0b21JbmplY3RlZC5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNwZWNpZmljLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDBmYzZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNwZWNpZmljLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogUXVhbGlmaWVyIGZvciBhcHBsaWNhdGlvbiBzcGVjaWZpYyBlY2hvIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBBcHBTcGVjaWZpYyB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1NlcnZpY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDViMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKioKKyAqIFNpbXBsZSBlY2hvIHNlcnZpY2UgdG8gdGVzdCBpbmplY3Rpb25zIHVzaW5nIHtAbGluayBRdWFsaWZpZXJ9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNob1NlcnZpY2UgeworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBhbiBlY2hvZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBTdHJpbmcgdG8gYmUgZWNob2VkLgorICAgICAqIEByZXR1cm4gZWNob2VkIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjdjOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLk1vbml0b3JpbmdGZWF0dXJlOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiB0byBjb25maWd1cmUgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8qIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUluamVjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgTXlJbmplY3Rpb24oZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBKQVgtUlMgcmVzb3VyY2UgY2xhc3NlcworICAgICAgICByZWdpc3RlcihBcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKFJlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmQobmV3IE15SW5qZWN0aW9uKCJubyB3YXkgQ0RJIHdvdWxkIGNoaW1lIGluIikpLnRvKE15SW5qZWN0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gSmVyc2V5IG1vbml0b3JpbmcKKyAgICAgICAgcmVnaXN0ZXIoTW9uaXRvcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUhrMlR5cGVzUHJvdmlkZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUhrMlR5cGVzUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJhZGYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015SGsyVHlwZXNQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyOworCisvKioKKyAqIFRlbGwgSmVyc2V5IENESSBleHRlbnNpb24gd2hhdCB0eXBlcyBzaG91bGQgYmUgYnJpZGdlZCBmcm9tIEhLMiB0byBDREkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE15SGsyVHlwZXNQcm92aWRlciBpbXBsZW1lbnRzIEhrMkN1c3RvbUJvdW5kVHlwZXNQcm92aWRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFR5cGU+IGdldEhrMlR5cGVzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8VHlwZT4oKSB7eworICAgICAgICAgICAgYWRkKE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24uY2xhc3MpOworICAgICAgICB9fTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdEVjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0RWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzI2YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdEVjaG8uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogUmVxdWVzdCBzcGVjaWZpYyBlY2hvIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U3BlY2lmaWMKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0RWNobyBpbXBsZW1lbnRzIEVjaG9TZXJ2aWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gIlJlcXVlc3Q6ICIgKyBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBjMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworCisvKioKKyAqIENESSBiYWNrZWQsIHJlcXVlc3Qgc2NvcGVkLCBKQVgtUlMgcmVzb3VyY2UgdG8gYmUgaW5qZWN0ZWQKKyAqIHZpYSBpdCdzIGNvbnN0cnVjdG9yIGZyb20gYm90aCBDREkgYW5kIEplcnNleSBISzIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK0BQYXRoKCJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIFJlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBFY2hvU2VydmljZSBlY2hvU2VydmljZTsKKworICAgIC8vIEplcnNleSBpbmplY3RlZAorICAgIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdDsKKyAgICBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnM7CisgICAgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzOworCisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0ZWQKKyAgICBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkOworCisgICAgLy8gdG8gbWFrZSB3ZWxkIGhhcHB5CisgICAgcHVibGljIFJlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIFJlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZShAUmVxdWVzdFNwZWNpZmljIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0LCBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHMsIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQpIHsKKworICAgICAgICB0aGlzLmVjaG9TZXJ2aWNlID0gZWNob1NlcnZpY2U7CisgICAgICAgIHRoaXMubWFwcGVycyA9IG1hcHBlcnM7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIHRoaXMuc3RhdHMgPSBzdGF0czsKKyAgICAgICAgdGhpcy5jdXN0b21JbmplY3RlZCA9IGN1c3RvbUluamVjdGVkOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzYyNjAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQ0RJIGJhY2tlZCwgcmVxdWVzdCBzY29wZWQsIEpBWC1SUyByZXNvdXJjZS4KKyAqIEl0J3MgZmllbGRzIGFyZSBpbmplY3RlZCBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgicmVxdWVzdC1maWVsZC1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBidWlsdC1pbiBDREkgYmVhbgorICAgIEBJbmplY3QKKyAgICBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcjsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBAUmVxdWVzdFNwZWNpZmljCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworICAgIEBJbmplY3QKKyAgICBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnM7CisgICAgQEluamVjdAorICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEN1c3RvbSBKZXJzZXkvSEsyIGluamVjdGVkCisgICAgQEluamVjdAorICAgIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBRdWVyeVBhcmFtKCJzIikgU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8ocyk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJwYXRoL3twYXJhbX0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UGF0aCh0cnVlKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1hcHBlcnMiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVycygpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlcnMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3RDb3VudCIpCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0aXN0aWNzUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihzdGF0cy5nZXQoKS5zbmFwc2hvdCgpLmdldFJlcXVlc3RTdGF0aXN0aWNzKCkuZ2V0VGltZVdpbmRvd1N0YXRpc3RpY3MoKS5nZXQoMEwpLmdldFJlcXVlc3RDb3VudCgpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20oKSB7CisgICAgICAgIHJldHVybiBjdXN0b21JbmplY3RlZC5nZXROYW1lKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJibSIpCisgICAgcHVibGljIFN0cmluZyBnZXRCbSgpIHsKKyAgICAgICAgcmV0dXJuIGJlYW5NYW5hZ2VyLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTcGVjaWZpYy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTcGVjaWZpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZjA0OGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNwZWNpZmljLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogUXVhbGlmaWVyIGZvciByZXF1ZXN0IHNwZWNpZmljIGVjaG8gc2VydmljZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitARG9jdW1lbnRlZAorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BRdWFsaWZpZXIKK3B1YmxpYyBAaW50ZXJmYWNlIFJlcXVlc3RTcGVjaWZpYyB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkMzVmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc3BpLkhrMkN1c3RvbUJvdW5kVHlwZXNQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzLk15SGsyVHlwZXNQcm92aWRlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2N2NhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgoreG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICB2ZXJzaW9uPSIzLjAiPgorICAgIDxlbnYtZW50cnk+CisgICAgICAgIDxlbnYtZW50cnktbmFtZT5pbmplY3RlZFJlc291cmNlPC9lbnYtZW50cnktbmFtZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3M2RkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgQ0RJIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMuCisgKiBSdW4gd2l0aDoKKyAqIDxwcmU+CisgKiBtdm4gY2xlYW4gcGFja2FnZQorICogJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IHRhcmdldC9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcAorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2RpVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21JbmplY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tSW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Nzg0MjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tSW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBjdXN0b20gSEsyIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEN1c3RvbUluamVjdGlvblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHF1ZXJ5IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ3VzdG9tSW5qZWN0aW9uVGVzdChTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgZm9yIG9uZSBubyBOUEUgaGFwcGVucyBvbiB0aGUgc2VydmVyIHNpZGUsCisgICAgICogYW5kIHRoZSBjdXN0b20gYm91bmQgaW5zdGFuY2UgZ2V0cyBpbmplY3RlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21IazJJbmplY3Rpb25OdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgiY3VzdG9tIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIm5vIHdheSBDREkgd291bGQgY2hpbWUgaW4iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0V4Y2VwdGlvbk1hcHBlcnNUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRXhjZXB0aW9uTWFwcGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDIwZGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0V4Y2VwdGlvbk1hcHBlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBleGNlcHRpb24gbWFwcGVyIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlcnNUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHJlc291cmNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIEV4Y2VwdGlvbk1hcHBlcnNUZXN0KFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBmb3Igb25lIG5vIE5QRSBoYXBwZW5zIG9uIHRoZSBzZXJ2ZXIgc2lkZSwgYW5kIGZvciB0d28KKyAgICAgKiB0aGUgaW5qZWN0ZWQgbWFwcGVycyByZW1haW5zIHRoZSBzYW1lIGFjcm9zcyByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBwZXJzTm90TnVsbCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2UpLnBhdGgoIm1hcHBlcnMiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgZmlyc3RSZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlyc3RSZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgU3RyaW5nIGZpcnN0VmFsdWUgPSBmaXJzdFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKGZpcnN0VmFsdWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTW9uaXRvcmluZ1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Nb25pdG9yaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjRiZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTW9uaXRvcmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBtb25pdG9yaW5nIHN0YXRpc3RpY3MgaW5qZWN0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTW9uaXRvcmluZ1Rlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHVyaSBvZiByZXNvdXJjZSB0byBiZSB0ZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIE1vbml0b3JpbmdUZXN0KFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBzZXZlcmFsIHJlcXVlc3RzIGFuZCBjaGVjayB0aGUgY291bnRlciBrZWVwcyBpbmNyZW1lbnRpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHVuZXhwZWN0ZWQgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RDb3VudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgicmVxdWVzdENvdW50Iik7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsgLy8gdGhpcyBpcyB0byBhbGxvdyBzdGF0aXN0aWNzIG9uIHRoZSBzZXJ2ZXIgc2lkZSB0byBnZXQgdXBkYXRlZAorICAgICAgICBpbnQgc3RhcnQgPSBJbnRlZ2VyLmRlY29kZSh0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsgLy8gdGhpcyBpcyB0byBhbGxvdyBzdGF0aXN0aWNzIG9uIHRoZSBzZXJ2ZXIgc2lkZSB0byBnZXQgdXBkYXRlZAorICAgICAgICAgICAgaW50IG5leHQgPSBJbnRlZ2VyLmRlY29kZSh0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoU3RyaW5nLmZvcm1hdCgidGVzdGluZyAlcyIsIHJlc291cmNlKSwgbmV4dCwgZXF1YWxUbyhzdGFydCArIGkpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2Vuc2l0aXZlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTZW5zaXRpdmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MTkwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2Vuc2l0aXZlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBpbmplY3Rpb24gb2YgcmVxdWVzdCBkZXBlbmRpbmcgaW5zdGFuY2VzIHdvcmtzIGFzIGV4cGVjdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNlbnNpdGl2ZVRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQiLCAiYWxwaGEiLCAiQXBwOiBhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIiwgImdvZ29sIiwgIkFwcDogZ29nb2wifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCIsICJlbGNhcm8iLCAiQXBwOiBlbGNhcm8ifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIiwgImFscGhhIiwgIkFwcDogYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIiwgImdvZ29sIiwgIkFwcDogZ29nb2wifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIiwgImVsY2FybyIsICJBcHA6IGVsY2FybyJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCIsICJhbHBoYSIsICJSZXF1ZXN0OiBhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCIsICJnb2dvbCIsICJSZXF1ZXN0OiBnb2dvbCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCIsICJvcmFjbGUiLCAiUmVxdWVzdDogb3JhY2xlIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQiLCAiYWxwaGEiLCAiUmVxdWVzdDogYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCIsICJnb2dvbCIsICJSZXF1ZXN0OiBnb2dvbCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIiwgIm9yYWNsZSIsICJSZXF1ZXN0OiBvcmFjbGUifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2UsIHN0cmFpZ2h0LCBlY2hvZWQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHVyaSBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgdGVzdGVkLgorICAgICAqIEBwYXJhbSBzdHJhaWdodCByZXF1ZXN0IHNwZWNpZmljIGlucHV0LgorICAgICAqIEBwYXJhbSBlY2hvZWQgQ0RJIGluamVjdGVkIHNlcnZpY2Ugc2hvdWxkIHByb2R1Y2UgdGhpcyBvdXQgb2YgcHJldmlvdXMsIHN0cmFpZ2h0LCBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RTZW5zaXRpdmVUZXN0KFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIHN0cmFpZ2h0LCBTdHJpbmcgZWNob2VkKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgdGhpcy5zdHJhaWdodCA9IHN0cmFpZ2h0OworICAgICAgICB0aGlzLmVjaG9lZCA9IGVjaG9lZDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDZGlJbmplY3Rpb24oKSB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucXVlcnlQYXJhbSgicyIsIHN0cmFpZ2h0KS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocywgZXF1YWxUbyhlY2hvZWQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIazJJbmplY3Rpb24oKSB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgicGF0aCIpLnBhdGgoc3RyYWlnaHQpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBlcXVhbFRvKFN0cmluZy5mb3JtYXQoIiVzL3BhdGgvJXMiLCByZXNvdXJjZSwgc3RyYWlnaHQpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NWY4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3BvbS54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+Y2xpZW50LWNvbm5lY3Rvci1wcm92aWRlcjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5DbGllbnQgQ29ubmVjdG9yIHByb3ZpZGVyIHRlc3Q8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC9jb25uZWN0b3IvcHJvdmlkZXIvQ3VzdG9tQ29ubmVjdG9yUHJvdmlkZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC1jb25uZWN0b3ItcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQvY29ubmVjdG9yL3Byb3ZpZGVyL0N1c3RvbUNvbm5lY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE0ZTcwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC1jb25uZWN0b3ItcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQvY29ubmVjdG9yL3Byb3ZpZGVyL0N1c3RvbUNvbm5lY3RvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5jbGllbnQuY29ubmVjdG9yLnByb3ZpZGVyOworCitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5pbnRlcm5hbC5IdHRwVXJsQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDdXN0b21Db25uZWN0b3JQcm92aWRlciBleHRlbmRzIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gaW52b2tlZCA9IGZhbHNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbm5lY3RvciBjcmVhdGVIdHRwVXJsQ29ubmVjdG9yKENsaWVudCBjbGllbnQsIENvbm5lY3Rpb25GYWN0b3J5IGNvbm5lY3Rpb25GYWN0b3J5LCBpbnQgY2h1bmtTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpeExlbmd0aFN0cmVhbWluZywgYm9vbGVhbiBzZXRNZXRob2RXb3JrYXJvdW5kKSB7CisKKyAgICAgICAgcmV0dXJuIG5ldyBIdHRwVXJsQ29ubmVjdG9yKAorICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uRmFjdG9yeSwKKyAgICAgICAgICAgICAgICBjaHVua1NpemUsCisgICAgICAgICAgICAgICAgZml4TGVuZ3RoU3RyZWFtaW5nLAorICAgICAgICAgICAgICAgIHNldE1ldGhvZFdvcmthcm91bmQpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWN1cmVDb25uZWN0aW9uKEplcnNleUNsaWVudCBjbGllbnQsIEh0dHBVUkxDb25uZWN0aW9uIHVjKSB7CisgICAgICAgICAgICAgICAgaW52b2tlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC9jb25uZWN0b3IvcHJvdmlkZXIvVGVzdFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50L2Nvbm5lY3Rvci9wcm92aWRlci9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQxYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC9jb25uZWN0b3IvcHJvdmlkZXIvVGVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5jbGllbnQuY29ubmVjdG9yLnByb3ZpZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInRlc3QiKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAidGVzdCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlciBiL3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC1jb25uZWN0b3ItcHJvdmlkZXIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiYjk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC1jb25uZWN0b3ItcHJvdmlkZXIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uY2xpZW50LmNvbm5lY3Rvci5wcm92aWRlci5DdXN0b21Db25uZWN0b3JQcm92aWRlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC9jb25uZWN0b3IvcHJvdmlkZXIvQ3VzdG9tQ29ubmVjdG9yUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50L2Nvbm5lY3Rvci9wcm92aWRlci9DdXN0b21Db25uZWN0b3JQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzRkYWYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC9jb25uZWN0b3IvcHJvdmlkZXIvQ3VzdG9tQ29ubmVjdG9yUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5jbGllbnQuY29ubmVjdG9yLnByb3ZpZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tQ29ubmVjdG9yUHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52b2tlZCgpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ3VzdG9tQ29ubmVjdG9yUHJvdmlkZXIuaW52b2tlZCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShDdXN0b21Db25uZWN0b3JQcm92aWRlci5pbnZva2VkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2Vhci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9lYXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTE4M2NiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9lYXIvcG9tLnhtbApAQCAtMCwwICsxLDg1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtZWFyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+ZWFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtZWFyPC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8ZGVmYXVsdExpYkJ1bmRsZURpcj5BUFAtSU5GL2xpYjwvZGVmYXVsdExpYkJ1bmRsZURpcj4KKyAgICAgICAgICAgICAgICAgICAgPG1vZHVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8d2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvd2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtcmVsb2FkLXdhcjI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3dlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlamJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VqYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgPC9tb2R1bGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtcmVsb2FkLXdhcjE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5lamI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGQyOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9wb20ueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC1saWI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tZWpiLW11bHRpbW9kdWxlLXJlbG9hZC1saWI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvQ29udGFpbmVyTGlzdGVuZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvQ29udGFpbmVyTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWRlOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL2xpYi9Db250YWluZXJMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLnJlbG9hZC5saWI7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVqYi5TaW5nbGV0b247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSB0aGF0IGtlZXBzIG51bWJlciBvZiByZWxvYWRzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIENvbnRhaW5lckxpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisKKyAgICBARUpCIEVqYlJlbG9hZGVyU2VydmljZSByZWxvYWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cChmaW5hbCBDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIHJlbG9hZGVyLnNldENvbnRhaW5lcihjb250YWluZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvRWpiUmVsb2FkZXJTZXJ2aWNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvbGliL0VqYlJlbG9hZGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTVjYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvbGliL0VqYlJlbG9hZGVyU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLnJlbG9hZC5saWI7CisKK2ltcG9ydCBqYXZheC5lamIuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworCisvKioKKyAqIFNpbmdsZXRvbiBFSkIgYmVhbiB0aGF0IGlzIHVzZWQgdG8gcmVsb2FkIHRoZSBmaXJzdCB3ZWIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEVqYlJlbG9hZGVyU2VydmljZSB7CisKKyAgICBDb250YWluZXIgY29udGFpbmVyOworCisgICAgcHVibGljIHZvaWQgcmVsb2FkKCkgeworICAgICAgICBjb250YWluZXIucmVsb2FkKG5ld0FwcCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHJlc291cmNlIGNvbmZpZyB0aGF0IGNvbnRhaW5zIHtAbGluayBSZWxvYWREZXRlY3Rpb25SZXNvdXJjZX0gc2luZ2xldG9uCisgICAgICogd2l0aCBjdXJyZW50IG5hbm8gdGltZSwgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHdoZW4gdGhlIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgcmVzb3VyY2UgY29uZmlnLgorICAgICAqLworICAgIHByaXZhdGUgUmVzb3VyY2VDb25maWcgbmV3QXBwKCkgeworCisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc3VsdCA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByZXN1bHQucmVnaXN0ZXIoUmVsb2FkRGV0ZWN0aW9uUmVzb3VyY2UuY3JlYXRlTmV3SW5zdGFuY2UoKSk7CisgICAgICAgIHJlc3VsdC5yZWdpc3RlcihDb250YWluZXJMaXN0ZW5lci5jbGFzcyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250YWluZXIgdG8gYmUgcmVsb2FkZWQuIEludm9rZWQgZnJvbSB7QGxpbmsgQ29udGFpbmVyTGlzdGVuZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRhaW5lciB0byBiZSByZWxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvbGliL1JlbG9hZERldGVjdGlvblJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvbGliL1JlbG9hZERldGVjdGlvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjYmY1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvUmVsb2FkRGV0ZWN0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5yZWxvYWQubGliOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSByZWdpc3RlcmVkIGFzIGEgc2luZ2xldG9uCisgKiBhbGxvd3MgdG8gZGV0ZWN0IHdoZW4gYXBwbGljYXRpb24gZ290IGluaXRpYXRlZCBhcyB0aGUgdmFsdWUKKyAqIHJldHVybmVkIGZyb20gaXRzIGdldE5hbm8gcmVzb3VyY2UgbWV0aG9kCisgKiB3aWxsIGdldCBhZGp1c3RlZCB3aXRoIGVhY2ggcmVsb2FkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJsYXN0LWluaXQtbmFuby10aW1lIikKK3B1YmxpYyBjbGFzcyBSZWxvYWREZXRlY3Rpb25SZXNvdXJjZSB7CisKKyAgICBmaW5hbCBsb25nIG5zID0gU3lzdGVtLm5hbm9UaW1lKCk7CisKKyAgICBwcml2YXRlIFJlbG9hZERldGVjdGlvblJlc291cmNlKCkgeworICAgICAgICAvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBvbmx5IG1lYW4gaG93IHRvIGdldCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldyByZWxvYWQgZGV0ZWN0aW9uIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVsb2FkRGV0ZWN0aW9uUmVzb3VyY2UgY3JlYXRlTmV3SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVsb2FkRGV0ZWN0aW9uUmVzb3VyY2UoKTsKKyAgICB9CisKKworICAgIEBHRVQKKyAgICBwdWJsaWMgbG9uZyBnZXROYW5vKCkgeworICAgICAgICByZXR1cm4gbnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL2xpYi9SZWxvYWRlclJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvbGliL1JlbG9hZGVyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjJjZTZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL2xpYi9SZWxvYWRlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLmxpYjsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgdXNlZCB0byByZWxvYWQgdGhlIGZpcnN0IGFwcGxpY2F0aW9uLgorICogVGhpcyByZXNvdXJjZSBpcyBvbmx5IHJlZ2lzdGVyZWQgaW5zaWRlIHRoZSBzZWNvbmQgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlbGVzcworQFBhdGgoInJlbG9hZCIpCitwdWJsaWMgY2xhc3MgUmVsb2FkZXJSZXNvdXJjZSB7CisKKyAgICBARUpCIEVqYlJlbG9hZGVyU2VydmljZSBlamJSZWxvYWRlclNlcnZpY2U7CisKKyAgICBAR0VUCisgICAgcHVibGljIHZvaWQgcmVsb2FkVGhlT3RoZXJBcHAoKSB7CisgICAgICAgIGVqYlJlbG9hZGVyU2VydmljZS5yZWxvYWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ2ZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZDQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvcG9tLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1lamItbXVsdGltb2R1bGUtcmVsb2FkPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBFSkIgTXVsdGktTW9kdWxlIFJlbG9hZAorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5lYXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5saWI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT53YXIxPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+d2FyMjwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwZTY1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMS9wb20ueG1sCkBAIC0wLDAgKzEsMTIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1lamItbXVsdGltb2R1bGUtcmVsb2FkLXdhcjE8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBUZXN0c308L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke3Rlc3RDb250YWluZXJGYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke3Rlc3RDb250YWluZXJQb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIxL0ZpcnN0QXBwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL3dlYjEvRmlyc3RBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjRkNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIxL0ZpcnN0QXBwLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLndlYjE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLmxpYi5Db250YWluZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLmxpYi5SZWxvYWREZXRlY3Rpb25SZXNvdXJjZTsKKworLyoqCisgKiBJbml0aWFsIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIGZpcnN0IHdlYiBhcHBsaWNhdGlvbi4KKyAqIFRoaXMgb25lIHdpbGwgZ2V0IHJlbG9hZGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIEZpcnN0QXBwIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxPYmplY3Q+IFNJTkdMRVRPTlMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCkge3sKKyAgICAgICAgYWRkKFJlbG9hZERldGVjdGlvblJlc291cmNlLmNyZWF0ZU5ld0luc3RhbmNlKCkpOworICAgIH19OworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgIGFkZChDb250YWluZXJMaXN0ZW5lci5jbGFzcyk7CisgICAgfX07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgcmV0dXJuIFNJTkdMRVRPTlM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIxL1JlbG9hZFRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvd2ViMS9SZWxvYWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4NTRiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvd2ViMS9SZWxvYWRUZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLndlYjE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgcmVsb2FkIGZ1bmN0aW9uYWxpdHkgZm9yIHR3byB3ZWIgYXBwIHRlc3QgY2FzZS4KKyAqIFJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgLi4vZWFyL3RhcmdldC9lamItbXVsdGltb2R1bGUtcmVsb2FkLWVhci0qLmVhcgorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVsb2FkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaXJzdEFwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsb2FkKCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBuYW5vc1RhcmdldCA9IHRhcmdldCgpLnBhdGgoImVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMS9sYXN0LWluaXQtbmFuby10aW1lIik7CisKKyAgICAgICAgZmluYWwgbG9uZyBuYW5vczEgPSBfcmVhZEluaXRUaW1lTmFub3MobmFub3NUYXJnZXQpOworICAgICAgICBmaW5hbCBsb25nIG5hbm9zMiA9IF9yZWFkSW5pdFRpbWVOYW5vcyhuYW5vc1RhcmdldCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChuYW5vczIsIGlzKGVxdWFsVG8obmFub3MxKSkpOworCisgICAgICAgIC8vIEotNTkyIHJlcHJvZHVjZXI6CisKKy8vICAgICAgICByZWxvYWQoKTsKKy8vCisvLyAgICAgICAgZmluYWwgbG9uZyBuYW5vczMgPSBfcmVhZEluaXRUaW1lTmFub3MobmFub3NUYXJnZXQpOworLy8gICAgICAgIGZpbmFsIGxvbmcgbmFub3M0ID0gX3JlYWRJbml0VGltZU5hbm9zKG5hbm9zVGFyZ2V0KTsKKy8vCisvLyAgICAgICAgYXNzZXJ0VGhhdChuYW5vczQsIGlzKGVxdWFsVG8obmFub3MzKSkpOworLy8gICAgICAgIGFzc2VydFRoYXQobmFub3MzLCBpcyhncmVhdGVyVGhhbihuYW5vczIpKSk7CisvLworLy8gICAgICAgIHJlbG9hZCgpOworLy8KKy8vICAgICAgICBmaW5hbCBsb25nIG5hbm9zNSA9IF9yZWFkSW5pdFRpbWVOYW5vcyhuYW5vc1RhcmdldCk7CisvLyAgICAgICAgZmluYWwgbG9uZyBuYW5vczYgPSBfcmVhZEluaXRUaW1lTmFub3MobmFub3NUYXJnZXQpOworLy8KKy8vICAgICAgICBhc3NlcnRUaGF0KG5hbm9zNiwgaXMoZXF1YWxUbyhuYW5vczUpKSk7CisvLyAgICAgICAgYXNzZXJ0VGhhdChuYW5vczUsIGlzKGdyZWF0ZXJUaGFuKG5hbm9zNCkpKTsKKworICAgICAgICAvLyBFTkQ6IEotNTkyIHJlcHJvZHVjZXIKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVsb2FkKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVsb2FkVGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiZWpiLW11bHRpbW9kdWxlLXJlbG9hZC13YXIyL3JlbG9hZCIpOworICAgICAgICBhc3NlcnRUaGF0KHJlbG9hZFRhcmdldC5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGlzKDIwNCkpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBfcmVhZEluaXRUaW1lTmFub3MoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyhyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzYmYyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9wb20ueG1sCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1lamItbXVsdGltb2R1bGUtcmVsb2FkLXdhcjI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvd2ViMi9TZWNvbmRBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvd2ViMi9TZWNvbmRBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQyMzA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIyL1NlY29uZEFwcC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLnJlbG9hZC53ZWIyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLnJlbG9hZC5saWIuUmVsb2FkZXJSZXNvdXJjZTsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZnJvbSB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcmVsb2FkCisgKiB0aGUgb3RoZXIgb25lLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFNlY29uZEFwcCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgYWRkKFJlbG9hZGVyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9fTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL3dlYjIvSmF4UnNGcm9tRWpiTGlicmFyeVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvd2ViMi9KYXhSc0Zyb21FamJMaWJyYXJ5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzMyZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL3dlYjIvSmF4UnNGcm9tRWpiTGlicmFyeVRlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLndlYjI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmdyZWF0ZXJUaGFuOworCisvKioKKyAqIFRlc3QgZm9yIEVKQiB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLiBUaGUgSkFYLVJTIHJlc291cmNlcyBjb21lIGZyb20gYnVuZGxlZCBFSkIgbGlicmFyeSBqYXIuCisgKiBSdW4gd2l0aDoKKyAqIDxwcmU+CisgKiBtdm4gY2xlYW4gcGFja2FnZQorICogJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IC4uL2Vhci90YXJnZXQvZWpiLW11bHRpbW9kdWxlLWVhci0qLmVhcgorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzRnJvbUVqYkxpYnJhcnlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFNlY29uZEFwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImVqYi1tdWx0aW1vZHVsZS13YXIiKS5wYXRoKCJyZXNvdXJjZXMiKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdENvdW50R2V0c0luY3JlbWVudGVkKCkgeworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50MSA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgiY291bnRlciIpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50MiA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgiY291bnRlciIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQyLCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQxKSkpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQzID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJzdGF0ZWxlc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50MywgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50MikpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50NCA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgic3RhdGVsZXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDQsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDMpKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDUgPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoInN0YXRlZnVsIikucGF0aCgiY291bnQiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50NSwgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50NCkpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50NiA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgic3RhdGVmdWwiKS5wYXRoKCJjb3VudCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQ2LCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQ1KSkpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQ3ID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJ3YXItc3RhdGVsZXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDcsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDYpKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDggPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoIndhci1zdGF0ZWxlc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50OCwgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50NykpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBfbmV4dENvdW50KGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUluZm9JbmplY3Rpb24oKSB7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJjb3VudGVyIikucGF0aCgib25lIiksICJjb3VudGVyL29uZSIpOworICAgICAgICBfdGVzdFBhdGgodGFyZ2V0KCkucGF0aCgiY291bnRlciIpLnBhdGgoInR3byIpLCAiY291bnRlci90d28iKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCgpLnBhdGgoInN0YXRlbGVzcyIpLnBhdGgoInRocmVlIiksICJzdGF0ZWxlc3MvdGhyZWUiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCgpLnBhdGgoInN0YXRlbGVzcyIpLnBhdGgoImZvdXIiKSwgInN0YXRlbGVzcy9mb3VyIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJ3YXItc3RhdGVsZXNzIikucGF0aCgiZml2ZSIpLCAid2FyLXN0YXRlbGVzcy9maXZlIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJ3YXItc3RhdGVsZXNzIikucGF0aCgic2l4IiksICJ3YXItc3RhdGVsZXNzL3NpeCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFBhdGgoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKGV4cGVjdGVkUmVzdWx0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2Vhci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2Vhci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MmYxM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvZWFyL3BvbS54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtZWFyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+ZWFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWVqYi1tdWx0aW1vZHVsZS1lYXI8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZWZhdWx0TGliQnVuZGxlRGlyPkFQUC1JTkYvbGliPC9kZWZhdWx0TGliQnVuZGxlRGlyPgorICAgICAgICAgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXdhcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvd2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVqYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lamJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgIDwvbW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXdhcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPmVqYjwvdHlwZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2Vhci9zcmMvbWFpbi9hcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9lYXIvc3JjL21haW4vYXBwbGljYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0OTliYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9lYXIvc3JjL21haW4vYXBwbGljYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSwyIEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2xpYi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2xpYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNmVhZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvbGliL3BvbS54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtbGliPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWVqYi1tdWx0aW1vZHVsZS1saWI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvbGliL0VqYkNvdW50ZXJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9saWIvRWpiQ291bnRlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmY2YyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvbGliL0VqYkNvdW50ZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLmxpYjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgamF2YXguZWpiLlNpbmdsZXRvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogU2luZ2xldG9uIEVKQiBjb3VudGVyIGJlYW4gYXMgYSBKQVgtUlMgcmVzb3VyY2UuCisgKiBUaGUgYmVhbiBpcyBmb3Igb25lIHB1Ymxpc2hlZCBhcyBhIHN0YW5kYWxvbmUgSkFYLVJTIHJlc291cmNlCisgKiBhbmQgZm9yIHR3byB1c2VkIHRvIGluamVjdCBvdGhlciBFSkIgYmFzZWQgSkFYLVJTIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitAUGF0aCgiY291bnRlciIpCitwdWJsaWMgY2xhc3MgRWpiQ291bnRlclJlc291cmNlIHsKKworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICBAQ29udGV4dCBVcmlJbmZvIHVpOworCisgICAgQEdFVAorICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgIH0KKworICAgIEBQYXRoKCJ7dWl9IikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRVaSgpIHsKKyAgICAgICAgcmV0dXJuIHVpICE9IG51bGwgPyB1aS5nZXRQYXRoKCkgOiAiVXJpSW5mbyBpcyBudWxsIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL2xpYi9TdGF0ZWZ1bFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL2xpYi9TdGF0ZWZ1bFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1MGMyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvbGliL1N0YXRlZnVsUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5saWI7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWZ1bDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBiYWNrZWQgd2l0aCBhIHN0YXRlZnVsIEVKQiBiZWFuLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWZ1bAorQFBhdGgoInN0YXRlZnVsIikKK3B1YmxpYyBjbGFzcyBTdGF0ZWZ1bFJlc291cmNlIHsKKworICAgIEBFSkIgRWpiQ291bnRlclJlc291cmNlIGNvdW50ZXI7CisKKyAgICBAR0VUCisgICAgQFBhdGgoImNvdW50IikKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnRlci5nZXRDb3VudCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvbGliL1N0YXRlbGVzc1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL2xpYi9TdGF0ZWxlc3NSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDkwOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL2xpYi9TdGF0ZWxlc3NSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLmxpYjsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBiYWNrZWQgYnkgYSBzdGF0ZWxlc3MgRUpCIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlbGVzcworQFBhdGgoInN0YXRlbGVzcyIpCitwdWJsaWMgY2xhc3MgU3RhdGVsZXNzUmVzb3VyY2UgeworCisgICAgQEVKQiBFamJDb3VudGVyUmVzb3VyY2UgY291bnRlcjsKKyAgICBAQ29udGV4dCBVcmlJbmZvIHVyaUluZm87CisKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuZ2V0Q291bnQoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInt1cmlJbmZvfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gdXJpSW5mbyAhPSBudWxsID8gdXJpSW5mby5nZXRQYXRoKCkgOiAidXJpIGluZm8gaXMgbnVsbCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGEzOWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3BvbS54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1lamItbXVsdGltb2R1bGU8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEVKQiBNdWx0aS1Nb2R1bGUKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+ZWFyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bGliPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+d2FyPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDBiNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3BvbS54bWwKQEAgLTAsMCArMSwxMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXdhcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1lamItbXVsdGltb2R1bGUtd2FyPC9uYW1lPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICAgICAgICAgICAgICA8IS0tYXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPENsYXNzLVBhdGg+ZWpiLWxpYi0ke3Byb2plY3QudmVyc2lvbn0uamFyPC9DbGFzcy1QYXRoPgorICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmUtLT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnN0YWxsLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3dlYjEvSmF4UnNDb25maWd1cmF0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3dlYjEvSmF4UnNDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhYjRjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvd2ViMS9KYXhSc0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi53ZWIxOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLmxpYi5FamJDb3VudGVyUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLmxpYi5TdGF0ZWZ1bFJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5saWIuU3RhdGVsZXNzUmVzb3VyY2U7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gdGhhdCBpbmNsdWRlcyBvbmx5CisgKiB0aG9zZSBKQVgtUlMgY29tcG9uZW50cyBpbXBvcnRlZCBmcm9tIEVKQiBsaWJyYXJ5IGphci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJyZXNvdXJjZXMiKQorcHVibGljIGNsYXNzIEpheFJzQ29uZmlndXJhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgYWRkKEVqYkNvdW50ZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoU3RhdGVsZXNzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKFN0YXRlZnVsUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKFdhclN0YXRlbGVzc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfX07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi93ZWIxL1dhclN0YXRlbGVzc1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3dlYjEvV2FyU3RhdGVsZXNzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDg1MzlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi93ZWIxL1dhclN0YXRlbGVzc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIud2ViMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIubGliLkVqYkNvdW50ZXJSZXNvdXJjZTsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgYmFja2VkIGJ5IGEgc3RhdGVsZXNzIEVKQiBiZWFuIHBsYWNlZCBpbiBXQVIgbW9kdWxlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitAUGF0aCgid2FyLXN0YXRlbGVzcyIpCitwdWJsaWMgY2xhc3MgV2FyU3RhdGVsZXNzUmVzb3VyY2UgeworCisgICAgQEVKQiBFamJDb3VudGVyUmVzb3VyY2UgY291bnRlcjsKKyAgICBAQ29udGV4dCBVcmlJbmZvIHVyaUluZm87CisKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuZ2V0Q291bnQoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInt1cmlJbmZvfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gdXJpSW5mbyAhPSBudWxsID8gdXJpSW5mby5nZXRQYXRoKCkgOiAidXJpIGluZm8gaXMgbnVsbCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzAyZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKQEAgLTAsMCArMSwzMSBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgICAgICAgPHRpdGxlPkpTUCBQYWdlPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgICAgIDxoMT5IZWxsbyBXb3JsZCE8L2gxPgorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS93YXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvd2ViMS9KYXhSc0Zyb21FamJMaWJyYXJ5VGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi93ZWIxL0pheFJzRnJvbUVqYkxpYnJhcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViNmFhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS93YXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvd2ViMS9KYXhSc0Zyb21FamJMaWJyYXJ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi53ZWIxOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ncmVhdGVyVGhhbjsKKworLyoqCisgKiBUZXN0IGZvciBFSkIgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlcy4gVGhlIEpBWC1SUyByZXNvdXJjZXMgY29tZSBmcm9tIGJ1bmRsZWQgRUpCIGxpYnJhcnkgamFyLgorICogUnVuIHdpdGg6CisgKiA8cHJlPgorICogbXZuIGNsZWFuIHBhY2thZ2UKKyAqICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSAuLi9lYXIvdGFyZ2V0L2VqYi1tdWx0aW1vZHVsZS1lYXItKi5lYXIKKyAqIG12biAtRHNraXBUZXN0cz1mYWxzZSB0ZXN0PC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0Zyb21FamJMaWJyYXJ5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0NvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJlamItbXVsdGltb2R1bGUtd2FyIikucGF0aCgicmVzb3VyY2VzIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RDb3VudEdldHNJbmNyZW1lbnRlZCgpIHsKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDEgPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoImNvdW50ZXIiKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDIgPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoImNvdW50ZXIiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50MiwgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50MSkpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50MyA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgic3RhdGVsZXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDMsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDIpKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDQgPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoInN0YXRlbGVzcyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQ0LCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQzKSkpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQ1ID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJzdGF0ZWZ1bCIpLnBhdGgoImNvdW50IikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDUsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDQpKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDYgPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoInN0YXRlZnVsIikucGF0aCgiY291bnQiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50NiwgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50NSkpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50NyA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgid2FyLXN0YXRlbGVzcyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQ3LCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQ2KSkpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQ4ID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJ3YXItc3RhdGVsZXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDgsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDcpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgX25leHRDb3VudChmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlJbmZvSW5qZWN0aW9uKCkgeworICAgICAgICBfdGVzdFBhdGgodGFyZ2V0KCkucGF0aCgiY291bnRlciIpLnBhdGgoIm9uZSIpLCAiY291bnRlci9vbmUiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCgpLnBhdGgoImNvdW50ZXIiKS5wYXRoKCJ0d28iKSwgImNvdW50ZXIvdHdvIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJzdGF0ZWxlc3MiKS5wYXRoKCJ0aHJlZSIpLCAic3RhdGVsZXNzL3RocmVlIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJzdGF0ZWxlc3MiKS5wYXRoKCJmb3VyIiksICJzdGF0ZWxlc3MvZm91ciIpOworICAgICAgICBfdGVzdFBhdGgodGFyZ2V0KCkucGF0aCgid2FyLXN0YXRlbGVzcyIpLnBhdGgoImZpdmUiKSwgIndhci1zdGF0ZWxlc3MvZml2ZSIpOworICAgICAgICBfdGVzdFBhdGgodGFyZ2V0KCkucGF0aCgid2FyLXN0YXRlbGVzcyIpLnBhdGgoInNpeCIpLCAid2FyLXN0YXRlbGVzcy9zaXgiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RQYXRoKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQsIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc3VsdCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhleHBlY3RlZFJlc3VsdCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhNjlmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsOTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZWpiLXRlc3Qtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWVqYi13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEVKQiB0ZXN0IHdlYiBhcHBsaWNhdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuMS1iMDc8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lamI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lamItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0FwcFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0FwcFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwM2QxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQXBwUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogVGVzdCByZXNvdXJjZSB0aGF0IGV4cG9zZXMgY291bnRlciBmcm9tIHRoZSBKQVgtUlMgYXBwbGljYXRpb24gc3ViY2xhc3MuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlbGVzcworQFBhdGgoImFwcCIpCitwdWJsaWMgY2xhc3MgQXBwUmVzb3VyY2UgeworCisgICAgQEVKQiBNeUFwcGxpY2F0aW9uIGFwcDsKKworICAgIEBQYXRoKCJjb3VudCIpCisgICAgQEdFVAorICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBhcHAuaW5jcmVtZW50QW5kR2V0Q291bnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0FzeW5jUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQXN5bmNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzY3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0FzeW5jUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKKworLyoqCisgKiBAYXV0aG9yIEphbiBBbGdlcm1pc3NlbgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUGF0aCgiYXN5bmMtdGVzdCIpCitwdWJsaWMgY2xhc3MgQXN5bmNSZXNvdXJjZSB7CisKKyAgICBARUpCCisgICAgQXN5bmNTZXJ2aWNlIGFzeW5jU2VydmljZTsKKworICAgIEBHRVQKKyAgICBAUGF0aCgic3luYyIpCisgICAgcHVibGljIFN0cmluZyBzeW5jaHJvbm91c0dldCgpIHsKKyAgICAgICAgcmV0dXJuICJzeW5jIjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImFzeW5jIikKKyAgICBwdWJsaWMgdm9pZCBhc3luY2hyb25vdXNHZXQoQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFyKSB7CisgICAgICAgIGFzeW5jU2VydmljZS5nZXRBc3luYyhhcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9Bc3luY1NlcnZpY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQXN5bmNTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhMWFjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQXN5bmNTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguZWpiLkFzeW5jaHJvbm91czsKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworCisvKioKKyAqIEBhdXRob3IgSmFuIEFsZ2VybWlzc2VuCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BTdGF0ZWxlc3MKK3B1YmxpYyBjbGFzcyBBc3luY1NlcnZpY2UgeworICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFzeW5jU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQEFzeW5jaHJvbm91cworICAgIHB1YmxpYyB2b2lkIGdldEFzeW5jKEFzeW5jUmVzcG9uc2UgYXIpIHsKKyAgICAgICAgYXIucmVzdW1lKCJhc3luYyIpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9Db3VudGVyQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9Db3VudGVyQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDNlNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0NvdW50ZXJCZWFuLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YXguZWpiLlNpbmdsZXRvbjsKKworLyoqCisgKiBFSkIgc2luZ2xldG9uIHV0aWxpemVkIGFzIHJlcXVlc3QgY291bnRlciBpbiB0aGlzIHRlc3QgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIENvdW50ZXJCZWFuIHsKKworICAgIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICBwdWJsaWMgaW50IGluY3JlbWVudEFuZEdldCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9Db3VudGVyRmlsdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0NvdW50ZXJGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjdlZGM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9Db3VudGVyRmlsdGVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogUmVzcG9uc2UgZmlsdGVyIGltcGxlbWVudGVkIGFzIEVKQiBiZWFuLiBUaGUgZmlsdGVyIGFkZHMgUmVxdWVzdC1Db3VudCByZXNwb25zZSBoZWFkZXIgdG8gZWFjaCByZXNwb25zZS4KKyAqIEFub3RoZXIgRUpCIHNpbmdsZXRvbiBiZWFuLCBDb3VudGVyQmVhbiwgaXMgaW5qZWN0ZWQgdGhhdCBob2xkcyB0aGUgYWN0dWFsIHJlcXVlc3QgY291bnQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAU3RhdGVsZXNzCitwdWJsaWMgY2xhc3MgQ291bnRlckZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUmVxdWVzdENvdW50SEVBREVSID0gIlJlcXVlc3QtQ291bnQiOworCisgICAgQEVKQiBDb3VudGVyQmVhbiBjb3VudGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZChSZXF1ZXN0Q291bnRIRUFERVIsIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQ3VzdG9tQmFzZUV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9DdXN0b21CYXNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhNmVkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQ3VzdG9tQmFzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworLyoqCisgKiBDdXN0b20gZXhjZXB0aW9uLiBQYXJ0IG9mIEpFUlNFWS0yMzIwIHJlcHJvZHVjZXIuCisgKiBUaGlzIG9uZSBzZXJ2ZXMgYXMgYSBiYXNlIGZvciBvdGhlciBleGNlcHRpb25zCisgKiBtYXBwZWQgYnkge0BsaW5rIEVqYkV4Y2VwdGlvbk1hcHBlck9uZX0gYW5kIHtAbGluayBFamJFeGNlcHRpb25NYXBwZXJUd299LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21CYXNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQ3VzdG9tRXhjZXB0aW9uT25lLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0N1c3RvbUV4Y2VwdGlvbk9uZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzFiNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0N1c3RvbUV4Y2VwdGlvbk9uZS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworLyoqCisgKiBDdXN0b20gZXhjZXB0aW9uLiBQYXJ0IG9mIEpFUlNFWS0yMzIwIHJlcHJvZHVjZXIuCisgKiBUaGlzIG9uZSBnZXRzIG1hcHBlZCBieSB7QGxpbmsgRWpiRXhjZXB0aW9uTWFwcGVyT25lfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tRXhjZXB0aW9uT25lIGV4dGVuZHMgQ3VzdG9tQmFzZUV4Y2VwdGlvbiB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0N1c3RvbUV4Y2VwdGlvblR3by5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9DdXN0b21FeGNlcHRpb25Ud28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFkYmRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9DdXN0b21FeGNlcHRpb25Ud28uamF2YQpAQCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKKy8qKgorICogQ3VzdG9tIGV4Y2VwdGlvbi4gUGFydCBvZiBKRVJTRVktMjMyMCByZXByb2R1Y2VyLgorICogVGhpcyBvbmUgZ2V0cyBtYXBwZWQgYnkge0BsaW5rIEVqYkV4Y2VwdGlvbk1hcHBlclR3b30uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUV4Y2VwdGlvblR3byBleHRlbmRzIEN1c3RvbUJhc2VFeGNlcHRpb24geworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FY2hvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTU0NGJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FY2hvLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLlJlbW90ZTsKKworLyoqCisgKiBFSkIgcmVtb3RlIGludGVyZmFjZS4gUGFydCBvZiB0aGUgcmVwcm9kdWNlciBmb3IgR0xBU1NGSVNILTE2MTk5LgorICogU2VlIGFsc28gdGhlIG90aGVyIHRlc3QgY2FzZSBpbXBsZW1lbnRlZCBieSB7QGxpbmsgUmF3RWNob1Jlc291cmNlfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVtb3RlCitwdWJsaWMgaW50ZXJmYWNlICBFY2hvIHsKKworICAgIFN0cmluZyBlY2hvKFN0cmluZyBtZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWNob0JlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWNob0JlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzYzZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FY2hvQmVhbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWZ1bDsKKworLyoqCisgKiBTZXNzaW9uIGJlYW4gY2FwYWJsZSBvZiByZXR1cm5pbmcgYW4gZWNob2VkIG1lc3NhZ2UgYmFjay4KKyAqIFRoaXMgaXMgdG8gcHJvdmUgRUpCIGNvbnRhaW5lciBpcyB1c2VkIGluIHtAbGluayBFY2hvUmVzb3VyY2V9CisgKiBhbmQge0BsaW5rIFJhd0VjaG9SZXNvdXJjZX0gcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWZ1bAorcHVibGljIGNsYXNzIEVjaG9CZWFuIHsKKworICAgIC8qKgorICAgICAqIFByZWZpeCwge0B2YWx1ZX0sIHRvIGJlIGF0dGFjaGVkIHRvIGVhY2ggbWVzc2FnZSBwcm9jZXNzZWQgYnkgdGhpcyBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJFQ0hPRUQ6ICI7CisKKyAgICAvKioKKyAgICAgKiBFY2hvIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0byBiZSBlY2hvZWQuCisgICAgICogQHJldHVybiBpbmNvbWluZyBtZXNzYWdlIHByZWZpeGVkIHdpdGgge0BsaW5rICNQUkVGSVh9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZWNobyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMlcyIsIFBSRUZJWCwgbWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FY2hvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWNob1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNGUzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWNob1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKK2ltcG9ydCBqYXZheC5lamIuTG9jYWw7CitpbXBvcnQgamF2YXguZWpiLlJlbW90ZTsKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgYmVhbiBiYWNrZWQgYnkgYW4gRUpCIHNlc3Npb24gYmVhbgorICogaW1wbGVtZW50aW5nIEVKQiBpbnRlcmZhY2UgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aCBib3RoIHtAbGluayBMb2NhbH0KKyAqIGFuZCB7QGxpbmsgUmVtb3RlfSBhbm5vdGF0aW9ucy4KKyAqIFJlcHJvZHVjaWJsZSB0ZXN0IGNhc2UgZm9yIEdMQVNTRklTSC0xNjE5OS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitAUGF0aCgiZWNobyIpCitwdWJsaWMgY2xhc3MgRWNob1Jlc291cmNlIGltcGxlbWVudHMgRWNobyB7CisKKyAgICBARUpCIEVjaG9CZWFuIGVjaG9TZXJ2aWNlOworCisgICAgQEdFVAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgibWVzc2FnZSIpIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKG1lc3NhZ2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWpiRXhjZXB0aW9uTWFwcGVyQmFzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJFeGNlcHRpb25NYXBwZXJCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1ZDQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWpiRXhjZXB0aW9uTWFwcGVyQmFzZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKKy8qKgorICogSkVSU0VZLTIzMjAgcmVwcm9kdWNlci4ge0BsaW5rIEN1c3RvbUJhc2VFeGNlcHRpb259IHdpbGwgZ2V0IG1hcHBlZAorICogdG8gYW4gb3JkaW5hcnkgcmVzcG9uc2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVqYkV4Y2VwdGlvbk1hcHBlckJhc2U8VCBleHRlbmRzIEN1c3RvbUJhc2VFeGNlcHRpb24+IGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFQ+IHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWpiRXhjZXB0aW9uTWFwcGVyT25lLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VqYkV4Y2VwdGlvbk1hcHBlck9uZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOWE1NTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VqYkV4Y2VwdGlvbk1hcHBlck9uZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlNpbmdsZXRvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworLyoqCisgKiBKRVJTRVktMjMyMCByZXByb2R1Y2VyLiB7QGxpbmsgQ3VzdG9tRXhjZXB0aW9uT25lfSB3aWxsIGdldCBtYXBwZWQKKyAqIHRvIGFuIG9yZGluYXJ5IHJlc3BvbnNlLiBXZSBtYWtlIHN1cmUgdGhlIG1hcHBlciBnZXRzIGluamVjdGVkIHByb3Blcmx5CisgKiBieSBib3RoIEplcnNleSBydW50aW1lIGFuZCBFSkIgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBFamJFeGNlcHRpb25NYXBwZXJPbmUgZXh0ZW5kcyBFamJFeGNlcHRpb25NYXBwZXJCYXNlPEN1c3RvbUV4Y2VwdGlvbk9uZT4geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfQk9EWSA9ICJjdXN0b20gZXhjZXB0aW9uIG9uZSB0aHJvd24iOworCisgICAgQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvOworICAgIEBFSkIgRWNob0JlYW4gZWNob0JlYW47CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBDdXN0b21FeGNlcHRpb25PbmUgZXhjZXB0aW9uKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhSRVNQT05TRV9CT0RZKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIk15LUxvY2F0aW9uIiwgdXJpSW5mby5nZXRQYXRoKCkpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiTXktRWNobyIsIGVjaG9CZWFuLmVjaG8oIjEiKSkuYnVpbGQoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJFeGNlcHRpb25NYXBwZXJUd28uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWpiRXhjZXB0aW9uTWFwcGVyVHdvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyMjdlOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWpiRXhjZXB0aW9uTWFwcGVyVHdvLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIEpFUlNFWS0yMzIwIHJlcHJvZHVjZXIuIHtAbGluayBDdXN0b21FeGNlcHRpb25Ud299IHdpbGwgZ2V0IG1hcHBlZAorICogdG8gYW4gb3JkaW5hcnkgcmVzcG9uc2UuIFdlIG1ha2Ugc3VyZSB0aGUgbWFwcGVyIGdldHMgaW5qZWN0ZWQgcHJvcGVybHkKKyAqIGJ5IGJvdGggSmVyc2V5IHJ1bnRpbWUgYW5kIEVKQiBjb250YWluZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlbGVzcworcHVibGljIGNsYXNzIEVqYkV4Y2VwdGlvbk1hcHBlclR3byBleHRlbmRzIEVqYkV4Y2VwdGlvbk1hcHBlckJhc2U8Q3VzdG9tRXhjZXB0aW9uVHdvPiB7CisKKyAgICBAQ29udGV4dCBVcmlJbmZvIHVyaUluZm87CisgICAgQEVKQiBFY2hvQmVhbiBlY2hvQmVhbjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFX0JPRFkgPSAiY3VzdG9tIGV4Y2VwdGlvbiB0d28gdGhyb3duIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIEN1c3RvbUV4Y2VwdGlvblR3byBleGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKFJFU1BPTlNFX0JPRFkpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiTXktTG9jYXRpb24iLCB1cmlJbmZvLmdldFBhdGgoKSkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJNeS1FY2hvIiwgZWNob0JlYW4uZWNobygiMiIpKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRXhjZXB0aW9uRWpiUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRXhjZXB0aW9uRWpiUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTEyNDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FeGNlcHRpb25FamJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgamF2YXguZWpiLkVKQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5lamIuU2luZ2xldG9uOworCisvKioKKyAqIEVKQiBiYWNrZWQgSkFYLVJTIHJlc291cmNlIHRvIHRlc3QgaWYgYSBjdXN0b20gZXhjZXB0aW9uIGluZm8gbWFrZXMgaXQgdG8gdGhlIGNsaWVudC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitAUGF0aCgiZXhjZXB0aW9uIikKK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25FamJSZXNvdXJjZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2hlY2tlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIE15Q2hlY2tlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBNeVJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRWpiRXhjZXB0aW9uTUVTU0FHRSA9ICJlamIgZXhjZXB0aW9uIHRocm93biBkaXJlY3RseSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ2hlY2tlZEV4Y2VwdGlvbk1FU1NBR0UgPSAiY2hlY2tlZCBleGNlcHRpb24gdGhyb3duIGRpcmVjdGx5IjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgiZWpiIikKKyAgICBwdWJsaWMgU3RyaW5nIHRocm93RWpiRXhjZXB0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgRUpCRXhjZXB0aW9uKEVqYkV4Y2VwdGlvbk1FU1NBR0UpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY2hlY2tlZCIpCisgICAgcHVibGljIFN0cmluZyB0aHJvd0NoZWNrZWRFeGNlcHRpb24oKSB0aHJvd3MgTXlDaGVja2VkRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IE15Q2hlY2tlZEV4Y2VwdGlvbihDaGVja2VkRXhjZXB0aW9uTUVTU0FHRSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20xL3twfSIpCisgICAgcHVibGljIFN0cmluZyB0aHJvd0N1c3RvbUV4Y2VwdGlvbk9uZSgpIHRocm93cyBDdXN0b21CYXNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEN1c3RvbUV4Y2VwdGlvbk9uZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tMi97cH0iKQorICAgIHB1YmxpYyBTdHJpbmcgdGhyb3dDdXN0b21FeGNlcHRpb25Ud28oKSB0aHJvd3MgQ3VzdG9tQmFzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBDdXN0b21FeGNlcHRpb25Ud28oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Yzg0YTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5lamIuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiB0byBjb25maWd1cmUgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9yZXN0IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIGNvdW50ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkge3sKKyAgICAgICAgICAgIHB1dCgiamVyc2V5LmNvbmZpZy5zZXJ2ZXIucmVzcG9uc2Uuc2V0U3RhdHVzT3ZlclNlbmRFcnJvciIsIHRydWUpOworICAgICAgICB9fTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworCisgICAgICAgIHRoaXMuY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgICAgICBhZGQoQXBwUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKEV4Y2VwdGlvbkVqYlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChFY2hvUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKFJhd0VjaG9SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoQ291bnRlckZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICBhZGQoQXN5bmNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoRWpiRXhjZXB0aW9uTWFwcGVyT25lLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChFamJFeGNlcHRpb25NYXBwZXJUd28uY2xhc3MpOworICAgICAgICB9fTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGluY3JlbWVudEFuZEdldENvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL1Jhd0VjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvUmF3RWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTMzNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL1Jhd0VjaG8uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKKy8qKgorICogUGFydCBvZiB0aGUgcmVwcm9kdWNlciBmb3IgR0xBU1NGSVNILTE2MTk5LiBUaGlzIEVKQiBidXNpbmVzcyBpbnRlcmZhY2UKKyAqIGlzIGJlaW5nIHJlZ2lzdGVyZWQgYnkgYW4gYW5ub3RhdGlvbiBvbiB0aGUgRUpCIGNvbXBvbmVudCBjbGFzcywge0BsaW5rIFJhd0VjaG9SZXNvdXJjZX0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSAgUmF3RWNobyB7CisKKyAgICBTdHJpbmcgZWNobyhTdHJpbmcgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL1Jhd0VjaG9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9SYXdFY2hvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmJlNzdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9SYXdFY2hvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVqYi5SZW1vdGU7CitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIGJlYW4gYmFja2VkIGJ5IGFuIEVKQiBzZXNzaW9uIGJlYW4KKyAqIGltcGxlbWVudGluZyBFSkIgaW50ZXJmYWNlLCB7QGxpbmsgUmF3RWNob30sIHRoYXQgaXMgcmVnaXN0ZXJlZCB1c2luZyB7QGxpbmsgUmVtb3RlfSBhbm5vdGF0aW9ucy4KKyAqIFJlcHJvZHVjaWJsZSB0ZXN0IGNhc2UgZm9yIEdMQVNTRklTSC0xNjE5OS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitAUGF0aCgicmF3LWVjaG8iKQorQFJlbW90ZShSYXdFY2hvLmNsYXNzKQorcHVibGljIGNsYXNzIFJhd0VjaG9SZXNvdXJjZSB7CisKKyAgICBARUpCIEVjaG9CZWFuIGVjaG9TZXJ2aWNlOworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgibWVzc2FnZSIpIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKG1lc3NhZ2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvU3RhbmRhbG9uZVNlcnZsZXQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvU3RhbmRhbG9uZVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWU5YWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9TdGFuZGFsb25lU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuYW5ub3RhdGlvbi5XZWJTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIFN0YW5kYWxvbmUgU2VydmxldCBpbnN0YW5jZSB0aGF0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggSmVyc2V5LgorICogSXQgaGVscHMgdG8gY29tcGFyZSBKZXJzZXkgYW5kIG5vbi1KZXJzZXkgc3BlY2lmaWMgZXhjZXB0aW9uIGhhbmRsaW5nCisgKiBwcm9jZXNzaW5nLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BXZWJTZXJ2bGV0KG5hbWUgPSAiU3RhbmRhbG9uZVNlcnZsZXQiLCB1cmxQYXR0ZXJucyA9IHsiL3NlcnZsZXQifSkKK3B1YmxpYyBjbGFzcyBTdGFuZGFsb25lU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVGhyb3dDaGVja2VkRXhjZXB0aW9uQUNUSU9OID0gInRocm93Q2hlY2tlZEV4Y2VwdGlvbiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUaHJvd0VqYkV4Y2VwdGlvbkFDVElPTiA9ICJ0aHJvd0VqYkV4Y2VwdGlvbiI7CisKKyAgICBARUpCIEV4Y2VwdGlvbkVqYlJlc291cmNlIGVqYlJlc291cmNlOworCisgICAgLyoqCisgICAgICogSGFuZGxlcyB0aGUgSFRUUCA8Y29kZT5HRVQ8L2NvZGU+IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IHNlcnZsZXQgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2Ugc2VydmxldCByZXNwb25zZS4KKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgYSBzZXJ2bGV0LXNwZWNpZmljIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb24gPSByZXF1ZXN0LmdldFBhcmFtZXRlcigiYWN0aW9uIik7CisKKyAgICAgICAgaWYgKFRocm93Q2hlY2tlZEV4Y2VwdGlvbkFDVElPTi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBlamJSZXNvdXJjZS50aHJvd0NoZWNrZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbkVqYlJlc291cmNlLk15Q2hlY2tlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChUaHJvd0VqYkV4Y2VwdGlvbkFDVElPTi5lcXVhbHMoYWN0aW9uKSkgeworICAgICAgICAgICAgZWpiUmVzb3VyY2UudGhyb3dFamJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHNheUhlbGxvKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F5SGVsbG8oSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9wbGFpbiIpOworICAgICAgICByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS5wcmludCgKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJVc2UgYWN0aW9uIHBhcmFtZXRlciB0byBzcGVjaWZ5IGV4Y2VwdGlvbi4iCisgICAgICAgICAgICAgICAgKyAiIFxuU3VwcG9ydGVkIG9wdGlvbnM6ICVzLCAlcy4iLCBUaHJvd0NoZWNrZWRFeGNlcHRpb25BQ1RJT04sIFRocm93RWpiRXhjZXB0aW9uQUNUSU9OKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VqYlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg4Y2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJUZXN0LmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZW5kc1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuc3RhcnRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmdyZWF0ZXJUaGFuOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubGVzc1RoYW47CisKKy8qKgorICogVGVzdCBmb3IgRUpCIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMuCisgKiBSdW4gd2l0aDoKKyAqIDxwcmU+CisgKiBtdm4gY2xlYW4gcGFja2FnZQorICogJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IHRhcmdldC9lamItdGVzdC13ZWJhcHAKKyAqIG12biAtRHNraXBUZXN0cz1mYWxzZSB0ZXN0PC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVqYlRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImVqYi10ZXN0LXdlYmFwcCIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFamJFeGNlcHRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGplcnNleVJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9leGNlcHRpb24vZWpiIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBfY2hlY2s1MDBSZXNwb25zZShqZXJzZXlSZXNwb25zZSwgRXhjZXB0aW9uRWpiUmVzb3VyY2UuRWpiRXhjZXB0aW9uTUVTU0FHRSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2Ugc2VydmxldFJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCJzZXJ2bGV0IikKKyAgICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJhY3Rpb24iLCBTdGFuZGFsb25lU2VydmxldC5UaHJvd0VqYkV4Y2VwdGlvbkFDVElPTikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBfY2hlY2s1MDBSZXNwb25zZShzZXJ2bGV0UmVzcG9uc2UsIEV4Y2VwdGlvbkVqYlJlc291cmNlLkVqYkV4Y2VwdGlvbk1FU1NBR0UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrZWRFeGNlcHRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGplcnNleVJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9leGNlcHRpb24vY2hlY2tlZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgX2NoZWNrNTAwUmVzcG9uc2UoamVyc2V5UmVzcG9uc2UsIEV4Y2VwdGlvbkVqYlJlc291cmNlLkNoZWNrZWRFeGNlcHRpb25NRVNTQUdFKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBzZXJ2bGV0UmVzcG9uc2UgPQorICAgICAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoInNlcnZsZXQiKQorICAgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImFjdGlvbiIsIFN0YW5kYWxvbmVTZXJ2bGV0LlRocm93Q2hlY2tlZEV4Y2VwdGlvbkFDVElPTikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBfY2hlY2s1MDBSZXNwb25zZShzZXJ2bGV0UmVzcG9uc2UsIEV4Y2VwdGlvbkVqYlJlc291cmNlLkNoZWNrZWRFeGNlcHRpb25NRVNTQUdFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21FeGNlcHRpb24xKCkgeworICAgICAgICBSZXNwb25zZSBqZXJzZXlSZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvZXhjZXB0aW9uL2N1c3RvbTEvYmlnIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKEVqYkV4Y2VwdGlvbk1hcHBlck9uZS5SRVNQT05TRV9CT0RZKSk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJNeS1Mb2NhdGlvbiIpLCBpcygiZXhjZXB0aW9uL2N1c3RvbTEvYmlnIikpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiTXktRWNobyIpLCBpcygiRUNIT0VEOiAxIikpOworCisgICAgICAgIGplcnNleVJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9leGNlcHRpb24vY3VzdG9tMS9vbmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoRWpiRXhjZXB0aW9uTWFwcGVyT25lLlJFU1BPTlNFX0JPRFkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIk15LUxvY2F0aW9uIiksIGlzKCJleGNlcHRpb24vY3VzdG9tMS9vbmUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJNeS1FY2hvIiksIGlzKCJFQ0hPRUQ6IDEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tRXhjZXB0aW9uMigpIHsKKyAgICAgICAgUmVzcG9uc2UgamVyc2V5UmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2V4Y2VwdGlvbi9jdXN0b20yL3NtYWxsIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKEVqYkV4Y2VwdGlvbk1hcHBlclR3by5SRVNQT05TRV9CT0RZKSk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJNeS1Mb2NhdGlvbiIpLCBpcygiZXhjZXB0aW9uL2N1c3RvbTIvc21hbGwiKSk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJNeS1FY2hvIiksIGlzKCJFQ0hPRUQ6IDIiKSk7CisKKyAgICAgICAgamVyc2V5UmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2V4Y2VwdGlvbi9jdXN0b20yL29uZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhFamJFeGNlcHRpb25NYXBwZXJUd28uUkVTUE9OU0VfQk9EWSkpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiTXktTG9jYXRpb24iKSwgaXMoImV4Y2VwdGlvbi9jdXN0b20yL29uZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIk15LUVjaG8iKSwgaXMoIkVDSE9FRDogMiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdGVMb2NhbEVKQkludGVyZmFjZSgpIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJIaSB0aGVyZSI7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9lY2hvIikucXVlcnlQYXJhbSgibWVzc2FnZSIsIG1lc3NhZ2UpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VNZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VNZXNzYWdlLCBzdGFydHNXaXRoKEVjaG9CZWFuLlBSRUZJWCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlTWVzc2FnZSwgZW5kc1dpdGgobWVzc2FnZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbW90ZUFubm90YXRpb25SZWdpc3RlcmVkRUpCSW50ZXJmYWNlKCkgeworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkhpIHRoZXJlIjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L3Jhdy1lY2hvIikucXVlcnlQYXJhbSgibWVzc2FnZSIsIG1lc3NhZ2UpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VNZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VNZXNzYWdlLCBzdGFydHNXaXRoKEVjaG9CZWFuLlBSRUZJWCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlTWVzc2FnZSwgZW5kc1dpdGgobWVzc2FnZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RDb3VudEdldHNJbmNyZW1lbnRlZCgpIHsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZTEgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2VjaG8iKS5xdWVyeVBhcmFtKCJtZXNzYWdlIiwgIndoYXRldmVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlMS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudGVySGVhZGVyMSA9IHJlc3BvbnNlMS5nZXRIZWFkZXJTdHJpbmcoQ291bnRlckZpbHRlci5SZXF1ZXN0Q291bnRIRUFERVIpOworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50MSA9IEludGVnZXIucGFyc2VJbnQoY291bnRlckhlYWRlcjEpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlMiA9IHRhcmdldCgpLnBhdGgoInJlc3QvZWNobyIpLnF1ZXJ5UGFyYW0oIm1lc3NhZ2UiLCByZXF1ZXN0Q291bnQxKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UyLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDIgPSBJbnRlZ2VyLnBhcnNlSW50KHJlc3BvbnNlMi5nZXRIZWFkZXJTdHJpbmcoQ291bnRlckZpbHRlci5SZXF1ZXN0Q291bnRIRUFERVIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDIsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDEpKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvYXN5bmMtdGVzdC9zeW5jIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJzeW5jIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvYXN5bmMtdGVzdC9hc3luYyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiYXN5bmMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwSXNFamJTaW5nbGV0b24oKSB7CisKKyAgICAgICAgaW50IGMxID0gdGFyZ2V0KCkucGF0aCgicmVzdC9hcHAvY291bnQiKS5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworICAgICAgICBpbnQgYzIgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2FwcC9jb3VudCIpLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGludCBjMyA9IHRhcmdldCgpLnBhdGgoInJlc3QvYXBwL2NvdW50IikucmVxdWVzdCgpLmdldChJbnRlZ2VyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJ0aGUgZmlyc3QgY291bnQgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgc2Vjb25kIG9uZSIsIGMxLCBpcyhsZXNzVGhhbihjMikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgidGhlIHNlY29uZCBjb3VudCBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSB0aGlyZCBvbmUiLCBjMiwgaXMobGVzc1RoYW4oYzMpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVjazUwMFJlc3BvbnNlKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRTdWJzdHJpbmcpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoNTAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBjb250YWluc1N0cmluZyhleHBlY3RlZFN1YnN0cmluZykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MDhlN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9wb20ueG1sCkBAIC0wLDAgKzEsMTEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmotMzc2PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+ai0zNzYtcmVwcm9kdWNlcjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgdGVzdCB3ZWIgYXBwbGljYXRpb24gLSBKLTM3NiByZXByb2R1Y2VyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wLkZpbmFsPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS13ZWxkMi1zZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXg8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmdyaXp6bHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncml6emx5LWh0dHAtc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE2PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzYuR3JpenpseUFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoU2NvcGU+dGVzdDwvY2xhc3NwYXRoU2NvcGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0FwcGxpY2F0aW9uU2NvcGVkQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0FwcGxpY2F0aW9uU2NvcGVkQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNWU3OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvQXBwbGljYXRpb25TY29wZWRCZWFuLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qMzc2OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworCisvKioKKyAqIFRlc3Qge0Bjb2RlIEFwcGxpY2F0aW9uU2NvcGVkfSBiZWFuIHRvIGJlIGluamVjdGVkIHRvIHRoZSB0ZXN0IHJlc291cmNlLCB3aGlsZSBhbm90aGVyIHtAY29kZSBSZXF1ZXN0U2NvcGVkfQorICogYmVhbiBiZWluZyBpbmplY3RlZCBpbnRvIHRoaXMgY2xhc3MuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblNjb3BlZEJlYW4geworCisgICAgLyoqIFJlcXVlc3Qgc2NvcGVkIGJlYW4gaW5qZWN0ZWQgdmlhIENESSAqLworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFNlY29uZEJlYW4gYmVhbjsKKworICAgIC8qKiBKQVgtUlMge0Bjb2RlIENvbnRleHR9IGluamVjdGlvbiBvZiByZXF1ZXN0IHtAY29kZSBVcmlJbmZvfSAqLworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaTsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiQXBwbGljYXRpb25TY29wZWRCZWFuIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUgKyAiOiIgKyBiZWFuLmdldE1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIHVyaS5nZXRQYXRoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0FwcGxpY2F0aW9uU2NvcGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9BcHBsaWNhdGlvblNjb3BlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiZjA1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9BcHBsaWNhdGlvblNjb3BlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qMzc2OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuQmVhblBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogUmVzb3VyY2UgdG8gdGVzdCBDREkgaW5qZWN0aW9uIGludG8ge0Bjb2RlIEFwcGxpY2F0aW9uU2NvcGVkfSBKQVgtUlMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiYXBwU2NvcGUiKQorQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25TY29wZWRSZXNvdXJjZSB7CisKKyAgICAvKiogQXBwbGljYXRpb24gc2NvcGVkIENESSBpbmplY3RlZCBiZWFuICovCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQXBwbGljYXRpb25TY29wZWRCZWFuIGFwcFNjb3BlZDsKKworICAgIC8qKiBSZXF1ZXN0IHNjb3BlZCBDREkgaW5qZWN0ZWQgYmVhbiAqLworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFNlY29uZEJlYW4gcmVxU2NvcGVkOworCisgICAgLyoqIEJlYW4gY29udGFpbmluZyBmb3JtIHBhcmFtZXRlcnMgaW5qZWN0ZWQgYnkgSkFYLVJTICovCisgICAgQEluamVjdAorICAgIEBCZWFuUGFyYW0KKyAgICBwcml2YXRlIEZvcm1EYXRhQmVhbiBiZWFuOworCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gYmVhbi5nZXROYW1lKCkgKyAiOiIgKyBiZWFuLmdldEFnZSgpICsgIjoiCisgICAgICAgICAgICAgICAgKyBiZWFuLmdldEluamVjdGVkQmVhbigpLmdldE1lc3NhZ2UoKSArICI6IiArIGJlYW4uZ2V0SW5qZWN0ZWRQYXRoKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtc2ciKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyB0ZXN0QXBwU2NvcGVkKCkgeworICAgICAgICByZXR1cm4gYXBwU2NvcGVkLmdldE1lc3NhZ2UoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInVyaSIpCisgICAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBhcHBTY29wZWQuZ2V0VXJpKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXEiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcVNjb3BlZC5nZXRNZXNzYWdlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0NvbnN0cnVjdG9ySW5qZWN0aW9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9Db25zdHJ1Y3RvckluamVjdGlvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxNjczMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9Db25zdHJ1Y3RvckluamVjdGlvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qMzc2OworCitpbXBvcnQgamF2YXgud3MucnMuQmVhblBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKKworLyoqCisgKiBSZXNvdXJjZSB0byB0ZXN0IENESSBpbmplY3Rpb24gaW50byBKQVgtUlMgcmVzb3VyY2UgdmlhIGNvbnN0cnVjdG9yIHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJjb25zdHJ1Y3RvciIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENvbnN0cnVjdG9ySW5qZWN0aW9uUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBGb3JtRGF0YUJlYW4gYmVhbjsKKworICAgIHB1YmxpYyBDb25zdHJ1Y3RvckluamVjdGlvblJlc291cmNlKCkgeworICAgIH0KKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JJbmplY3Rpb25SZXNvdXJjZShAVmFsaWQgQEJlYW5QYXJhbSBmaW5hbCBGb3JtRGF0YUJlYW4gZm9ybSkgeworICAgICAgICBiZWFuID0gZm9ybTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldE5hbWUoKSArICI6IiArIGJlYW4uZ2V0QWdlKCkgKyAiOiIKKyAgICAgICAgICAgICAgICArIGJlYW4uZ2V0SW5qZWN0ZWRCZWFuKCkuZ2V0TWVzc2FnZSgpICsgIjoiICsgYmVhbi5nZXRJbmplY3RlZFBhdGgoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvRmllbGRJbmplY3Rpb25SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0ZpZWxkSW5qZWN0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGM2ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0ZpZWxkSW5qZWN0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKKworLyoqCisgKiBSZXNvdXJjZSB0byB0ZXN0IENESSBpbmplY3Rpb24gaW50byBKQVgtUlMgcmVzb3VyY2UgdmlhIGZpZWxkLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImZpZWxkIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgRmllbGRJbmplY3Rpb25SZXNvdXJjZSB7CisKKyAgICAvKiogQ0RJIGluamVjdGVkIHJlcXVlc3Qgc2NvcGVkIGZpZWxkICovCisgICAgQEluamVjdAorICAgIEBWYWxpZAorICAgIEBCZWFuUGFyYW0KKyAgICBwcml2YXRlIEZvcm1EYXRhQmVhbiBiZWFuOworCisgICAgLyoqIENESSBpbmplY3RlZCBhcHBsY2lhdGlvbiBzY29wZWQgYmVhbiAqLworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uU2NvcGVkQmVhbiBhcHBTY29wZWQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gc3RyaW5nIGNvbnRhaW5pbmcgb2YgZmllbGRzIGZyb20gdGhlIGluamVjdGVkIG5vbiBKQVgtUlMgcmVxdWVzdCBzY29wZWQgYmVhbiwKKyAgICAgKiBwYXRoIGluamVjdGVkIGludG8gaXQgdmlhIHtAY29kZSBDb250ZXh0fSBhbm5vdGF0aW9uIGFuZCBhbm90aGVyIGJlYW4gaW5qZWN0ZWQgaW50byBpdC4KKyAgICAgKgorICAgICAqIFNob3dzLCB0aGF0IHtAY29kZSBJbmplY3R9IGFuZCB7QGNvZGUgQ29udGV4dH0gYW5ub3RhdGlvbnMgY2FuIGJlIHVzZWQgb24gb25lIHBhcnRpY3VsYXIgbm9uIEpBWC1SUyBjbGFzcy4KKyAgICAgKiovCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gYmVhbi5nZXROYW1lKCkgKyAiOiIgKyBiZWFuLmdldEFnZSgpICsgIjoiCisgICAgICAgICAgICAgICAgKyBiZWFuLmdldEluamVjdGVkQmVhbigpLmdldE1lc3NhZ2UoKSArICI6IiArIGJlYW4uZ2V0SW5qZWN0ZWRQYXRoKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybiBzdHJpbmcgZnJvbSB0aGUge0Bjb2RlIEFwcGxpY2F0aW9uU2NvcGVkfSBub24gSkFYX1JTIGJlYW4gaW5qZWN0ZWQgaW50byB0aGlzIEpBWC1SUyByZXNvdXJjZS4gKi8KKyAgICBAR0VUCisgICAgQFBhdGgoImFwcFNjb3BlZCIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBhcHBTY29wZWQuZ2V0TWVzc2FnZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBwYXRoIGluamVjdGVkIHZpYSB7QGNvZGUgQ29udGV4dH0gYW5ub3RhdGlvbiBpbnRvIHtAY29kZSBBcHBsaWNhdGlvblNjb3BlZH0gbm9uIEpBWC1SUyBiZWFuLCB0aGF0IGlzCisgICAgICogZnVydGhlciBpbmplY3RlZCBpbnRvIHRoaXMgSkFYLVJTIHJlc291cmNlIHZpYSBDREkuCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJhcHBTY29wZWRVcmkiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gYXBwU2NvcGVkLmdldFVyaSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9Gb3JtRGF0YUJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9Gb3JtRGF0YUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTljNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0Zvcm1EYXRhQmVhbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajM3NjsKKworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW47CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKKworLyoqCisgKiBUZXN0IGJlYW4gY29udGFpbmluZ2JvdGggSkFYLVJTIGFuZCBDREkgaW5qZWN0aW9uIHBvaW50cy4KKyAqLworQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBGb3JtRGF0YUJlYW4geworCisgICAgcHJpdmF0ZSBTdHJpbmcgaW5qZWN0ZWRQYXRoID0gbnVsbDsKKworICAgIEBOb3ROdWxsCisgICAgQFNpemUobWluID0gNCkKKyAgICBARm9ybVBhcmFtKCJuYW1lIikKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgQE1pbigxOCkKKyAgICBARm9ybVBhcmFtKCJhZ2UiKQorICAgIHByaXZhdGUgaW50IGFnZTsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFNlY29uZEJlYW4gaW5qZWN0ZWRCZWFuOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFVyaUluZm8gdXJpOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEFnZSgpIHsKKyAgICAgICAgcmV0dXJuIGFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHBvc2VzIHRoZSBzdGF0ZSBvZiBpbmplY3RlZCB7QGNvZGUgVXJpSW5mb30gaW4gdGhlIHRpbWUgb2YgdGhlIGNhbGwgb2Yge0BsaW5rIGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdH0KKyAgICAgKiBhbm5vdGF0ZWQgbWV0aG9kLiBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB1c2VkIGluIHRlc3QgdG8gZW5zdXJlLCB0aGF0IHtAY29kZSBVcmlJbmZvfSBpcyBpbmplY3RlZCBpbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhdGggaW5qZWN0ZWQgdmlhIHtAY29kZSBVcmlJbmZvfSBhdCB0aGUgdGltZS1wb2ludCBvZiB0aGUge0BsaW5rICNwb3N0Q29uc3RydWN0KCl9IG1ldGhvZCBjYWxsLgorCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbmplY3RlZFBhdGgoKSB7CisgICAgICAgIHJldHVybiBpbmplY3RlZFBhdGg7CisgICAgfQorCisgICAgcHVibGljIFNlY29uZEJlYW4gZ2V0SW5qZWN0ZWRCZWFuKCkgeworICAgICAgICByZXR1cm4gaW5qZWN0ZWRCZWFuOworICAgIH0KKworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsKKyAgICAgICAgdGhpcy5pbmplY3RlZFBhdGggPSB1cmkuZ2V0UGF0aCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0dyaXp6bHlBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9Hcml6emx5QXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlNmQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9Hcml6emx5QXBwLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qMzc2OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmVudmlyb25tZW50LnNlLldlbGQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQ0RJIFRlc3QgQXBwIGxhdW5jaGVyLiBTdGFydHMgdGhlIEdyaXp6bHkgc2VydmVyIGFuZCBpbml0aWFsaXplcyB3ZWxkLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEdyaXp6bHlBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgV2VsZCB3ZWxkOworICAgIHByaXZhdGUgc3RhdGljIEh0dHBTZXJ2ZXIgc2VydmVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2ozNzYvIik7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkplcnNleSBDREkgVGVzdCBBcHAiKTsKKworICAgICAgICAgICAgc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0ICVzJXNcbkhpdCBlbnRlciB0byBzdG9wIGl0Li4uIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksICJhcHBsaWNhdGlvbi53YWRsIikpOworICAgICAgICAgICAgU3lzdGVtLmluLnJlYWQoKTsKKyAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoR3JpenpseUFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICB3ZWxkLnNodXRkb3duKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgd2VsZC5pbml0aWFsaXplKCk7CisKKyAgICAgICAgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIGNyZWF0ZUpheFJzQXBwKCksIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBCQVNFX1VSSTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZUpheFJzQXBwKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKG5ldyBNeUFwcGxpY2F0aW9uKCkuZ2V0Q2xhc3NlcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvTWV0aG9kSW5qZWN0aW9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9NZXRob2RJbmplY3Rpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTk2NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvTWV0aG9kSW5qZWN0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzY7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7CisKKy8qKgorICogUmVzb3VyY2UgdG8gdGVzdCBDREkgaW5qZWN0aW9uIGludG8gSkFYLVJTIHJlc291cmNlIHZpYSBzZXR0ZXIuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgibWV0aG9kIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgTWV0aG9kSW5qZWN0aW9uUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBGb3JtRGF0YUJlYW4gYmVhbjsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JtRGF0YUJlYW4oQFZhbGlkIEBCZWFuUGFyYW0gZmluYWwgRm9ybURhdGFCZWFuIGZvcm0pIHsKKyAgICAgICAgYmVhbiA9IGZvcm07CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gYmVhbi5nZXROYW1lKCkgKyAiOiIgKyBiZWFuLmdldEFnZSgpICsgIjoiCisgICAgICAgICAgICAgICAgKyBiZWFuLmdldEluamVjdGVkQmVhbigpLmdldE1lc3NhZ2UoKSArICI6IiArIGJlYW4uZ2V0SW5qZWN0ZWRQYXRoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMGJlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qMzc2OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBKQVgtUlMgQXBwbGljYXRpb24gc3ViY2xhc3MsIGRlZmluZXMgdGhlIHRlc3QgYXBwbGljYXRpb24gcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBjbGFzc2VzLmFkZChNZXRob2RJbmplY3Rpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKENvbnN0cnVjdG9ySW5qZWN0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChGaWVsZEluamVjdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoQXBwbGljYXRpb25TY29wZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9TZWNvbmRCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvU2Vjb25kQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNWVhZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvU2Vjb25kQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajM3NjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworCisvKioKKyAqIEJlYW4gdG8gYmUgaW5qZWN0ZWQgaW50byBhbm90aGVyIGJlYW4gYnkgQ0RJLgorICoKKyAqIFRoZSBwdXJwb3NlIGlzIHRvIHRlc3QsIHRoYXQgQ0RJIGFuZCBoazIgaW5qZWN0aW9ucyBhcmUgd29ya2luZyB0b2dldGhlciBzbyB0aGF0IG9uZSBjbGFzcyBiZSBpbmplY3RlZCBieQorICogYm90aCBDREkgYW5kIEplcnNleS9oazIuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIFNlY29uZEJlYW4geworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2UgPSAiSGVsbG8iOworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDZkNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9KMzc2VGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0ozNzZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzOTAyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9KMzc2VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKMzc2VGVzdCB7CisgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoR3JpenpseUFwcC5nZXRCYXNlVXJpKCkpOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwVGVzdCgpIHsKKyAgICAgICAgR3JpenpseUFwcC5zdGFydCgpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duVGVzdCgpIHsKKyAgICAgICAgR3JpenpseUFwcC5zdG9wKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JJbmplY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJjb25zdHJ1Y3RvciIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIm5hbWU9Sm9obiZhZ2U9MzIiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKb2huOjMyOkhlbGxvOmNvbnN0cnVjdG9yIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkSW5qZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiZmllbGQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJuYW1lPUJpbGwmYWdlPTIxIiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiQmlsbDoyMTpIZWxsbzpmaWVsZCIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbmplY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJtZXRob2QiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJuYW1lPU1pa2UmYWdlPTQyIiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiTWlrZTo0MjpIZWxsbzptZXRob2QiLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwU2NvcGVkQmVhbkluUmVxU2NvcGVkUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJmaWVsZC9hcHBTY29wZWQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXBwbGljYXRpb25TY29wZWRCZWFuOkhlbGxvIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcFNjb3BlZFJlc291cmNlKCkgeworICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiYXBwU2NvcGUvbXNnIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFwcGxpY2F0aW9uU2NvcGVkQmVhbjpIZWxsbyIsIHJlc3BvbnNlKTsKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiYXBwU2NvcGUvdXJpIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcFNjb3BlL3VyaSIsIHJlc3BvbnNlKTsKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiYXBwU2NvcGUvcmVxIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5QYXJhbUluQXBwU2NvcGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiYXBwU2NvcGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJuYW1lPUpvaG4mYWdlPTM1IiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSm9objozNTpIZWxsbzphcHBTY29wZSIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0SW5qZWN0aW9uSW5BcHBTY29wZWRCZWFuKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiZmllbGQvYXBwU2NvcGVkVXJpIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZpZWxkL2FwcFNjb3BlZFVyaSIsIHJlc3BvbnNlKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL2Vhci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvZWFyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlYjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL2Vhci9wb20ueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKyAgICA8YXJ0aWZhY3RJZD5qLTQ0MS1lYXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qLTQ0MS1lYXI8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZWZhdWx0TGliQnVuZGxlRGlyPkFQUC1JTkYvbGliPC9kZWZhdWx0TGliQnVuZGxlRGlyPgorICAgICAgICAgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ai00NDEtd2FyMTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGV4dFJvb3Q+L29uZTwvY29udGV4dFJvb3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3dlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ai00NDEtd2FyMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGV4dFJvb3Q+L3R3bzwvY29udGV4dFJvb3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3dlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgPC9tb2R1bGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qLTQ0MS13YXIxPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qLTQ0MS13YXIyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODEwOWJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvcG9tLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ai00NDE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tai00NDE8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEotNDQxIFJlcHJvZHVjZXI6IFR3byBXQVJzIHdpdGggZW5hYmxlZCBDREkgaW4gYW4gRUFSLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5lYXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT53YXIxPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+d2FyMjwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjdlZjVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9wb20ueG1sCkBAIC0wLDAgKzEsOTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ai00NDEtd2FyMTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWotNDQxLXdhcjE8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvb25lL0NkaVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvQ2RpUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2NlOGRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvb25lL0NkaVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNDQxLm9uZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworLyoqCisgKiBDREkgYmFja2VkIEpBWC1SUyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL3Rlc3QiKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgc2NGaWVsZDsKKworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgc2NDdG9yUGFyYW07CisKKyAgICAvKiB0byBtYWtlIENESSBoYXBweSAqLworICAgIHB1YmxpYyBDZGlSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIENkaVJlc291cmNlKEBDb250ZXh0IGZpbmFsIFNlcnZsZXRDb250ZXh0IHNjKSB7CisgICAgICAgIHRoaXMuc2NDdG9yUGFyYW0gPSBzYzsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN0b3ItcGFyYW0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3RvclBhcmFtKCkgeworICAgICAgICByZXR1cm4gc2NDdG9yUGFyYW0uZ2V0Q29udGV4dFBhdGgoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1ldGhvZC1wYXJhbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2RQYXJhbShAQ29udGV4dCBmaW5hbCBTZXJ2bGV0Q29udGV4dCBzYykgeworICAgICAgICByZXR1cm4gc2MuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImZpZWxkIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkKCkgeworICAgICAgICByZXR1cm4gc2NGaWVsZC5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCkge307CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvb25lL0N1c3RvbUV4Y2VwdGlvbk1hcHBlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvb25lL0N1c3RvbUV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWE3MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNDQxLm9uZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCisvKioKKyAqIEpBWC1SUyBwcm92aWRlciBhZGRlZCBqdXN0IHRvIG1ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24KKyAqIGRlcGxveXMgZmluZS4gU2luY2UgSkFYLVJTIHByb3ZpZGVycyBnZXQgaW5pdGlhbGl6ZWQKKyAqIGF0IEplcnNleSBib290c3RyYXBwaW5nIHBoYXNlLCB3ZSB3b3VsZCBnZXQgYSBkZXBsb3kKKyAqIGVycm9yIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21FeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8RXhjZXB0aW9uPiB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgc2M7CisKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cygyMDApLmVudGl0eShzYy5nZXRDb250ZXh0UGF0aCgpKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL29uZS9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3M2I4NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajQ0MS5vbmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogVGVzdCBjYXNlIHRvIGVuc3VyZSBwcm9wZXIgV0FSIGlzb2xhdGlvbiBvbiBKZXJzZXkgbGV2ZWwuCisgKiBEZWZpbmUgSkFYLVJTIGFwcGxpY2F0aW9uIGNvbnRhaW5pbmcgYSBzaW1wbGUgQ0RJIGJhY2tlZCBKQVgtUlMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICBzdXBlcihDZGlSZXNvdXJjZS5jbGFzcywgQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzY2ZlZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2JlYW5zXzFfMC54c2QiPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL29uZS9Db250ZXh0UGF0aFRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL29uZS9Db250ZXh0UGF0aFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU4NTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvb25lL0NvbnRleHRQYXRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajQ0MS5vbmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGhpcyBpcyB0byBtYWtlIHN1cmUgdHdvIEplcnNleSB3YXJzIGFyZSBzZXBhcmF0ZWQgd2VsbCBpbiBhIHNpbmdsZSBlYXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZXh0UGF0aFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkSW5qZWN0aW9uKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgib25lL3Rlc3QvZmllbGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIvb25lIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9ySW5qZWN0aW9uKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgib25lL3Rlc3QvY3Rvci1wYXJhbSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIi9vbmUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW5qZWN0aW9uKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgib25lL3Rlc3QvbWV0aG9kLXBhcmFtIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygiL29uZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25NYXBwZXJJbmplY3Rpb24oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJvbmUvdGVzdC9leGNlcHRpb24iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIvb25lIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDM4NWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9wb20ueG1sCkBAIC0wLDAgKzEsOTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ai00NDEtd2FyMjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWotNDQxLXdhcjI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvdHdvL0NkaVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vQ2RpUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI5MjczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvdHdvL0NkaVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNDQxLnR3bzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworLyoqCisgKiBDREkgYmFja2VkIEpBWC1SUyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL3Rlc3QiKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgc2NGaWVsZDsKKworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgc2NDdG9yUGFyYW07CisKKyAgICAvKiB0byBtYWtlIENESSBoYXBweSAqLworICAgIHB1YmxpYyBDZGlSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIENkaVJlc291cmNlKEBDb250ZXh0IGZpbmFsIFNlcnZsZXRDb250ZXh0IHNjKSB7CisgICAgICAgIHRoaXMuc2NDdG9yUGFyYW0gPSBzYzsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN0b3ItcGFyYW0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3RvclBhcmFtKCkgeworICAgICAgICByZXR1cm4gc2NDdG9yUGFyYW0uZ2V0Q29udGV4dFBhdGgoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1ldGhvZC1wYXJhbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2RQYXJhbShAQ29udGV4dCBmaW5hbCBTZXJ2bGV0Q29udGV4dCBzYykgeworICAgICAgICByZXR1cm4gc2MuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImZpZWxkIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkKCkgeworICAgICAgICByZXR1cm4gc2NGaWVsZC5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCkge307CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvdHdvL0N1c3RvbUV4Y2VwdGlvbk1hcHBlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvdHdvL0N1c3RvbUV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDQxMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNDQxLnR3bzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCisvKioKKyAqIEpBWC1SUyBwcm92aWRlciBhZGRlZCBqdXN0IHRvIG1ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24KKyAqIGRlcGxveXMgZmluZS4gU2luY2UgSkFYLVJTIHByb3ZpZGVycyBnZXQgaW5pdGlhbGl6ZWQKKyAqIGF0IEplcnNleSBib290c3RyYXBwaW5nIHBoYXNlLCB3ZSB3b3VsZCBnZXQgYSBkZXBsb3kKKyAqIGVycm9yIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21FeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8RXhjZXB0aW9uPiB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgc2M7CisKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cygyMDApLmVudGl0eShzYy5nZXRDb250ZXh0UGF0aCgpKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL3R3by9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmQzZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajQ0MS50d287CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogVGVzdCBjYXNlIHRvIGVuc3VyZSBwcm9wZXIgV0FSIGlzb2xhdGlvbiBvbiBKZXJzZXkgbGV2ZWwuCisgKiBEZWZpbmUgSkFYLVJTIGFwcGxpY2F0aW9uIGNvbnRhaW5pbmcgYSBzaW1wbGUgQ0RJIGJhY2tlZCBKQVgtUlMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICBzdXBlcihDZGlSZXNvdXJjZS5jbGFzcywgQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzY2ZlZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2JlYW5zXzFfMC54c2QiPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL3R3by9Db250ZXh0UGF0aFRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL3R3by9Db250ZXh0UGF0aFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjRmNjhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvdHdvL0NvbnRleHRQYXRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajQ0MS50d287CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGhpcyBpcyB0byBtYWtlIHN1cmUgdHdvIEplcnNleSB3YXJzIGFyZSBzZXBhcmF0ZWQgd2VsbCBpbiBhIHNpbmdsZSBlYXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZXh0UGF0aFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkSW5qZWN0aW9uKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgidHdvL3Rlc3QvZmllbGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIvdHdvIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9ySW5qZWN0aW9uKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgidHdvL3Rlc3QvY3Rvci1wYXJhbSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIi90d28iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW5qZWN0aW9uKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgidHdvL3Rlc3QvbWV0aG9kLXBhcmFtIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygiL3R3byIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25NYXBwZXJJbmplY3Rpb24oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJ0d28vdGVzdC9leGNlcHRpb24iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIvdHdvIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvZWFyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2Vhci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2UzMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2Vhci9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ai01OS1lYXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tai01OS1lYXI8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZWZhdWx0TGliQnVuZGxlRGlyPkFQUC1JTkYvbGliPC9kZWZhdWx0TGliQnVuZGxlRGlyPgorICAgICAgICAgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ai01OS1jZGktd2FyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC93ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWpiTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmotNTktZWpiLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZWpiTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmotNTktY2RpLXdhcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ai01OS1lamItbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+ZWpiPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2xpYi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS9saWIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTBlNTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS9saWIvcG9tLnhtbApAQCAtMCwwICsxLDYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmotNTktZWpiLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qLTU5LWVqYi1saWI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9lamIvbGliL0xvY2FsQmVhbldpdGhSZW1vdGVJbnRlcmZhY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2VqYi9saWIvTG9jYWxCZWFuV2l0aFJlbW90ZUludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Njk3NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9lamIvbGliL0xvY2FsQmVhbldpdGhSZW1vdGVJbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo1OS5lamIubGliOworCitpbXBvcnQgamF2YXguZWpiLkxvY2FsQmVhbjsKK2ltcG9ydCBqYXZheC5lamIuUmVtb3RlOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7CisKKy8qKgorICogTG9jYWwgc3RhdGVsZXNzIHNlc3Npb24gYmVhbiBpbXBsZW1lbnRpbmcgYSByZW1vdGUgaW50ZXJmYWNlLgorICogUGFydCBvZiBDREkgZXh0ZW5zaW9uIGxvb2t1cCBpc3N1ZSByZXByb2R1Y2VyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWxlc3MKK0BMb2NhbEJlYW4KK0BSZW1vdGUoTXlSZW1vdGVJbnRlcmZhY2UuY2xhc3MpCitwdWJsaWMgY2xhc3MgTG9jYWxCZWFuV2l0aFJlbW90ZUludGVyZmFjZSB7CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgZ2V0dGVyIHRvIGJlIGludm9rZWQgZnJvbSBhIENESSBiYWNrZWQgSkFYLVJTIHJlc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiBKb3NoIHN0cmluZyBsaXRlcmFsLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJKb3NoIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9lamIvbGliL015UmVtb3RlSW50ZXJmYWNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9lamIvbGliL015UmVtb3RlSW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1MzQ4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2VqYi9saWIvTXlSZW1vdGVJbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo1OS5lamIubGliOworCisvKioKKyAqIE1hcmtlciBpbnRlcmZhY2UgZm9yIHJlbW90ZSBiZWFucy4gUGFydCBvZiBDREkgZXh0ZW5zaW9uIGxvb2t1cCBpc3N1ZSByZXByb2R1Y2VyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTXlSZW1vdGVJbnRlcmZhY2UgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai01OS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTI0MDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3BvbS54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmotNTk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tai01OTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSi01OSBSZXByb2R1Y2VyOiBDREkgZXh0ZW5zaW9uIGxvb2t1cCBpbiBtdWx0aS1tb2R1bGUgYXBwIHRvIEplcnNleSAyLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5lYXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5saWI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT53YXI8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgzNTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvcG9tLnhtbApAQCAtMCwwICsxLDEwNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qLTU5LWNkaS13YXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tai01OS1jZGktd2FyPC9uYW1lPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qLTU5LWVqYi1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnN0YWxsLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9jZGkvd2ViL0NkaUJhY2tlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9jZGkvd2ViL0NkaUJhY2tlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0ODNkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvQ2RpQmFja2VkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo1OS5jZGkud2ViOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmF4Lmp3cy5XZWJSZXN1bHQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo1OS5lamIubGliLkxvY2FsQmVhbldpdGhSZW1vdGVJbnRlcmZhY2U7CisKKy8qKgorICogUGFydCBvZiBDREkgZXh0ZW5zaW9uIGxvb2t1cCBpc3N1ZSByZXByb2R1Y2VyLgorICogVGhpcyBiZWFuIHdpbGwgQ0RJLWluamVjdCBhIGxvY2FsIEVKQiBiZWFuLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJuYW1lIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgQ2RpQmFja2VkUmVzb3VyY2UgaW1wbGVtZW50cyBSZXNvdXJjZU1hcmtlckludGVyZmFjZSB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBMb2NhbEJlYW5XaXRoUmVtb3RlSW50ZXJmYWNlIGxvY2FsQmVhbjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgiaGVsbG8iKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBAV2ViUmVzdWx0KG5hbWUgPSAiaGVsbG8iKQorICAgIHB1YmxpYyBTdHJpbmcgc2F5SGVsbG8oKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gIiArIGxvY2FsQmVhbi5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvY2RpL3dlYi9KYXhSc0NvbmZpZ3VyYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvSmF4UnNDb25maWd1cmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2MTI1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvSmF4UnNDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNTkuY2RpLndlYjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQ0RJIGV4dGVuc2lvbiBsb29rdXAgaXNzdWUgcmVwcm9kdWNlciBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoInJlc291cmNlcyIpCitwdWJsaWMgY2xhc3MgSmF4UnNDb25maWd1cmF0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgICAgICBhZGQoQ2RpQmFja2VkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9fTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9jZGkvd2ViL1Jlc291cmNlTWFya2VySW50ZXJmYWNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9jZGkvd2ViL1Jlc291cmNlTWFya2VySW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1NDhjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvUmVzb3VyY2VNYXJrZXJJbnRlcmZhY2UuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo1OS5jZGkud2ViOworCisvKioKKyAqIE1hcmtlciBpbnRlcmZhY2UgZm9yIENESSBiYWNrZWQgSkFYLVJTIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1hcmtlckludGVyZmFjZSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1YzJjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2JlYW5zXzFfMC54c2QiPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OWEyYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCkBAIC0wLDAgKzEsMjkgQEAKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+Q0RJIEV4dGVuc2lvbiBMb29rdXAgSXNzdWUgUmVwcm9kdWNlcjwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorICAgICAgICBWaXNpdCA8YSBocmVmPSJyZXNvdXJjZXMvbmFtZS9oZWxsbyI+cmVzb3VyY2VzL25hbWUvaGVsbG88L2E+CisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvY2RpL3dlYi9OYW1lQmVhblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvTmFtZUJlYW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4NzBhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvTmFtZUJlYW5UZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNTkuY2RpLndlYjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgQ0RJIGV4dGVuc2lvbiBsb29rdXAgaXNzdWUuIFNob3VsZCB0aGUgZXh0ZW5zaW9uIGxvb2t1cCBoYXZlIGZhaWxlZCwKKyAqIHdlIHdvdWxkIG5vdCBnZXQgdGhlIGNvcnJlY3QgcmVzcG9uc2UgaGVyZS4KKyAqIDxwLz4KKyAqIFJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgLi4vZWpiLWpheC1ycy1lYXIxL3RhcmdldC9lamItamF4LXJzLWVhcjEKKyAqIG12biAtRHNraXBUZXN0cz1mYWxzZSB0ZXN0PC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE5hbWVCZWFuVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0NvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJqLTU5LWNkaS13YXIiKS5wYXRoKCJyZXNvdXJjZXMiKS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENkaVJlc291cmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgibmFtZSIpLnBhdGgoImhlbGxvIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudCA9IHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHIuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KGNvbnRlbnQsIGVxdWFsVG8oIkhlbGxvIEpvc2giKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzkyYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qYXhycy1jb21wb25lbnQtaW5qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWNvbXBvbmVudC1pbmplY3Q8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEpheHJzIENvbXBvbmVudCBJbmplY3Q8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9QcmludGluZ0Vycm9ySGFuZGxlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9QcmludGluZ0Vycm9ySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NzY5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1ByaW50aW5nRXJyb3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5qYXhycy5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBFeGNlcHRpb24gbWFwcGVyIHByaW50aW5nIHRoZSB7QGxpbmsgU3RhdHVzI05PVF9BQ0NFUFRBQkxFfSBlcnJvci4KKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgUHJpbnRpbmdFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VGhyb3dhYmxlPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKKworICAgICAgICBXcml0ZXIgcmVzdWx0ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihyZXN1bHQpOworICAgICAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKHByaW50V3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhTdGF0dXMuTk9UX0FDQ0VQVEFCTEUpLmVudGl0eShyZXN1bHQudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyYTk2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5qYXhycy5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworLyoqCisgKiBSZXNvdXJjZSB3aXRoIHtAbGluayBDb250ZXh0fSBpbmplY3Rpb24gcG9pbnRzLgorICovCitAUGF0aCgicmVzb3VyY2UiKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgQXBwbGljYXRpb24gYXBwbGljYXRpb247CisgICAgQENvbnRleHQKKyAgICBVcmlJbmZvIGluZm87CisgICAgQENvbnRleHQKKyAgICBSZXF1ZXN0IHJlcXVlc3Q7CisgICAgQENvbnRleHQKKyAgICBIdHRwSGVhZGVycyBoZWFkZXJzOworICAgIEBDb250ZXh0CisgICAgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5OworICAgIEBDb250ZXh0CisgICAgUHJvdmlkZXJzIHByb3ZpZGVyczsKKyAgICBAQ29udGV4dAorICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZXM7CisgICAgQENvbnRleHQKKyAgICBDb25maWd1cmF0aW9uIGNvbmZpZ3JhdGlvbjsKKworICAgIEBQT1NUCisgICAgQFBhdGgoImVjaG8iKQorICAgIHB1YmxpYyBTdHJpbmcgcmV0dXJuR2l2ZW5TdHJpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gc3RyaW5nOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoInJlYWRlciIpCisgICAgcHVibGljIFN0cmluZyByZWFkZXIoU3RyaW5nQmVhbiBiZWFuKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldCgpOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoIndyaXRlciIpCisgICAgcHVibGljIFN0cmluZ0JlYW4gd3JpdGVyKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCZWFuKGVudGl0eSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJpbnN0YW5jZSIpCisgICAgcHVibGljIFN0cmluZyBpbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0JlYW5FbnRpdHlQcm92aWRlcldpdGhJbmplY3RhYmxlcy5jb21wdXRlTWFzayhhcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICBpbmZvLCByZXF1ZXN0LCBoZWFkZXJzLCBzZWN1cml0eSwgcHJvdmlkZXJzLCByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgY29uZmlncmF0aW9uKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1ldGhvZCIpCisgICAgcHVibGljIFN0cmluZyBtZXRob2QoQENvbnRleHQgQXBwbGljYXRpb24gYXBwbGljYXRpb24sCisgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIGluZm8sIEBDb250ZXh0IFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsIEBDb250ZXh0IFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eSwKKyAgICAgICAgICAgIEBDb250ZXh0IFByb3ZpZGVycyBwcm92aWRlcnMsIEBDb250ZXh0IFJlc291cmNlQ29udGV4dCByZXNvdXJjZXMpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0JlYW5FbnRpdHlQcm92aWRlcldpdGhJbmplY3RhYmxlcy5jb21wdXRlTWFzayhhcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICBpbmZvLCByZXF1ZXN0LCBoZWFkZXJzLCBzZWN1cml0eSwgcHJvdmlkZXJzLCByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgY29uZmlncmF0aW9uKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImFwcGxpY2F0aW9uIikKKyAgICBwdWJsaWMgU3RyaW5nIGFwcGxpY2F0aW9uKEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisgICAgICAgIFNldDxPYmplY3Q+IHNpbmdsZXRvbnMgPSBhcHBsaWNhdGlvbi5nZXRTaW5nbGV0b25zKCk7CisgICAgICAgIFNpbmdsZXRvbldpdGhJbmplY3RhYmxlcyBzaW5nbGV0b24gPSAoU2luZ2xldG9uV2l0aEluamVjdGFibGVzKSBzaW5nbGV0b25zCisgICAgICAgICAgICAgICAgLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICByZXR1cm4gc2luZ2xldG9uLmdldEluamVjdGVkQ29udGV4dFZhbHVlcygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TaW5nbGV0b25XaXRoSW5qZWN0YWJsZXMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvU2luZ2xldG9uV2l0aEluamVjdGFibGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjYTg0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvU2luZ2xldG9uV2l0aEluamVjdGFibGVzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5qYXhycy5pbmplY3Q7CisKKy8qKgorICogSG9sZGVyIGZvciBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgU2luZ2xldG9uV2l0aEluamVjdGFibGVzIHsKKworICAgIHByaXZhdGUgVFNBcHBDb25maWcgY29uZmlnOworCisgICAgcHVibGljIFNpbmdsZXRvbldpdGhJbmplY3RhYmxlcyhUU0FwcENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbmplY3RlZENvbnRleHRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBjb25maWcuZ2V0SW5qZWN0ZWRDb250ZXh0VmFsdWVzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TdHJpbmdCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1N0cmluZ0JlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGJkOThkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TdHJpbmdCZWFuLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5qYXhycy5pbmplY3Q7CisKKy8qKgorICogVGhpcyBpcyB0aGUgb2JqZWN0IHdoaWNoIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhdmUgYSBwcm92aWRlcgorICogZm9yLCBldmVuIHRob3VnaCBpdHMgc29tZSBzaW1wbGUgU3RyaW5nIGhvbGRlci4gSXQgY2FuIGFsc28gYmUgdXNlZCBhcyBtdXRhYmxlCisgKiBzdHJpbmcuCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdCZWFuIHsKKyAgICBwcml2YXRlIFN0cmluZyBoZWFkZXI7CisKKyAgICBwdWJsaWMgU3RyaW5nQmVhbihTdHJpbmcgaGVhZGVyKSB7CisgICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gaGVhZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldChTdHJpbmcgaGVhZGVyKSB7CisgICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiU3RyaW5nQmVhbi4gVG8gZ2V0IGEgdmFsdWUsIHVzZSByYXRoZXIgI2dldCgpIG1ldGhvZC4iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1N0cmluZ0JlYW5FbnRpdHlQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTIwYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1N0cmluZ0JlYW5FbnRpdHlQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuamF4cnMuaW5qZWN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogUHJvdmlkZXIgZm9yIEpBWC1SUyB0eXBlcyB7QGxpbmsgTWVzc2FnZUJvZHlSZWFkZXJ9IGFuZCB7QGxpbmsgTWVzc2FnZUJvZHlXcml0ZXJ9LgorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBTdHJpbmdCZWFuRW50aXR5UHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxTdHJpbmdCZWFuPiwgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nQmVhbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gU3RyaW5nQmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nQmVhbiB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0LmdldCgpLmxlbmd0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nQmVhbiB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUodC5nZXQoKS5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGlzV3JpdGVhYmxlKHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nQmVhbiByZWFkRnJvbShDbGFzczxTdHJpbmdCZWFuPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TdHJpbmdCZWFuRW50aXR5UHJvdmlkZXJXaXRoSW5qZWN0YWJsZXMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyV2l0aEluamVjdGFibGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NTA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyV2l0aEluamVjdGFibGVzLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuamF4cnMuaW5qZWN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCisvKioKKyAqIFByb3ZpZGVyIHdpdGgge0BsaW5rIENvbnRleHR9IGluamVjdGlvbiBwb2ludHMuCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIFN0cmluZ0JlYW5FbnRpdHlQcm92aWRlcldpdGhJbmplY3RhYmxlcyBleHRlbmRzIFN0cmluZ0JlYW5FbnRpdHlQcm92aWRlciB7CisKKyAgICBAQ29udGV4dAorICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworICAgIEBDb250ZXh0CisgICAgVXJpSW5mbyBpbmZvOworICAgIEBDb250ZXh0CisgICAgUmVxdWVzdCByZXF1ZXN0OworICAgIEBDb250ZXh0CisgICAgSHR0cEhlYWRlcnMgaGVhZGVyczsKKyAgICBAQ29udGV4dAorICAgIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eTsKKyAgICBAQ29udGV4dAorICAgIFByb3ZpZGVycyBwcm92aWRlcnM7CisgICAgQENvbnRleHQKKyAgICBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VzOworICAgIEBDb250ZXh0CisgICAgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworCisgICAgLyoqCisgICAgICogQ2hvc2VuIGRlY2ltYWwgYXMgYSByZXByZXNlbnRhdGlvbiB0byBiZSBtb3JlIGh1bWFuIHJlYWRhYmxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1hc2soQXBwbGljYXRpb24gYXBwbGljYXRpb24sIFVyaUluZm8gaW5mbywKKyAgICAgICAgICAgIFJlcXVlc3QgcmVxdWVzdCwgSHR0cEhlYWRlcnMgaGVhZGVycywgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5LAorICAgICAgICAgICAgUHJvdmlkZXJzIHByb3ZpZGVycywgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlcywKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICBpbnQgbWFzayA9IDE7CisgICAgICAgIG1hc2sgPSAxMCAqIG1hc2sgKyAoYXBwbGljYXRpb24gPT0gbnVsbCA/IDAgOiAxKTsKKyAgICAgICAgbWFzayA9IDEwICogbWFzayArIChpbmZvID09IG51bGwgPyAwIDogMSk7CisgICAgICAgIG1hc2sgPSAxMCAqIG1hc2sgKyAocmVxdWVzdCA9PSBudWxsID8gMCA6IDEpOworICAgICAgICBtYXNrID0gMTAgKiBtYXNrICsgKGhlYWRlcnMgPT0gbnVsbCA/IDAgOiAxKTsKKyAgICAgICAgbWFzayA9IDEwICogbWFzayArIChzZWN1cml0eSA9PSBudWxsID8gMCA6IDEpOworICAgICAgICBtYXNrID0gMTAgKiBtYXNrICsgKHByb3ZpZGVycyA9PSBudWxsID8gMCA6IDEpOworICAgICAgICBtYXNrID0gMTAgKiBtYXNrICsgKHJlc291cmNlcyA9PSBudWxsID8gMCA6IDEpOworICAgICAgICBtYXNrID0gMTAgKiBtYXNrICsgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCA/IDAgOiAxKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKG1hc2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlcmUsIHRoZSBiaXR3aXNlIG9wZXJhdGlvbiB3aXRoIG1hc2sgdmFyaWFibGUgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsCisgICAgICogYnV0IGxlc3MgaHVtYW4gcmVhZGFibGUgd2hlbiBzZW5kaW5nIG92ZXIgdGhlIGxpbmsgYXMgYSBiaW5hcnkgbnVtYmVyLgorICAgICAqIEhlbmNlLCBzTWFzayBpcyBzdXBwb3NlZCB0byBiZSBkZWNpbWFsIG51bWJlciBjcmVhdGVkIGJ5IHdyaXRlVG8gbWV0aG9kLgorICAgICAqIDxwPgorICAgICAqIElmIHNvbWV0aGluZyBoYXMgbm90IGJlZW4gaW5qZWN0ZWQsIGFuZCB0aHVzIG5vdCB3cml0dGVuIGJ5IHdyaXRlVG8sIHRoaXMKKyAgICAgKiBzdGF0aWMgbWV0aG9kIHBhcnNlcyB3aGF0IGl0IHdhcyBub3QgaW5qZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm90SW5qZWN0ZWQoU3RyaW5nIHNNYXNrKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSAhPSBzTWFzay5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQobm90SW5qZWN0ZWQoc01hc2ssIGkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZXJlLCB0aGUgYml0d2lzZSBvcGVyYXRpb24gd2l0aCBtYXNrIHZhcmlhYmxlIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50LAorICAgICAqIGJ1dCBsZXNzIGh1bWFuIHJlYWRhYmxlIHdoZW4gc2VuZGluZyBvdmVyIHRoZSBsaW5rIGFzIGEgYmluYXJ5IG51bWJlci4KKyAgICAgKiBIZW5jZSwgc01hc2sgaXMgc3VwcG9zZWQgdG8gYmUgZGVjaW1hbCBudW1iZXIgY3JlYXRlZCBieSB3cml0ZVRvIG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBzb21ldGhpbmcgaGFzIG5vdCBiZWVuIGluamVjdGVkLCBhbmQgdGh1cyBub3Qgd3JpdHRlbiBieSB3cml0ZVRvLCB0aGlzCisgICAgICogc3RhdGljIG1ldGhvZCBwYXJzZXMgd2hhdCBpdCB3YXMgbm90IGluamVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIG5vdEluamVjdGVkKFN0cmluZyBzTWFzaywgaW50IGluZGV4KSB7CisgICAgICAgIFN0cmluZ1tdIGxhYmVscyA9IHsKKyAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24sIiwgIlVyaUluZm8sIiwgIlJlcXVlc3QsIiwKKyAgICAgICAgICAgICAgICAiSHR0cEhlYWRlcnMsIiwgIlNlY3VyaXR5Q29udGV4dCwiLCAiUHJvdmlkZXJzLCIsCisgICAgICAgICAgICAgICAgIlJlc291cmNlQ29udGV4dCIsICJDb25maWd1cmF0aW9uIgorICAgICAgICB9OworICAgICAgICBTdHJpbmcgbGFiZWwgPSAiIjsKKyAgICAgICAgaWYgKHNNYXNrLmNoYXJBdChpbmRleCkgPT0gJzAnKSB7CisgICAgICAgICAgICBsYWJlbCA9IGxhYmVsc1tpbmRleCAtIDFdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZ0JlYW4gdCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gOTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZ0JlYW4gdCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGNvbXB1dGVNYXNrKGFwcGxpY2F0aW9uLCBpbmZvLCByZXF1ZXN0LCBoZWFkZXJzLAorICAgICAgICAgICAgICAgIHNlY3VyaXR5LCBwcm92aWRlcnMsIHJlc291cmNlcywgY29uZmlndXJhdGlvbikuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ0JlYW4gcmVhZEZyb20oQ2xhc3M8U3RyaW5nQmVhbj4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmVhbihjb21wdXRlTWFzayhhcHBsaWNhdGlvbiwgaW5mbywgcmVxdWVzdCwgaGVhZGVycywKKyAgICAgICAgICAgICAgICBzZWN1cml0eSwgcHJvdmlkZXJzLCByZXNvdXJjZXMsIGNvbmZpZ3VyYXRpb24pKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvVFNBcHBDb25maWcuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvVFNBcHBDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDEwMWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9UU0FwcENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuamF4cnMuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCisvKioKKyAqIEFwcGxpY2F0aW9uIENvbmZpZ3VyYXRpb24gd2l0aCB7QGxpbmsgQ29udGV4dH0gaW5qZWN0aW9uIHBvaW50cy4KKyAqLworcHVibGljIGNsYXNzIFRTQXBwQ29uZmlnIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQENvbnRleHQKKyAgICBVcmlJbmZvIGluZm87CisgICAgQENvbnRleHQKKyAgICBSZXF1ZXN0IHJlcXVlc3Q7CisgICAgQENvbnRleHQKKyAgICBIdHRwSGVhZGVycyBoZWFkZXJzOworICAgIEBDb250ZXh0CisgICAgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5OworICAgIEBDb250ZXh0CisgICAgUHJvdmlkZXJzIHByb3ZpZGVyczsKKyAgICBAQ29udGV4dAorICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZXM7CisKKyAgICBwdWJsaWMgamF2YS51dGlsLlNldDxqYXZhLmxhbmcuQ2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIFNldDxDbGFzczw/Pj4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICByZXNvdXJjZXMuYWRkKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZChTdHJpbmdCZWFuRW50aXR5UHJvdmlkZXJXaXRoSW5qZWN0YWJsZXMuY2xhc3MpOworICAgICAgICByZXNvdXJjZXMuYWRkKFByaW50aW5nRXJyb3JIYW5kbGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgT2JqZWN0IHNpbmdsZSA9IG5ldyBTaW5nbGV0b25XaXRoSW5qZWN0YWJsZXModGhpcyk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oc2luZ2xlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluamVjdGVkQ29udGV4dFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0JlYW5FbnRpdHlQcm92aWRlcldpdGhJbmplY3RhYmxlcy5jb21wdXRlTWFzaygKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNwZWM6IDkuMi4xIEFwcGxpY2F0aW9uIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSBpbmplY3RlZCBpbnRvIHRoZSBBcHBsaWNhdGlvbiBzdWJjbGFzcyBpdHNlbGYgc2luY2UgdGhpcyB3b3VsZAorICAgICAgICAgICAgICAgICAqIGNyZWF0ZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuCisgICAgICAgICAgICAgICAgICogKi8KKyAgICAgICAgICAgICAgICB0aGlzLCBpbmZvLCByZXF1ZXN0LCBoZWFkZXJzLCBzZWN1cml0eSwgcHJvdmlkZXJzLCByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBpbmplY3Rpb24gTi9BIG9uIEFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS5nZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzA3ODQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5DVFNKQVhSU0NvbnRleHRTZXJ2ZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmpheHJzLmluamVjdC5UU0FwcENvbmZpZzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Q1RTSkFYUlNDb250ZXh0U2VydmVyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgICAgPHNlc3Npb24tY29uZmlnPgorICAgICAgICA8c2Vzc2lvbi10aW1lb3V0PjMwPC9zZXNzaW9uLXRpbWVvdXQ+CisgICAgPC9zZXNzaW9uLWNvbmZpZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvQXBwbGljYXRpb25JbmplY3RJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvQXBwbGljYXRpb25JbmplY3RJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGMxZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9BcHBsaWNhdGlvbkluamVjdElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuamF4cnMuaW5qZWN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db250ZXh0fSBpbmplY3Rpb24gaW50byBKQVgtUlMgY29tcG9uZW50cyBQcm92aWRlciwgUmVzb3VyY2UsIEFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25JbmplY3RJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCk7CisgICAgICAgIHQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBSZXNwb25zZSByID0gdC5wYXRoKCIvcmVzb3VyY2UvaW5zdGFuY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjExMTExMTExMSIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoKTsKKyAgICAgICAgdC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnBhdGgoIi9yZXNvdXJjZS9tZXRob2QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjExMTExMTExMSIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoKTsKKyAgICAgICAgdC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnBhdGgoIi9yZXNvdXJjZS9hcHBsaWNhdGlvbiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTExMTExMTExIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMTA3L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTEwNy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZWE5MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTEwNy9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMTEwNzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMTEwNzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMTEwNyAtIFRocmVhZCBnZXRzIHN0dWNrZWQgaWYgbm8gTWVzc2FnZUJvZHlXcml0ZXIgaXMgZm91bmQgaW4gQXBwbGljYXRpb25IYW5kbGVyI3dyaXRlUmVzcG9uc2U8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTEwNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTExMDcvSmVyc2V5MTEwNy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMTA3L0plcnNleTExMDcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDczZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMTA3L0plcnNleTExMDcuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxMTA3OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MTEwNyBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgTWVzc2FnZUJvZHlXcml0ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgImV4Y2VwdGlvbi9udWxscG9pbnRlcmV4Y2VwdGlvbiIgbWVkaWEgdHlwZSByZXF1aXJlZCBieSB0aGUKKyAgICAgKiB7QGNvZGUgUmVzb3VyY2UjZ2V0TnBlKCl9IG1ldGhvZCB3aGljaCBzaG91bGQgcmVzdWx0IGluIGFuIGVtcHR5IHtAY29kZSBNZXNzYWdlQm9keVdyaXRlcn0gYW5kIHRoZXJlZm9yZQorICAgICAqIGFuIE5QRSBpbiB7QGNvZGUgQXBwbGljYXRpb25IYW5kbGVyfS4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTEwNy5KZXJzZXkxMTA3LlJlc291cmNlI2dldE5wZSgpCisgICAgICovCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKHsiZXhjZXB0aW9uL2lvZXhjZXB0aW9uIiwgImV4Y2VwdGlvbi93ZWJhcHBsaWNhdGlvbmV4Y2VwdGlvbiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uVGhyb3dlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZSgKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBJT0V4Y2VwdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpIHx8IFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiB0LAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGUsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIENhbm5vdCB3cml0ZSBhbnl0aGluZyBpbnRvIHRoZSBlbnRpdHlTdHJlYW0gdG8gZW5zdXJlIHRoZSBDb250YWluZXJSZXNwb25zZVdyaXRlciN3cml0ZVJlc3BvbnNlU3RhdHVzQW5kSGVhZGVycworICAgICAgICAgICAgLy8gaW4gQXBwbGljYXRpb25IYW5kbGVyI3dyaXRlUmVzcG9uc2UgaXMgbm90IGludm9rZWQuCisKKyAgICAgICAgICAgIC8vIFNpbXBseSB0aHJvdyB0aGUgZ2l2ZW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvaW9lIikKKyAgICAgICAgQFByb2R1Y2VzKCJleGNlcHRpb24vaW9leGNlcHRpb24iKQorICAgICAgICBwdWJsaWMgSU9FeGNlcHRpb24gZ2V0SW9lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJT0V4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL3dhZSIpCisgICAgICAgIEBQcm9kdWNlcygiZXhjZXB0aW9uL3dlYmFwcGxpY2F0aW9uZXhjZXB0aW9uIikKKyAgICAgICAgcHVibGljIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGdldFdhZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9ucGUiKQorICAgICAgICBAUHJvZHVjZXMoImV4Y2VwdGlvbi9udWxscG9pbnRlcmV4Y2VwdGlvbiIpCisgICAgICAgIHB1YmxpYyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBnZXROcGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGlzIG1lc3NhZ2Ugc2hvdWxkIG5ldmVyIGdldCB0byB0aGUgY2xpZW50ISIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgICAgIGFkZChSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoRXhjZXB0aW9uVGhyb3dlci5jbGFzcyk7CisgICAgICAgIH19OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMTA3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxNDRmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMTA3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiCisgICAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxMTA3LkplcnNleTExMDc8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMTA3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTEwNy9BcHBsaWNhdGlvbkhhbmRsZXJJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMTA3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTEwNy9BcHBsaWNhdGlvbkhhbmRsZXJJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNiMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMTA3L0FwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTExMDc7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdHMgZm9yIEpFUlNFWS0xMTA3OiBUaHJlYWQgZ2V0cyBzdHVjayBpZiBubyBNZXNzYWdlQm9keVdyaXRlciBpcyBmb3VuZCBpbiBBcHBsaWNhdGlvbkhhbmRsZXIjd3JpdGVSZXNwb25zZS4KKyAqIDxwLz4KKyAqIElmIGFuIGV4Y2VwdGlvbiAoZS5nLiBOUEUgY2F1c2VkIGJ5IG5vbi1leGlzdGVudCBNZXNzYWdlQm9keVdyaXRlcikgaXMgdGhyb3duIGluIEFwcGxpY2F0aW9uSGFuZGxlciN3cml0ZVJlc3BvbnNlIGJlZm9yZQorICogaGVhZGVycyBhbmQgcmVzcG9uc2Ugc3RhdHVzIGFyZSB3cml0dGVuIGJ5IENvbnRhaW5lclJlc3BvbnNlV3JpdGVyI3dyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzIHRoZW4gdGhlCisgKiBDb250YWluZXJSZXNwb25zZVdyaXRlciNjb21taXQgaW4gdGhlIGZpbmFsbHkgY2xhdXNlIHdpbGwgc3R1Y2sgdGhlIHRocmVhZC4KKyAqIDxwLz4KKyAqIFRoZSBwdXJwb3NlIG9mIHRoZSB0ZXN0cyBiZWxvdyBpcyB0byBzaG93IHRoYXQgYSByZXNwb25zZSBpcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgYW5kIG5vbmUgb2YgdGhlIHRocmVhZHMgZ2V0cyBzdHVjay4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpLnJlZ2lzdGVySW5zdGFuY2VzKG5ldyBKZXJzZXkxMTA3KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgdGhyZWFkIGdldHMgc3R1Y2sgd2hlbiBhbiB7QGNvZGUgSU9FeGNlcHRpb259IGlzIHRocm93biBmcm9tIHRoZSB7QGNvZGUKKyAgICAgKiBNZXNzYWdlQm9keVdyaXRlciN3cml0ZVRvfS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJT0V4Y2VwdGlvbkluV3JpdGVSZXNwb25zZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdEV4Y2VwdGlvbkluV3JpdGVSZXNwb25zZU1ldGhvZCgiaW9lIiwgImV4Y2VwdGlvbi9pb2V4Y2VwdGlvbiIsIFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBhIHRocmVhZCBnZXRzIHN0dWNrIHdoZW4gYW4ge0Bjb2RlIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSBpcyB0aHJvd24gZnJvbSB0aGUge0Bjb2RlCisgICAgICogTWVzc2FnZUJvZHlXcml0ZXIjd3JpdGVUb30uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViQXBwbGljYXRpb25FeGNlcHRpb25JbldyaXRlUmVzcG9uc2VNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RFeGNlcHRpb25JbldyaXRlUmVzcG9uc2VNZXRob2QoIndhZSIsICJleGNlcHRpb24vd2ViYXBwbGljYXRpb25leGNlcHRpb24iLCBSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYSB0aHJlYWQgZ2V0cyBzdHVjayB3aGVuIG5vIHtAY29kZSBNZXNzYWdlQm9keVdyaXRlcn0gaXMgZm91bmQgYW5kIHRoZXJlZm9yZSBhbiB7QGNvZGUgTlBFfSBpcyB0aHJvd24KKyAgICAgKiB3aGVuIHRyeWluZyB0byBpbnZva2Uge0Bjb2RlIE1lc3NhZ2VCb2R5V3JpdGVyI3dyaXRlVG99IG9uIGFuIGVtcHR5IG9iamVjdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsUG9pbnRlckV4Y2VwdGlvbkluV3JpdGVSZXNwb25zZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdEV4Y2VwdGlvbkluV3JpdGVSZXNwb25zZU1ldGhvZCgibnBlIiwgImV4Y2VwdGlvbi9udWxscG9pbnRlcmV4Y2VwdGlvbiIsIFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgKHdpdGggdGhlIHdob2xlIHByb2Nlc3MgdGltZSBzZXQgdG8gdGhlIG1heGltdW0gb2YgNSBzZWNvbmRzKSBmb3IgdGhlIGdpdmVuIHtAY29kZSBwYXRofQorICAgICAqIGFuZCB7QGNvZGUgbWVkaWFUeXBlfSB0aGF0IHNob3VsZCByZXN1bHQgaW4gdGhlIHtAY29kZSBleHBlY3RlZFJlc3BvbnNlfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RFeGNlcHRpb25JbldyaXRlUmVzcG9uc2VNZXRob2QoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlLlN0YXR1cyBleHBlY3RlZFJlc3BvbnNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRXhlY3V0b3IuCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworCisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSBleGVjdXRvci5zdWJtaXQobmV3IENhbGxhYmxlPFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQoKS5wYXRoKHBhdGgpLnJlcXVlc3QobWVkaWFUeXBlKS5nZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9KTsKKworICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICBmaW5hbCBib29sZWFuIGluVGltZSA9IGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKworICAgICAgICAvLyBBc3NlcnRzLgorICAgICAgICBhc3NlcnRUcnVlKGluVGltZSk7CisKKyAgICAgICAgLy8gUmVzcG9uc2UuCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzcG9uc2VGdXR1cmUuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTIyMy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTEyMjMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmM5ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTEyMjMvcG9tLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMTIyMzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMTIyMzwvbmFtZT4KKyAgICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0xMjIzIC0gIjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiIGZvciBQT1NUIHJlcXVlc3Qgd2l0aCBnYXJiYWdlIGluc3RlYWQgb2YKKyAgICAgICAgIkNvbnRlbnQtVHlwZSIKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTIyMy9KZXJzZXkxMjIzLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTIyMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTEyMjMvSmVyc2V5MTIyMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmNkM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTIyMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTEyMjMvSmVyc2V5MTIyMy5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTIyMzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxMjIzIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQFBhdGgodmFsdWUgPSAiL0NvbnRlbnRUeXBlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRlbnRUeXBlUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcyh2YWx1ZSA9ICJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWRQYXJhbWV0ZXJzIiwgIkphdmFEb2MifSkKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdFRlc3QoZmluYWwgU3RyaW5nIHN0cikgeworICAgICAgICAgICAgLy8gSWdub3JlIHRvIGdlbmVyYXRlIHJlc3BvbnNlIDIwNCAtIE5vQ29udGVudC4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48Q2xhc3M8Pz4+c2luZ2xldG9uKENvbnRlbnRUeXBlUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTIyMy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MzQ4MjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTIyMy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDCisgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKKyAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIiA+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTEyMjMuSmVyc2V5MTIyMzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworPC93ZWItYXBwPgorCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTIyMy9BcHBsaWNhdGlvbkhhbmRsZXJJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTIyMy9BcHBsaWNhdGlvbkhhbmRsZXJJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWEzNDcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTEyMjMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMjIzL0FwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTIyMzsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgSkVSU0VZIGlzc3VlIDEyMjMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkhhbmRsZXJJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmVyc2V5MTIyMy5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ29udGVudFR5cGVIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyAiQ29udGVudFR5cGUiKTsKKyAgICAgICAgZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7CisKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAidGV4dC9wbGFpbiIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL2pzb24sIGFwcC9qc29uIik7CisKKyAgICAgICAgY29ubmVjdGlvbi5zZXREb091dHB1dCh0cnVlKTsKKyAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCk7CisKKyAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IGNvbm5lY3Rpb24uZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgiSGVsbG9Xb3JsZCEiLmdldEJ5dGVzKCkpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoJ1xuJyk7CisgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTYwNC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZWM3YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTYwNC9wb20ueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPmplcnNleS0xNjA0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0xNjA0PC9uYW1lPgorICAgIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMTYwNCAtIElPRXhjZXB0aW9uICJjb25uZWN0aW9uIGNsb3NlZCIgaGFwcGVucyBvbiBjYWxsaW5nIGRlbGV0ZSB3aXRob3V0IHBhcmFtZXRlcnM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYXBhY2hlLWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjA0L0plcnNleTE2MDQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTYwNC9KZXJzZXkxNjA0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhMmJiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTYwNC9KZXJzZXkxNjA0LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxNjA0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogQXBwbGljYXRpb24gY2xhc3Mgd2l0aCB0ZXN0IHJlc291cmNlIHRoYXQgc2V0cyB7QGNvZGUgQ29ubmVjdGlvbn0gaGVhZGVyIHRvIHtAY29kZSBjbG9zZX0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxNjA0IGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDbGFzczw/Pj5zaW5nbGV0b24oVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlbGV0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJDb25uZWN0aW9uIiwgImNsb3NlIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTYwNC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2MDQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFhYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2MDQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQworICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCisgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCIgPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiCisgICAgICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxNjA0LkplcnNleTE2MDQ8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKzwvd2ViLWFwcD4KKworCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTYwNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2MDQvQ29ubmVjdGlvbkNsb3NlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTYwNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2MDQvQ29ubmVjdGlvbkNsb3NlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3Y2JmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTYwNC9Db25uZWN0aW9uQ2xvc2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE2MDQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3RzIEpFUlNFWSBpc3N1ZSAxNjA0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkNsb3NlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEplcnNleTE2MDQuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuaGVhZGVyKCJDb25uZWN0aW9uIiwgImNsb3NlIikuZGVsZXRlKCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5oYXNFbnRpdHkoKSwgaXMoZmFsc2UpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2NjcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAyNDNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2NjcvcG9tLnhtbApAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTE2Njc8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTE2Njc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTE2NjcgLSBJbmNvcnJlY3QgaGFuZGxpbmcgb2YgZmlsZSB1cGxvYWQgZXJyb3JzIHdoZW4gdGVtcCBmaWxlcyBjYW5ub3QgYmUgd3JpdHRlbjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2Njcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjY3L0lzc3VlMTY2N1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2NjcvSXNzdWUxNjY3UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJhNjRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2Njcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjY3L0lzc3VlMTY2N1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxNjY3OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBJc3N1ZTE2NjdSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJwYXJ0LWZpbGUtbmFtZSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBKQorICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgKKyAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJwYXJ0IikgU3RyaW5nIHMsCisgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgicGFydCIpIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGQpIHsKKyAgICAgICAgcmV0dXJuIHMgKyAiOiIgKyBkLmdldEZpbGVOYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2Njcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjY3L0plcnNleTE2NjcuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTY2Ny9KZXJzZXkxNjY3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2NjIzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTY2Ny9KZXJzZXkxNjY3LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxNjY3OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0xNjY3IHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTE2NjcgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MTY2NygpIHsKKyAgICAgICAgcmVnaXN0ZXIoSXNzdWUxNjY3UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICByZWdpc3RlcihuZXcgTXVsdGlQYXJ0UHJvcGVydGllcygpLmJ1ZmZlclRocmVzaG9sZCg4MTkyKS50ZW1wRGlyKCIvbm9uLWV4aXN0ZW50LWRpcmVjdG9yeSIpLnJlc29sdmVyKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTc3MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MTY2N1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE2NjcuSmVyc2V5MTY2NzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MTY2N1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTY2Ny9KZXJzZXkxNjY3SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2NjcvSmVyc2V5MTY2N0lUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTUyM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2NjcvSmVyc2V5MTY2N0lUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTY2NzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFCb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnRGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yMTYwLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MTY2N0lUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgbWV0aG9kIGZvciBKRVJTRVktMTY2Ny4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkxNjY3Rml4KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicGFydC1maWxlLW5hbWUiKTsKKworICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhclsxMCAqIDEwMjRdOworICAgICAgICBBcnJheXMuZmlsbChjaGFycywgJ2EnKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGJvZHkgPSBuZXcgU3RyaW5nKGNoYXJzKTsKKworICAgICAgICBmaW5hbCBGb3JtRGF0YU11bHRpUGFydCBtdWx0aVBhcnQgPSBuZXcgRm9ybURhdGFNdWx0aVBhcnQoKTsKKyAgICAgICAgZmluYWwgRm9ybURhdGFCb2R5UGFydCBib2R5UGFydCA9IG5ldyBGb3JtRGF0YUJvZHlQYXJ0KEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLm5hbWUoInBhcnQiKS5maWxlTmFtZSgiZmlsZSIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgYm9keSk7CisgICAgICAgIG11bHRpUGFydC5ib2R5UGFydChib2R5UGFydCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShtdWx0aVBhcnQsIE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDUwMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODI5L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZjE1OTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9wb20ueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPmplcnNleS0xODI5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0xODI5PC9uYW1lPgorICAgIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KKworCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0xODI5IC0gQ3VzdG9tIHJlYXNvbiBwaHJhc2UgaW4gcmVzcG9uc2Ugc3RhdHVzIGRvZXMgbm90IHdvcms8L2Rlc2NyaXB0aW9uPgorCisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4MjkvSmVyc2V5MTgyOS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4Mjkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODI5L0plcnNleTE4MjkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM5OGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4Mjkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODI5L0plcnNleTE4MjkuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE4Mjk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBjbGFzcyB3aXRoIHRlc3QgcmVzb3VyY2UgdGhhdCByZXR1cm5zIGN1c3RvbSBzdGF0dXMgcmVhc29uIHBocmFzZS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxODI5IGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBU09OX1BIUkFTRSA9ICJteS1waHJhc2UiOworCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDbGFzczw/Pj5zaW5nbGV0b24oVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCI0MjgiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhuZXcgQ3VzdG9tNDI4VHlwZSgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiNDI4LWVudGl0eSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRXaXRoRW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhuZXcgQ3VzdG9tNDI4VHlwZSgpKS5lbnRpdHkoImVudGl0eSIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbTQyOFR5cGUgaW1wbGVtZW50cyBSZXNwb25zZS5TdGF0dXNUeXBlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIDQyODsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvblBocmFzZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSRUFTT05fUEhSQVNFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZS5TdGF0dXMuRmFtaWx5IGdldEZhbWlseSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LkNMSUVOVF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4Mjkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODI5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1MTIxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODI5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMKKyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgorICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiID4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTgyOS5KZXJzZXkxODI5PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4Mjkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODI5L0FwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4Mjkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODI5L0FwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZjgxYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4MjkvQXBwbGljYXRpb25IYW5kbGVySVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxODI5OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIEpFUlNFWSBpc3N1ZSAxNzQ0LiBDdXN0b20gc3RhdHVzIHJlYXNvbiBwaHJhc2UgcmV0dXJuZWQgZnJvbSB0aGUgcmVzb3VyY2UgbWV0aG9kIHdhcyBub3QgcHJvcGFnYXRlZCBvdXQgb2YgdGhlCisgKiBzZXJ2bGV0IGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkhhbmRsZXJJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmVyc2V5MTgyOS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21SZXNwb25zZTQyOCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS80MjgiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDI4LCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibXktcGhyYXNlIiwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFJlYXNvblBocmFzZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21SZXNwb25zZTQyOFdpdGhFbnRpdHkoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvNDI4LWVudGl0eSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MjgsIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJteS1waHJhc2UiLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0UmVhc29uUGhyYXNlKCkpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljOGZjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0xODgzPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0xODgzPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0xODgzIC0gQFBvc3RDb25zdHJ1Y3QgbWV0aG9kIGNhbGxlZCB0d2ljZSBvbiBAU2luZ2xldG9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvTGlmZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODgzL0xpZmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2VmZmEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODgzL0xpZmUuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE4ODM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gbWl4ZWQgd2l0aCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvcmVzdDMiKQorQFBhdGgoIi9saWZlIikKK3B1YmxpYyBjbGFzcyBMaWZlIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBvc3RDb25zdHJ1Y3RDb3VudCA9IDA7CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RfY29uc3RydWN0KCkgeworICAgICAgICBwb3N0Q29uc3RydWN0Q291bnQrKzsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBncmVldCgpIHsKKyAgICAgICAgcmV0dXJuICJoaSAjIiArIHBvc3RDb25zdHJ1Y3RDb3VudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODgzL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjRhN2I2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODgzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE4ODM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEV4cGxpY2l0bHkgcmVnaXN0ZXIge0Bjb2RlIEBTaW5nbGV0b259IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9yZXN0MSIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oTm9MaWZlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvTm9MaWZlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvTm9MaWZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4MjIyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9Ob0xpZmUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE4ODM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEV4cGxpY2l0bHkgcmVnaXN0ZXJlZCBzaW5nbGV0b24gcmVzb3VyY2UgYnkge0BsaW5rIE15QXBwbGljYXRpb259LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK0BQYXRoKCIvbm8tbGlmZSIpCitwdWJsaWMgY2xhc3MgTm9MaWZlIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBvc3RDb25zdHJ1Y3RDb3VudCA9IDA7CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RfY29uc3RydWN0KCkgeworICAgICAgICBwb3N0Q29uc3RydWN0Q291bnQrKzsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBncmVldCgpIHsKKyAgICAgICAgcmV0dXJuICJjaWFvICMiICsgcG9zdENvbnN0cnVjdENvdW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9TaW5nbGV0b25MaWZlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvU2luZ2xldG9uTGlmZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWU4MGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvU2luZ2xldG9uTGlmZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTg4MzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBtaXhlZCB3aXRoIHJlc291cmNlIC0gc2luZ2xldG9uIGNsYXNzLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK0BBcHBsaWNhdGlvblBhdGgoIi9yZXN0MiIpCitAUGF0aCgiL3NpbmdsZXRvbi1saWZlIikKK3B1YmxpYyBjbGFzcyBTaW5nbGV0b25MaWZlIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBvc3RDb25zdHJ1Y3RDb3VudCA9IDA7CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RfY29uc3RydWN0KCkgeworICAgICAgICBwb3N0Q29uc3RydWN0Q291bnQrKzsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBncmVldCgpIHsKKyAgICAgICAgcmV0dXJuICJoZWxsbyAjIiArIHBvc3RDb25zdHJ1Y3RDb3VudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvSmVyc2V5MTg4M0lUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODgzL0plcnNleTE4ODNJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZiMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODgzL0plcnNleTE4ODNJVENhc2UuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxODgzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsySW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTE4ODNJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXN0Tm9MaWZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MSIpLnBhdGgoIm5vLWxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJjaWFvICMxIikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MSIpLnBhdGgoIm5vLWxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJjaWFvICMxIikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MSIpLnBhdGgoIm5vLWxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJjaWFvICMxIikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MSIpLnBhdGgoIm5vLWxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJjaWFvICMxIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlc3RTaW5nbGV0b25MaWZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MiIpLnBhdGgoInNpbmdsZXRvbi1saWZlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiaGVsbG8gIzEiKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QyIikucGF0aCgic2luZ2xldG9uLWxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJoZWxsbyAjMSIpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgicmVzdDIiKS5wYXRoKCJzaW5nbGV0b24tbGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImhlbGxvICMxIikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MiIpLnBhdGgoInNpbmdsZXRvbi1saWZlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiaGVsbG8gIzEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdExpZmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QzIikucGF0aCgibGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImhpICMyIikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MyIpLnBhdGgoImxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJoaSAjMyIpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgicmVzdDMiKS5wYXRoKCJsaWZlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiaGkgIzQiKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QzIikucGF0aCgibGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImhpICM1IikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5MjgvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTI4L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiYzc3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTI4L3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTE5Mjg8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTE5Mjg8L25hbWU+CisgICAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgorCisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTE5MjggLSBPZGQgYmVoYXZpb3VyIHdpdGggZW1wdHkgInBhdGggaW5mbyI8L2Rlc2NyaXB0aW9uPgorCisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTI4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTkyOC9KZXJzZXkxOTI4LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTkyOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5MjgvSmVyc2V5MTkyOC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTIxNTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTkyOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5MjgvSmVyc2V5MTkyOC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTkyODsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQXBwbGljYXRpb25QYXRoKCIvamVyc2V5MTkyOCIpCitwdWJsaWMgY2xhc3MgSmVyc2V5MTkyOCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbGlzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAibGlzdCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7aWR9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48Q2xhc3M8Pz4+c2luZ2xldG9uKFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTkyOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5MjgvSmVyc2V5MTkyOElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5Mjgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTI4L0plcnNleTE5MjhJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE3OTdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5Mjgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTI4L0plcnNleTE5MjhJVENhc2UuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5Mjg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdHMgSkVSU0VZIGlzc3VlIDE5MjguCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxOTI4SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkxOTI4TGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiamVyc2V5MTkyOCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygibGlzdCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkxOTI4SWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImplcnNleTE5MjgiKS5wYXRoKCJpZCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiaWQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTYwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRlOTZjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTYwL3BvbS54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0xOTYwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0xOTYwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0xOTYwIC0gU2VydmxldCBhcnRpZmFjdCBpbmplY3Rpb24gaW50byBzaW5nbGV0b24gcHJvdmlkZXJzLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTYwL0VjaG9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTYwL0VjaG9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2IxYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvRWNob1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxOTYwOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImVjaG8iKQorcHVibGljIGNsYXNzIEVjaG9SZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIEBDb25zdW1lcygidGV4dC9wbGFpbiIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UgKyAiLiIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvSmVyc2V5MTk2MEFwcC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTYwL0plcnNleTE5NjBBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTg3ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTYwL0plcnNleTE5NjBBcHAuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5NjA7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0xOTYwIHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJhcHBsaWNhdGlvbl9wYXRoIikKK3B1YmxpYyBjbGFzcyBKZXJzZXkxOTYwQXBwIGV4dGVuZHMgQXBwbGljYXRpb24geworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihFY2hvUmVzb3VyY2UuY2xhc3MsIFJlcXVlc3RGaWx0ZXIuY2xhc3MpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvUmVxdWVzdEZpbHRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTYwL1JlcXVlc3RGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGU2ZDIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTYwL1JlcXVlc3RGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5NjA7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEZpbHRlciB0ZXN0aW5nIGluamVjdGlvbiBzdXBwb3J0IGZvciBvZiBzZXJ2bGV0IGFydGlmYWN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUHJlTWF0Y2hpbmcKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9OVU1CRVIgPSAicmVxdWVzdC1udW1iZXIiOworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgaHNSZXE7CisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgaHNSZXNwOworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzQ3R4OworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIHNDZmc7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY3R4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAvLyBGaXJzdCwgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBudWxsIGluamVjdGlvbnMuCisgICAgICAgIGlmIChoc1JlcSA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIkh0dHBTZXJ2bGV0UmVxdWVzdCBpcyBudWxsLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhzUmVzcCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIkh0dHBTZXJ2bGV0UmVzcG9uc2UgaXMgbnVsbC5cbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzQ3R4ID09IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiU2VydmxldENvbnRleHQgaXMgbnVsbC5cbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChzQ2ZnID09IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiU2VydmxldENvbmZpZyBpcyBudWxsLlxuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBjdHguYWJvcnRXaXRoKFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KHNiLnRvU3RyaW5nKCkpLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbGV0J3MgYWxzbyB0ZXN0IHNvbWUgbWV0aG9kIGNhbGxzCisgICAgICAgIGludCBmbGFncyA9IDA7CisKKyAgICAgICAgaWYgKCIvamVyc2V5LTE5NjAiLmVxdWFscyhoc1JlcS5nZXRTZXJ2bGV0UGF0aCgpKSkgeworICAgICAgICAgICAgZmxhZ3MgKz0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhzUmVzcC5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAgICBmbGFncyArPSAxMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNDdHguZ2V0U2VydmVySW5mbygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmxhZ3MgKz0gMTAwOworICAgICAgICB9CisgICAgICAgIGlmIChzQ2ZnLmdldFNlcnZsZXRDb250ZXh0KCkgPT0gc0N0eCkgeworICAgICAgICAgICAgZmxhZ3MgKz0gMTAwMDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gaHNSZXEuZ2V0SGVhZGVyKFJFUVVFU1RfTlVNQkVSKTsKKworICAgICAgICBjdHguc2V0RW50aXR5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgoImZpbHRlcmVkLSIgKyBmbGFncyArICItIiArIGhlYWRlcikuZ2V0Qnl0ZXMoCisgICAgICAgICAgICAgICAgTWVzc2FnZVV0aWxzLmdldENoYXJzZXQoY3R4LmdldE1lZGlhVHlwZSgpKSkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmE5MGMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTE5NjBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxOTYwLkplcnNleTE5NjBBcHA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTE5NjBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vamVyc2V5LTE5NjAvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvSmVyc2V5MTk2MElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTYwL0plcnNleTE5NjBJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTAzZWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTYwL0plcnNleTE5NjBJVENhc2UuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5NjA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTE5NjAuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTE5NjBJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MTk2MEFwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBtZXRob2QgZm9yIEpFUlNFWS0xOTYwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTE5NjBGaXgoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiamVyc2V5LTE5NjAvZWNobyIpLnJlcXVlc3QoKS5oZWFkZXIoUmVxdWVzdEZpbHRlci5SRVFVRVNUX05VTUJFUiwgaSkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LnRleHQoInRlc3QiKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSByZXF1ZXN0IGhhcyBiZWVuIGZpbHRlcmVkIGFuZCBwcm9jZXNzZWQgYnkgdGhlIGVjaG8gbWV0aG9kLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBFY2hvUmVzb3VyY2UoKS5lY2hvKCJmaWx0ZXJlZC0xMTExLSIgKyBpKSwgcmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2MTVjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3BvbS54bWwKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0xOTY0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0xOTY0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0xOTY0IC0gTlBFIHdpdGggSmVyc2V5IDEgKyBKYWNrc29uIDIgSkFYLVJTIEpTT04gcHJvdmlkZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWV0YWluZi1zZXJ2aWNlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjQvSXNzdWUxOTY0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2NC9Jc3N1ZTE5NjRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWZjNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjQvSXNzdWUxOTY0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5NjQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgSXNzdWUxOTY0UmVzb3VyY2UgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKc29uU3RyaW5nV3JhcHBlciB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIEpzb25TdHJpbmdXcmFwcGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpzb25TdHJpbmdXcmFwcGVyKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBVVAorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgSnNvblN0cmluZ1dyYXBwZXIgcHV0KGZpbmFsIEpzb25TdHJpbmdXcmFwcGVyIHdyYXBwZXIpIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTY0L0plcnNleTE5NjQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2NC9KZXJzZXkxOTY0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkMWI2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2NC9KZXJzZXkxOTY0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxOTY0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0xOTY0IHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTE5NjQgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MTk2NCgpIHsKKyAgICAgICAgcmVnaXN0ZXIoSXNzdWUxOTY0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MzZmNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MTk2NFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5NjQuSmVyc2V5MTk2NDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MTk2NFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2NC9KZXJzZXkxOTY0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjQvSmVyc2V5MTk2NElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjlmZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjQvSmVyc2V5MTk2NElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTk2NDsKKworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0xOTY0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MTk2NElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkxOTY0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYWNrc29uMkpzb25QdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5qc29uKG5ldyBJc3N1ZTE5NjRSZXNvdXJjZS5Kc29uU3RyaW5nV3JhcHBlcigiZm9vIikpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoSXNzdWUxOTY0UmVzb3VyY2UuSnNvblN0cmluZ1dyYXBwZXIuY2xhc3MpLmdldFZhbHVlKCksIGVxdWFsVG8oImZvbyIpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IENvbm5lY3RFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEphY2tzb24ySnNvbkdldEludmFsaWRFbmRwb2ludCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKQorICAgICAgICAgICAgICAgICAgICAudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OjEyMzQiKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICAgICAgZmFpbCgiRW5kLXBvaW50IHNob3VsZG4ndCBleGlzdC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgdGhyb3cgcGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gQ29ubmVjdEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmFja3NvbjJKc29uUHV0SW52YWxpZEVuZHBvaW50KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpCisgICAgICAgICAgICAgICAgICAgIC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6MTIzNCIpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnB1dChFbnRpdHkuanNvbihuZXcgSXNzdWUxOTY0UmVzb3VyY2UuSnNvblN0cmluZ1dyYXBwZXIoImZvbyIpKSk7CisKKyAgICAgICAgICAgIGZhaWwoIkVuZC1wb2ludCBzaG91bGRuJ3QgZXhpc3QuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIHRocm93IHBlLmdldENhdXNlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjBlZWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvcG9tLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTIwMzE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTIwMzE8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTIwMzEgLSBqZXJzZXkgMi4xIGV4cGxpY2l0IHZpZXdhYmxlIHJlc29sdmluZ0NsYXNzIG1pc3NlZCB3aGVuIGRvIGEganNwIHRhZzwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtanNwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9Jc3N1ZTIwMzFSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0lzc3VlMjAzMVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5ZmE1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9Jc3N1ZTIwMzFSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjAzMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBJc3N1ZTIwMzFSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNb2RlbCBtb2RlbDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWJzb2x1dGVQYXRoOworCisgICAgc3RhdGljIHsKKyAgICAgICAgYWJzb2x1dGVQYXRoID0gIi8iICsgSXNzdWUyMDMxUmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2VBbGwoIlxcLiIsICIvIikucmVwbGFjZSgnJCcsICcvJykgKyAiL2luZGV4LmpzcCI7CisgICAgICAgIG1vZGVsID0gbmV3IE1vZGVsKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJ2aWV3YWJsZS1yZWxhdGl2ZSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgIHB1YmxpYyBWaWV3YWJsZSB2aWV3YWJsZVJlbGF0aXZlKCkgeworICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJpbmRleCIsIG1vZGVsKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInZpZXdhYmxlLWFic29sdXRlIikKKyAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgcHVibGljIFZpZXdhYmxlIHZpZXdhYmxlQWJzb2x1dGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoYWJzb2x1dGVQYXRoLCBtb2RlbCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJ0ZW1wbGF0ZS1yZWxhdGl2ZSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgIEBUZW1wbGF0ZShuYW1lID0gImluZGV4IikKKyAgICBwdWJsaWMgTW9kZWwgdGVtcGxhdGVSZWxhdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1vZGVsOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgidGVtcGxhdGUtYWJzb2x1dGUiKQorICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICBAVGVtcGxhdGUoCisgICAgICAgICAgICBuYW1lID0gIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0lzc3VlMjAzMVJlc291cmNlL2luZGV4LmpzcCIpCisgICAgcHVibGljIE1vZGVsIHRlbXBsYXRlQWJzb2x1dGUoKSB7CisgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGVsIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBpbmRleCA9ICJpbmRleCI7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGluY2x1ZGUgPSAiaW5jbHVkZSI7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJbmRleCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5jbHVkZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmNsdWRlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0plcnNleTIwMzEuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9KZXJzZXkyMDMxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2NzNlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9KZXJzZXkyMDMxLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMDMxOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuanNwLkpzcE12Y0ZlYXR1cmU7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTIwMzEgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjAzMSBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkyMDMxKCkgeworICAgICAgICByZWdpc3RlcihJc3N1ZTIwMzFSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKEpzcE12Y0ZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmM0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTIwMzE8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIwMzEuSmVyc2V5MjAzMTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXkyMDMxPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIwMzEvSXNzdWUyMDMxUmVzb3VyY2UvaW5jbHVkZS5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9Jc3N1ZTIwMzFSZXNvdXJjZS9pbmNsdWRlLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzkxNGMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIwMzEvSXNzdWUyMDMxUmVzb3VyY2UvaW5jbHVkZS5qc3AKQEAgLTAsMCArMSwyMiBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorCiske21vZGVsLmluY2x1ZGV9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9Jc3N1ZTIwMzFSZXNvdXJjZS9pbmRleC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9Jc3N1ZTIwMzFSZXNvdXJjZS9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlYmVkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0lzc3VlMjAzMVJlc291cmNlL2luZGV4LmpzcApAQCAtMCwwICsxLDM5IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IlVURi04IiU+CisKKzwlQHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgcHJlZml4PSJjIiU+Cis8JUB0YWdsaWIgcHJlZml4PSJyYnQiIHVyaT0idXJuOm9yZzpnbGFzc2Zpc2g6amVyc2V5OnNlcnZsZXQ6bXZjIiAlPgorCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgICAgICAgPHRpdGxlPkJvb2s8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgICR7bW9kZWwuaW5kZXh9CisKKyAgICA8cmJ0OmluY2x1ZGUgcGFnZT0iaW5jbHVkZS5qc3AiLz4KKworICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9KZXJzZXkyMDMxSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIwMzEvSmVyc2V5MjAzMUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDEyOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIwMzEvSmVyc2V5MjAzMUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjAzMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIxNjQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMDMxSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIwMzEoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRlbXBsYXRlUmVsYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInRlbXBsYXRlLXJlbGF0aXZlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcGxhdGVBYnNvbHV0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgidGVtcGxhdGUtYWJzb2x1dGUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3YWJsZVJlbGF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJ2aWV3YWJsZS1yZWxhdGl2ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZpZXdhYmxlQWJzb2x1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInZpZXdhYmxlLWFic29sdXRlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkucmVxdWVzdCgidGV4dC9odG1sIikuZ2V0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocGFnZSwgY29udGFpbnNTdHJpbmcoImluZGV4IikpOworICAgICAgICBhc3NlcnRUaGF0KHBhZ2UsIGNvbnRhaW5zU3RyaW5nKCJpbmNsdWRlIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzk3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9wb20ueG1sCkBAIC0wLDAgKzEsOTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjEzNjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjEzNjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjEzNiAtIEplcnNleSAyIGRvZXNuJ3Qgd29yayB3aXRoIEdvb2dsZSBBcHBsaWNhdGlvbiBFbmdpbmU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmFwcGVuZ2luZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFwcGVuZ2luZS1hcGktMS4wLXNkazwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2FlLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPCEtLSBUT0RPOiBUaGUgdGVzdCB3YXMgc2tpcHBlZCwgaW5jbHVkaW5nIHRoZSBob29rZWQgYXBwLWVuZ2luZSBzdGFydCAmJiBzdG9wLiBUaGUgYXBwLWVuZ2luZSBwcm9jZXNzIHdhcyBzb21ldGltZXMKKyAgICAgICAgICAgIGxlZnQgaGFuZ2luZyBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWlsZCBhbmQga2VwdCBibG9ja2luZyB0aGUgcG9ydC4gLS0+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLTxwbHVnaW4+LS0+CisgICAgICAgICAgICAgICAgPCEtLTxncm91cElkPmNvbS5nb29nbGUuYXBwZW5naW5lPC9ncm91cElkPi0tPgorICAgICAgICAgICAgICAgIDwhLS08YXJ0aWZhY3RJZD5hcHBlbmdpbmUtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPi0tPgorICAgICAgICAgICAgICAgIDwhLS08dmVyc2lvbj4ke2dhZS52ZXJzaW9ufTwvdmVyc2lvbj4tLT4KKyAgICAgICAgICAgICAgICA8IS0tPGNvbmZpZ3VyYXRpb24+LS0+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLTxwb3J0PiR7amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0fTwvcG9ydD4tLT4KKyAgICAgICAgICAgICAgICAgICAgPCEtLTxvZmZsaW5lPnRydWU8L29mZmxpbmU+LS0+CisgICAgICAgICAgICAgICAgPCEtLTwvY29uZmlndXJhdGlvbj4tLT4KKyAgICAgICAgICAgICAgICA8IS0tPGV4ZWN1dGlvbnM+LS0+CisgICAgICAgICAgICAgICAgICAgIDwhLS08ZXhlY3V0aW9uPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxpZD5zdGFydC1nYWU8L2lkPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxwaGFzZT5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGdvYWxzPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08Z29hbD5kZXZzZXJ2ZXJfc3RhcnQ8L2dvYWw+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPC9nb2Fscz4tLT4KKyAgICAgICAgICAgICAgICAgICAgPCEtLTwvZXhlY3V0aW9uPi0tPgorICAgICAgICAgICAgICAgICAgICA8IS0tPGV4ZWN1dGlvbj4tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08aWQ+c3RvcC1nYWU8L2lkPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxwaGFzZT5wb3N0LWludGVncmF0aW9uLXRlc3Q8L3BoYXNlPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxnb2Fscz4tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGdvYWw+ZGV2c2VydmVyX3N0b3A8L2dvYWw+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPC9nb2Fscz4tLT4KKyAgICAgICAgICAgICAgICAgICAgPCEtLTwvZXhlY3V0aW9uPi0tPgorICAgICAgICAgICAgICAgIDwhLS08L2V4ZWN1dGlvbnM+LS0+CisgICAgICAgICAgICA8IS0tPC9wbHVnaW4+LS0+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzYvSXNzdWUyMTM2UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNi9Jc3N1ZTIxMzZSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTU5NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzYvSXNzdWUyMTM2UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxMzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgSXNzdWUyMTM2UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvLCBHQUUhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzYvSmVyc2V5MjEzNi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM2L0plcnNleTIxMzYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Y2MDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM2L0plcnNleTIxMzYuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxMzY7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTIxMzYgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjEzNiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkyMTM2KCkgeworICAgICAgICByZWdpc3RlcihJc3N1ZTIxMzZSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYXBwZW5naW5lLXdlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9hcHBlbmdpbmUtd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzI5MWExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYXBwZW5naW5lLXdlYi54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXBwZW5naW5lLXdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9hcHBlbmdpbmUuZ29vZ2xlLmNvbS9ucy8xLjAiPgorICAgIDxhcHBsaWNhdGlvbj5qZXJzZXkyMTM2PC9hcHBsaWNhdGlvbj4KKyAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgorICAgIDx0aHJlYWRzYWZlPnRydWU8L3RocmVhZHNhZmU+Cis8L2FwcGVuZ2luZS13ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2NzE1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTIxMzZTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTM2LkplcnNleTIxMzY8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTIxMzZTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzYvSmVyc2V5MjEzNklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM2L0plcnNleTIxMzZJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTg2NjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM2L0plcnNleTIxMzZJVENhc2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxMzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIxNjQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTM2SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIxMzYoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8vIFRoaXMgdGVzdCByZXF1aXJlcyBhcHAgZW5naW5lIHRvIGJlIGxhdW5jaGVkIGJ5IGEgbWF2ZW4gcGx1Z2luLAorICAgIC8vIHdoaWNoIHdhcyBjYXVzaW5nIGludGVybWl0dGVudCBwcm9ibGVtcyB3aXRoIGhhbmdpbmcgYXBwIGVuZ2luZSBwcm9jZXNzLgorICAgIC8vIEFmdGVyIHVuLWlnbm9yaW5nIHRoaXMgdGVzdCwgbWFrZSBzdXJlIHRvIHVuY29tbWVudCB0aGUgYXBwIGVuZ2luZSBwbHVnaW4KKyAgICAvLyBleGVjdXRpb24gaW4gdGhlIHByb2plY3QncyBwb20ueG1sCisgICAgQElnbm9yZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiSGVsbG8sIEdBRSEiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViNDhjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3BvbS54bWwKQEAgLTAsMCArMSw4NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjEzNzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjEzNzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgQ0RJL0pUQSB0ZXN0IHdlYiBhcHBsaWNhdGlvbiwgSkVSU0VZLTIxMzcgcmVwcm9kdWNlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC50cmFuc2FjdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnRyYW5zYWN0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvQWNjb3VudC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM3L0FjY291bnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzQxNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM3L0FjY291bnQuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTM3OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOworCisvKioKKyAqIEVudGl0eSBiZWFuIHRoYXQgbWFpbnRhaW5zIGluZm9ybWF0aW9uIG9uIGFjY291bnQgYmFsYW5jZS4KKyAqIFRoaXMgaXMgdG8gaGVscCBkZXRlcm1pbmUgaWYgcm9sbGJhY2sgaGFwcGVucyBvciBub3QsIHdoZW4KKyAqIGVudGl0eSBiZWFuIGlzIGFjY2Vzc2VkIGZyb20gYSB0cmFuc2FjdGlvbmFsIENESSBiZWFucy4KKyAqIEVudGl0eSBiZWFucyBoYXZlIGltcGxpY2l0IEpUQSBzdXBwb3J0LCBzbyB0aGlzIHdpbGwKKyAqIHNhdmUgdXMgc29tZSBsaW5lcyBvZiBjb2RlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBBY2NvdW50IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgQElkCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhY2NvdW50IGlkLgorICAgICAqCisgICAgICogQHJldHVybiBhY2NvdW50IGlkLgorICAgICAqLworICAgIHB1YmxpYyBMb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBhY2NvdW50IGlkLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIGFjY291bnQgaWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWQoTG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGJhbGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGJhbGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIGJhbGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRCYWxhbmNlKCkgeworICAgICAgICByZXR1cm4gYmFsYW5jZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGJhbGFuY2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBiYWxhbmNlIG5ldyB2YWx1ZSBvZiBiYWxhbmNlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QmFsYW5jZShsb25nIGJhbGFuY2UpIHsKKyAgICAgICAgdGhpcy5iYWxhbmNlID0gYmFsYW5jZTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMDsKKyAgICAgICAgaGFzaCArPSAoaWQgIT0gbnVsbCA/IGlkLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQWNjb3VudCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBBY2NvdW50IG90aGVyID0gKEFjY291bnQpIG9iamVjdDsKKyAgICAgICAgaWYgKCh0aGlzLmlkID09IG51bGwgJiYgb3RoZXIuaWQgIT0gbnVsbCkgfHwgKHRoaXMuaWQgIT0gbnVsbCAmJiAhdGhpcy5pZC5lcXVhbHMob3RoZXIuaWQpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjEzNy5BY2NvdW50WyBpZD0iICsgaWQgKyAiIF0iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9DZGlUcmFuc2FjdGlvbmFsTm9Sb2xsYmFja1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvQ2RpVHJhbnNhY3Rpb25hbE5vUm9sbGJhY2tSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTU5YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvQ2RpVHJhbnNhY3Rpb25hbE5vUm9sbGJhY2tSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjEzNzsKKworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUNvbnRleHQ7CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbDsKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlZCB0cmFuc2FjdGlvbmFsIENESSBiZWFuIHJlZ2lzdGVyZWQgYXMgSkFYLVJTIHJlc291cmNlIGNsYXNzLgorICogUGFydCBvZiBKRVJTRVktMjEzNyByZXByb2R1Y2VyLiB7QGxpbmsgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb259CisgKiB0aHJvd24gaW4gdGhlIHJlc291cmNlIG1ldGhvZCBiZWxvdyBzaG91bGQgZHJpdmUgdGhlIHJlc3BvbnNlIGFzIHNwZWNpZmllZAorICogaW4gdGhlIEpBWC1SUyBzcGVjIHJlZ2FyZGxlc3MKKyAqIG9uIHRoZSB7QGxpbmsgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbCNkb250Um9sbGJhY2tPbigpfSB2YWx1ZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFRyYW5zYWN0aW9uYWwoZG9udFJvbGxiYWNrT24gPSBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jbGFzcykKK0BQYXRoKCJjZGktdHJhbnNhY3Rpb25hbC1uby1yb2xsYmFjayIpCitwdWJsaWMgY2xhc3MgQ2RpVHJhbnNhY3Rpb25hbE5vUm9sbGJhY2tSZXNvdXJjZSB7CisKKyAgICBAUGVyc2lzdGVuY2VDb250ZXh0KHVuaXROYW1lID0gIkplcnNleTIxMzdQVSIpCisgICAgcHJpdmF0ZSBFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXI7CisKKyAgICBAUGF0aCgie2F9IikKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0QmFsYW5jZShAUGF0aFBhcmFtKCJhIikgbG9uZyBhLCBTdHJpbmcgYmFsYW5jZSkgeworICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQgPSBlbnRpdHlNYW5hZ2VyLmZpbmQoQWNjb3VudC5jbGFzcywgYSk7CisgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIEFjY291bnQgbmV3QWNjb3VudCA9IG5ldyBBY2NvdW50KCk7CisgICAgICAgICAgICBuZXdBY2NvdW50LnNldElkKGEpOworICAgICAgICAgICAgbmV3QWNjb3VudC5zZXRCYWxhbmNlKExvbmcuZGVjb2RlKGJhbGFuY2UpKTsKKyAgICAgICAgICAgIGVudGl0eU1hbmFnZXIucGVyc2lzdChuZXdBY2NvdW50KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5vaygiTmV3IGFjY291dCBjcmVhdGVkLiIpLmJ1aWxkKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWNjb3VudC5zZXRCYWxhbmNlKExvbmcuZGVjb2RlKGJhbGFuY2UpKTsKKyAgICAgICAgICAgIGVudGl0eU1hbmFnZXIubWVyZ2UoYWNjb3VudCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oUmVzcG9uc2Uub2soIkJhbGFuY2UgdXBkYXRlZC4iKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9DZGlUcmFuc2FjdGlvbmFsUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9DZGlUcmFuc2FjdGlvbmFsUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTMyYTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM3L0NkaVRyYW5zYWN0aW9uYWxSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxMzc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUNvbnRleHQ7CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbDsKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlZCB0cmFuc2FjdGlvbmFsIENESSBiZWFuIHJlZ2lzdGVyZWQgYXMgSkFYLVJTIHJlc291cmNlIGNsYXNzLgorICogUGFydCBvZiBKRVJTRVktMjEzNyByZXByb2R1Y2VyLiB7QGxpbmsgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb259CisgKiB0aHJvd24gaW4gdGhlIHJlc291cmNlIG1ldGhvZCBiZWxvdyBzaG91bGQgZHJpdmUgdGhlIHJlc3BvbnNlIGFzIHNwZWNpZmllZAorICogaW4gdGhlIEpBWC1SUyBzcGVjLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAVHJhbnNhY3Rpb25hbAorQFBhdGgoImNkaS10cmFuc2FjdGlvbmFsIikKK3B1YmxpYyBjbGFzcyBDZGlUcmFuc2FjdGlvbmFsUmVzb3VyY2UgeworCisgICAgQFBlcnNpc3RlbmNlQ29udGV4dCh1bml0TmFtZSA9ICJKZXJzZXkyMTM3UFUiKQorICAgIHByaXZhdGUgRW50aXR5TWFuYWdlciBlbnRpdHlNYW5hZ2VyOworCisgICAgQFBhdGgoInthfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFsYW5jZShAUGF0aFBhcmFtKCJhIikgbG9uZyBhKSB7CisgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IGVudGl0eU1hbmFnZXIuZmluZChBY2NvdW50LmNsYXNzLCBhKTsKKyAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKS5lbnRpdHkoU3RyaW5nLmZvcm1hdCgiQWNjb3VudCAlZCBub3QgZm91bmQiLCBhKSkuYnVpbGQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJWQiLCBhY2NvdW50LmdldEJhbGFuY2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgie2F9IikKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0QmFsYW5jZShAUGF0aFBhcmFtKCJhIikgbG9uZyBhLCBTdHJpbmcgYmFsYW5jZSkgeworICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQgPSBlbnRpdHlNYW5hZ2VyLmZpbmQoQWNjb3VudC5jbGFzcywgYSk7CisgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIEFjY291bnQgbmV3QWNjb3VudCA9IG5ldyBBY2NvdW50KCk7CisgICAgICAgICAgICBuZXdBY2NvdW50LnNldElkKGEpOworICAgICAgICAgICAgbmV3QWNjb3VudC5zZXRCYWxhbmNlKExvbmcuZGVjb2RlKGJhbGFuY2UpKTsKKyAgICAgICAgICAgIGVudGl0eU1hbmFnZXIucGVyc2lzdChuZXdBY2NvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFjY291bnQuc2V0QmFsYW5jZShMb25nLmRlY29kZShiYWxhbmNlKSk7CisgICAgICAgICAgICBlbnRpdHlNYW5hZ2VyLm1lcmdlKGFjY291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZmVyTW9uZXkoQFF1ZXJ5UGFyYW0oImZyb20iKSBsb25nIGZyb20sIEBRdWVyeVBhcmFtKCJ0byIpIGxvbmcgdG8sIFN0cmluZyBhbW91bnQpIHsKKworICAgICAgICBmaW5hbCBBY2NvdW50IHRvQWNjb3VudCA9IGVudGl0eU1hbmFnZXIuZmluZChBY2NvdW50LmNsYXNzLCB0byk7CisKKyAgICAgICAgaWYgKHRvQWNjb3VudCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRvQWNjb3VudC5zZXRCYWxhbmNlKHRvQWNjb3VudC5nZXRCYWxhbmNlKCkgKyBMb25nLmRlY29kZShhbW91bnQpKTsKKyAgICAgICAgICAgICAgICBlbnRpdHlNYW5hZ2VyLm1lcmdlKHRvQWNjb3VudCk7CisgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudCBmcm9tQWNjb3VudCA9IGVudGl0eU1hbmFnZXIuZmluZChBY2NvdW50LmNsYXNzLCBmcm9tKTsKKyAgICAgICAgICAgICAgICBmcm9tQWNjb3VudC5zZXRCYWxhbmNlKGZyb21BY2NvdW50LmdldEJhbGFuY2UoKSAtIExvbmcuZGVjb2RlKGFtb3VudCkpOworICAgICAgICAgICAgICAgIGlmIChmcm9tQWNjb3VudC5nZXRCYWxhbmNlKCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoIlRyYW5zYWN0aW9uIGZhaWxlZC4gTm90IGVub3VnaCBtb25leSBvbiB0aGUgZnVuZGluZyBhY2NvdW50LiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRpdHlNYW5hZ2VyLm1lcmdlKGZyb21BY2NvdW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlRyYW5zYWN0aW9uIHN1Y2Vzc2Z1bC4iOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCkuZW50aXR5KCJTb21ldGhpbmcgYmFkIGhhcHBlbmVkLiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCkuZW50aXR5KCJUYXJnZXQgYWNjb3VudCBub3QgZm91bmQuIikuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzZjZkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxMzc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMgZm9yIEpFUlNFWS0yMTM3IHJlcHJvZHVjZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoQ2RpVHJhbnNhY3Rpb25hbFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoQ2RpVHJhbnNhY3Rpb25hbE5vUm9sbGJhY2tSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTgzNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKK3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgdmVyc2lvbj0iMy4wIj4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYmxvZ2ljLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYmxvZ2ljLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDJhOWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2VibG9naWMueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdsczp3ZWJsb2dpYy13ZWItYXBwIHhtbG5zOndscz0iaHR0cDovL3htbG5zLm9yYWNsZS5jb20vd2VibG9naWMvd2VibG9naWMtd2ViLWFwcCIKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS93ZWJsb2dpYy93ZWJsb2dpYy13ZWItYXBwIGh0dHA6Ly94bWxucy5vcmFjbGUuY29tL3dlYmxvZ2ljL3dlYmxvZ2ljLXdlYi1hcHAvMS4wL3dlYmxvZ2ljLXdlYi1hcHAueHNkIj4KKworICAgIDx3bHM6bGlicmFyeS1yZWY+CisgICAgICAgIDx3bHM6bGlicmFyeS1uYW1lPmpheC1yczwvd2xzOmxpYnJhcnktbmFtZT4KKyAgICAgICAgPHdsczpzcGVjaWZpY2F0aW9uLXZlcnNpb24+Mi4wPC93bHM6c3BlY2lmaWNhdGlvbi12ZXJzaW9uPgorICAgICAgICA8d2xzOmV4YWN0LW1hdGNoPnRydWU8L3dsczpleGFjdC1tYXRjaD4KKyAgICA8L3dsczpsaWJyYXJ5LXJlZj4KKzwvd2xzOndlYmxvZ2ljLXdlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvV2FlRXhjZXB0aW9uTWFwcGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9XYWVFeGNlcHRpb25NYXBwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjJiOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvV2FlRXhjZXB0aW9uTWFwcGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTM3OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIxMzcuCisgKiBFbnN1cmUgdGhhdCBnZW5lcmF0ZWQge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSBpcyBwcm9wYWdhdGVkCisgKiB2aWEgdHJhbnNhY3Rpb25hbCBDREkgY2FsbCBhbmQgbWFwcGVkIHRvIHJlc3BvbnNlIGFjY29yZGluZyB0byBKQVgtUlMgc3BlYy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgV2FlRXhjZXB0aW9uTWFwcGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiamVyc2V5LTIxMzciKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYWxsIHtAamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbH0KKyAgICAgKiBhbm5vdGF0ZWQgQ0RJIGJlYW5zLiBUaGUgdGVzdCBzY2VuYXJpbyBpcyBhcyBmb2xsb3dzLgorICAgICAqIFNldCB0d28gYWNjb3VudHMgdmlhIHRoZSBDREkgYmVhbiB0aGF0IGF2b2lkcyByb2xsYmFjay4KKyAgICAgKiBTaG91bGQgYW55IHJvbGxiYWNrIGhhcHBlbiB0aGVyZSwgd2Ugd291bGQgbm90IGJlIGFibGUKKyAgICAgKiB0byBzdG9yZSBhbnkgZGF0YSBpbiBKUEEuIE5leHQgdHJ5IHRvIG1ha2UgdHdvIHRyYW5zYWN0aW9ucywKKyAgICAgKiBmaXJzdCBvZiB0aGVtIHNob3VsZCBiZSBmaW5pc2hlZCB3aXRob3V0IGVycm9ycywKKyAgICAgKiBkdXJpbmcgdGhlIG90aGVyIG9uZSwgYSByb2xsYmFjayBpcyBleHBlY3RlZC4KKyAgICAgKiBUaGUgcm9sbGJhY2sgc2hvdWxkIGF2b2lkIHBhcnRpYWwgZGF0YSB0byBiZSB3cml0dGVuCisgICAgICogdG8gdGhlIGZpcnN0IGFjY291bnQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNhY3Rpb25zKCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjZGlSZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoImNkaS10cmFuc2FjdGlvbmFsIik7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjZGlSZXNvdXJjZU5vUm9sbGJhY2sgPSB0YXJnZXQoKS5wYXRoKCJjZGktdHJhbnNhY3Rpb25hbC1uby1yb2xsYmFjayIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworICAgICAgICBTdHJpbmcgcmVzcG9uc2VCb2R5OworCisgICAgICAgIC8vIGFjY291bnQgMTIgLT4gaW5zZXJ0IDEwMDA6CisgICAgICAgIHJlc3BvbnNlID0gY2RpUmVzb3VyY2VOb1JvbGxiYWNrLnBhdGgoIjEyIikucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMTAwMCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKworICAgICAgICAvLyBhY2NvdW50IDEzIC0+IGluc2VydCAxMDAwOgorICAgICAgICByZXNwb25zZSA9IGNkaVJlc291cmNlTm9Sb2xsYmFjay5wYXRoKCIxMyIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjEwMDAiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisKKyAgICAgICAgLy8gdHJhbnNmZXIgMTAwMCBmcm9tIDEzIHRvIDEyOgorICAgICAgICByZXNwb25zZSA9IGNkaVJlc291cmNlLnF1ZXJ5UGFyYW0oImZyb20iLCAiMTMiKS5xdWVyeVBhcmFtKCJ0byIsICIxMiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCIxMDAwIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworCisgICAgICAgIC8vIGVuc3VyZSAxMiBoYXMgYmFsYW5jZSAyMDAwOgorICAgICAgICByZXNwb25zZSA9IGNkaVJlc291cmNlLnBhdGgoIjEyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICByZXNwb25zZUJvZHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VCb2R5LCBlcXVhbFRvKCIyMDAwIikpOworCisgICAgICAgIC8vIHRyeSB0byB0cmFuc2ZlciAxMDAwIGZyb20gbm9uLWV4aXN0aW5nIDggdG8gMTIsIHRoaXMgdGltZSB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGZhaWw6CisgICAgICAgIHJlc3BvbnNlID0gY2RpUmVzb3VyY2UucXVlcnlQYXJhbSgiZnJvbSIsICI4IikucXVlcnlQYXJhbSgidG8iLCAiMTIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiMTAwMCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKworICAgICAgICAvLyBlbnN1cmUgMTIgYmFsYW5jZSBoYXMgbm90IGNoYW5nZWQ6CisgICAgICAgIHJlc3BvbnNlID0gY2RpUmVzb3VyY2UucGF0aCgiMTIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZUJvZHksIGVxdWFsVG8oIjIwMDAiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjMjkwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3BvbS54bWwKQEAgLTAsMCArMSw4MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjE1NDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjE1NDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgQ0RJL0VKQiB0ZXN0IHdlYiBhcHBsaWNhdGlvbiwgSkVSU0VZLTIxNTQgcmVwcm9kdWNlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lamI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lamItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvQ2RpUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9DZGlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MzlmYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvQ2RpUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNTQ7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogUmVxdWVzdCBzY29wZWQgQ0RJIGJlYW4gaW5qZWN0ZWQgd2l0aCBFSkIgYmVhbi4KKyAqIFBhcnQgb2YgSkVSU0VZLTIxNTQgcmVwcm9kdWNlci4ge0BsaW5rIGphdmF4LmVqYi5FSkJFeGNlcHRpb259CisgKiB0aHJvd24gaW4gdGhlIGluamVjdGVkIEVKQiBiZWFuIHNob3VsZCBnZXQgdW53cmFwcGVkCisgKiBldmVuIHdoZW4gbm8gRUpCLWJhY2tlZCBKQVgtUlMgcmVzb3VyY2VzIGhhdmUgYmVlbiByZWdpc3RlcmVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgiY2RpIikKK3B1YmxpYyBjbGFzcyBDZGlSZXNvdXJjZSB7CisKKyAgICBARUpCIEVqYkJlYW4gZWpiQmVhbjsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIGVqYkJlYW4uZXhjZXB0aW9uRHJpdmVuUmVzcG9uc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvRWpiQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTU0L0VqYkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDE5MjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTU0L0VqYkJlYW4uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNTQ7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBFSkIgYmVhbiB0byByZXByb2R1Y2UgSkVSU0VZLTIxNTQuIEJlbGxvdyBnZW5lcmF0ZWQge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufQorICogc2hvdWxkIGdldCBtYXBwZWQgdG8gcmVzcG9uc2UgZXZlbiB3aGVuIHdyYXBwZWQgaW50byBhbiB7QGxpbmsgRUpCRXhjZXB0aW9ufQorICogYnkgdGhlIHVuZGVybHlpbmcgRUpCIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitwdWJsaWMgY2xhc3MgRWpiQmVhbiB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGUgZXhjZXB0aW9uIHRocm93biBnZXRzIHdyYXBwZWQgd2l0aCBhbiB7QGxpbmsgRUpCRXhjZXB0aW9ufS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbm90aGluZywganVzdCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZXhjZXB0aW9uRHJpdmVuUmVzcG9uc2UoKSB7CisgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5vaygiSWYgeW91IHJlYWQgdGhpcywgdGhlIGV4Y2VwdGlvbiBnb3QgbWFwcGVkIHN1Y2Nlc3NmdWxseSEiKS5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5NGFmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNTQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMgZm9yIEpFUlNFWS0yMTU0IHJlcHJvZHVjZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoQ2RpUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZjM2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzE4MzcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCit4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgIHZlcnNpb249IjMuMCI+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvRWpiRXhjZXB0aW9uTWFwcGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9FamJFeGNlcHRpb25NYXBwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGZjMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvRWpiRXhjZXB0aW9uTWFwcGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNTQ7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YXguZWpiLkVKQkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LmNvcmUuU3RyaW5nQ29udGFpbnMuY29udGFpbnNTdHJpbmc7CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIxNTQuCisgKiBUZXN0IGdlbmVyYXRlZCB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGlzIHByb3BhZ2F0ZWQKKyAqIHZpYSBDREkgY2FsbCBhbmQgbWFwcGVkIHRvIDIwMCByZXNwb25zZSwgZXZlbiB3aGVuIHdyYXBwZWQgd2l0aCBhbiB7QGxpbmsgRUpCRXhjZXB0aW9ufS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRWpiRXhjZXB0aW9uTWFwcGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiamVyc2V5LTIxNTQiKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBvbmx5IHRlc3QgbmVlZGVkLiBTaG91bGQgdGhlIG9yaWdpbmFsIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0KKyAgICAgKiBub3QgZ2V0IHVud3JhcHBlZCwgd2Ugd291bGQgZW5kIHVwIHdpdGggNTAwIHN0YXR1cyBjb2RlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluamVjdGlvbigpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgY2RpUmVzb3VyY2UgPSB0YXJnZXQoKS5wYXRoKCJjZGkiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNkaVJlc291cmNlLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgY29udGFpbnNTdHJpbmcoImV4Y2VwdGlvbiBnb3QgbWFwcGVkIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMzJhYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjE2MDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjE2MDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjE2MCAtIEh0dHBTZXJ2bGV0UmVxdWVzdC9IdHRwU2VydmxldFJlc3BvbnNlIGRvIG5vdCBnZXQgaW5qZWN0ZWQgYXMgYSBwcm94eSBpbnRvIG1ldGhvZCBwYXJhbWV0ZXJzPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjAvSXNzdWUyMTYwUmVwcm9kdWNlclJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjAvSXNzdWUyMTYwUmVwcm9kdWNlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5N2VmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9Jc3N1ZTIxNjBSZXByb2R1Y2VyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlByb3h5Q3RsOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInNlcnZsZXRJbmplY3RlZXMiKQorcHVibGljIGNsYXNzIElzc3VlMjE2MFJlcHJvZHVjZXJSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0RmllbGQ7CisgICAgQENvbnRleHQKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlRmllbGQ7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGVuc3VyZU5vUHJveHlJbmplY3RlZChAQ29udGV4dCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdFBhcmFtLCBAQ29udGV4dCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlUGFyYW0pIHsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGluamVjdGVlcyBhcmUgc2FtZSBubyBtYXR0ZXIgaG93IHRoZXkgZ290IGluamVjdGVkCisgICAgICAgIGlmIChyZXF1ZXN0UGFyYW0gIT0gcmVxdWVzdEZpZWxkIHx8IHJlc3BvbnNlUGFyYW0gIT0gcmVzcG9uc2VGaWVsZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5qZWN0ZWQgZmllbGQgYW5kIHBhcmFtZXRlciBzaG91bGQgcmVmZXIgdG8gdGhlIHNhbWUgaW5zdGFuY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIG5vdCBnb3QgcHJveGllcworICAgICAgICBpZiAocmVxdWVzdFBhcmFtIGluc3RhbmNlb2YgUHJveHlDdGwgfHwgcmVzcG9uc2VQYXJhbSBpbnN0YW5jZW9mIFByb3h5Q3RsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJubyBwcm94eSBleHBlY3RlZCEiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoU3RyaW5nKSByZXF1ZXN0UGFyYW0uZ2V0QXR0cmlidXRlKFJlcXVlc3RGaWx0ZXIuUkVRVUVTVF9OVU1CRVJfUFJPUEVSVFkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9KZXJzZXkyMTYwQXBwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjAvSmVyc2V5MjE2MEFwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjIxYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjAvSmVyc2V5MjE2MEFwcC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2MDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0xOTYwIHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjE2MEFwcCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZGQoUmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgYWRkKElzc3VlMjE2MFJlcHJvZHVjZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTYwL1JlcXVlc3RGaWx0ZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9SZXF1ZXN0RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0NGYwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9SZXF1ZXN0RmlsdGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTYwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioKKyAqIEZpbHRlciB0aGF0IHNldCBhIHByb3BlcnR5IG9uIGFjdHVhbCByZXF1ZXN0LiBUaGUgcHJvcGVydHkgdmFsdWUKKyAqIGlzIGV4cGVjdGVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIHJlc291cmNlIG1ldGhvZCB2aWEgaW5qZWN0ZWQKKyAqIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJlTWF0Y2hpbmcKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX05VTUJFUl9QUk9QRVJUWSA9ICJyZXF1ZXN0LW51bWJlciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9OVU1CRVJfSEVBREVSID0gIm51bWJlciI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY3R4KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgbnVtYmVyID0gY3R4LmdldEhlYWRlclN0cmluZyhSRVFVRVNUX05VTUJFUl9IRUFERVIpOworICAgICAgICBjdHguc2V0UHJvcGVydHkoUkVRVUVTVF9OVU1CRVJfUFJPUEVSVFksIG51bWJlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5NzQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMTYwU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2MC5KZXJzZXkyMTYwQXBwPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMTYwU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2plcnNleS0yMTYwLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTYwL0plcnNleTIxNjBJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9KZXJzZXkyMTYwSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3ZjBiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9KZXJzZXkyMTYwSVRDYXNlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTYwOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yMTYwLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTYwSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIxNjBBcHAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgbWV0aG9kIGZvciBKRVJTRVktMjE2MC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkyMTYwRml4KCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImplcnNleS0yMTYwL3NlcnZsZXRJbmplY3RlZXMiKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmhlYWRlcihSZXF1ZXN0RmlsdGVyLlJFUVVFU1RfTlVNQkVSX0hFQURFUiwgaSkKKyAgICAgICAgICAgICAgICAgICAgLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UpLCBpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjY3ODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9wb20ueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjE2NDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjE2NDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjE2NCAtIE11bHRpIHZhbHVlIGh0dHAgaGVhZGVycyBhcmUgbm90IGNvcnJlY3RseSByZWFkIGJ5IHRoZSBzZXJ2ZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY0L0lzc3VlMjE2NFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjQvSXNzdWUyMTY0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGI5ZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY0L0lzc3VlMjE2NFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTY0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgSXNzdWUyMTY0UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBIZWFkZXJQYXJhbSgiaGVsbG8iKSBmaW5hbCBMaXN0PFN0cmluZz4gaGVhZGVycykgeworICAgICAgICByZXR1cm4gaGVhZGVycy5zaXplKCkgKyAiOiIgKyBoZWFkZXJzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2NC9KZXJzZXkyMTY0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjQvSmVyc2V5MjE2NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNGNmZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjQvSmVyc2V5MjE2NC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2NDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjE2NCByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTY0IGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTIxNjQoKSB7CisgICAgICAgIHJlZ2lzdGVyKElzc3VlMjE2NFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc3YTkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTIxNjRTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTY0LkplcnNleTIxNjQ8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTIxNjRTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjQvSmVyc2V5MjE2NElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY0L0plcnNleTIxNjRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWMyNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY0L0plcnNleTIxNjRJVENhc2UuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjQ7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUmVhZGVyV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIxNjQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTY0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIxNjQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckxpc3RTaW5nbGVIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuaGVhZGVyKCJoZWxsbyIsICJ3b3JsZCIpLmhlYWRlcigiaGVsbG8iLCAidW5pdmVyc2UiKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiMTpbd29ybGQsdW5pdmVyc2VdIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgbXVsdGkgdmFsdWUgaHR0cCBoZWFkZXJzIGFyZSBjb3JyZWN0bHkgcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckxpc3RNdWx0aXBsZUhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICBmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgInRleHQvcGxhaW4iKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoImhlbGxvIiwgIndvcmxkIik7CisgICAgICAgIGNvbm5lY3Rpb24uYWRkUmVxdWVzdFByb3BlcnR5KCJoZWxsbyIsICJ1bml2ZXJzZSIpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQoZmFsc2UpOworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKworICAgICAgICBhc3NlcnRUaGF0KGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSkpLAorICAgICAgICAgICAgICAgIGVxdWFsVG8oIjI6W3dvcmxkLCB1bml2ZXJzZV0iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQzZTg5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yMTY3PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yMTY3PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkpFUlNFWS0yMTY3IHJlcHJvZHVjZXIgLSBJbmplY3RpbmcgYSBjdXN0b20gcGFyYW1ldGVyIHR5cGUgY2F1c2VzIFJFU1QgbWV0aG9kIHRvIHJ1biB0d2ljZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvSXNzdWUyMTY3UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9Jc3N1ZTIxNjdSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Y2NlZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvSXNzdWUyMTY3UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIGZvciBKRVJTRVktMjE2NyByZXByb2R1Y2VyLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworCitAUGF0aCgiL015UmVzb3VyY2UiKQorcHVibGljIGNsYXNzIElzc3VlMjE2N1Jlc291cmNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihJc3N1ZTIxNjdSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1TRyA9ICJSZXNvdXJjZSBtZXRob2QgZG9BKCkgY2FsbGVkIGF0ICI7CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBkb0EoQE15QW5ub3RhdGlvbiBTdHJpbmcgcGFyYW0pIHsKKyAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCBNU0cgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICI7IHBhcmFtPSIgKyBwYXJhbSk7CisgICAgICAgIGlmIChwYXJhbSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5idWlsZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L0plcnNleTIxNjdBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9KZXJzZXkyMTY3QXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkYzNjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9KZXJzZXkyMTY3QXBwLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTY3OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0yMTY3IHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTY3QXBwIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTIxNjdBcHAoKSB7CisgICAgICAgIHJlZ2lzdGVyKElzc3VlMjE2N1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIobmV3IE15QmluZGVyKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9NeUFubm90YXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9NeUFubm90YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGVjNjZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L015QW5ub3RhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2NzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEN1c3RvbSBhbm5vdGF0aW9uIGZvciBKRVJTRVktMjE2NyByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCisKK0BUYXJnZXQoRWxlbWVudFR5cGUuUEFSQU1FVEVSKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIE15QW5ub3RhdGlvbiB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvTXlCaW5kZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9NeUJpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGUyYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvTXlCaW5kZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjc7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuVmFsdWVQYXJhbVByb3ZpZGVyOworCisvKioKKyAqIEN1c3RvbSBhbm5vdGF0aW9uIGJpbmRlciBmb3IgSkVSU0VZLTIxNjcgcmVwcm9kdWNlci4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNeUJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgYmluZChNeVZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcykudG8oVmFsdWVQYXJhbVByb3ZpZGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9NeVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L015VmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhZTVhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9NeVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2NzsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworCisvKioKKyAqIEN1c3RvbSBhbm5vdGF0aW9uIHZhbHVlIHN1cHBsaWVyIHByb3ZpZGVyIGZvciBKRVJTRVktMjE2NyByZXByb2R1Y2VyLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIE15VmFsdWVQYXJhbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZVBhcmFtUHJvdmlkZXIgeworCisgICAgQEluamVjdAorICAgIHB1YmxpYyBNeVZhbHVlUGFyYW1Qcm92aWRlcihQcm92aWRlcjxNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyPiBtcGVwKSB7CisgICAgICAgIHN1cGVyKG1wZXAsIFBhcmFtZXRlci5Tb3VyY2UuVU5LTk9XTik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IGNyZWF0ZVZhbHVlUHJvdmlkZXIoUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICByZXR1cm4gbmV3IE15VmFsdWVTdXBwbGllcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE15VmFsdWVTdXBwbGllciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIE9iamVjdD4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgLy8gcmV0dXJucyBzb21lIHRlc3RpbmcgdmFsdWUKKyAgICAgICAgICAgIHJldHVybiAiaW5qZWN0ZWQgdGltZXN0YW1wPSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWZiOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjE2N1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjcuSmVyc2V5MjE2N0FwcDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjE2N1NlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9KZXJzZXkyMTY3SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvSmVyc2V5MjE2N0lUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjU4YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvSmVyc2V5MjE2N0lUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2NzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yMTY3LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxNjdJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjE2N0FwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNZXRob2RDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiTXlSZXNvdXJjZS90ZXN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICAvLyBpZiBwYXJhbWV0ZXIgd2FzIG5vdCBpbmplY3RlZCwgcmVzb3VyY2UgcmV0dXJucyBSZXNwb25zZS5TdGF0dXMuU0VSVkVSX0VSUk9SICg1MDApLiBNaXNzaW5nIHBhcmFtZXRlciBtZWFucywKKyAgICAgICAgLy8gdGhhdCBoazIgaW5qZWN0ZWQgdGhlIHBhcmFtZXRlciBhbmQgaW52b2tlZCB0aGUgbWV0aG9kIHByZWxpbWluYXJ5IGFuZCBkdXJpbmcgSmVyc2V5LWRyaXZlbiBpbnZvY2F0aW9uLAorICAgICAgICAvLyB0aGVyZSB3YXMgbm8gcGFyYW1ldGVyIGluamVjdGlvbiBhbnkgbW9yZS4gSWYgcGFyYW1ldGVyIHdhcyBpbmplY3RlZCBhbmQgUmVzcG9uc2UuU3RhdHVzLk9LICgyMDApIHJldHVybmVkLAorICAgICAgICAvLyB0aGUgcmVzb3VyY2UgbWV0aG9kIHdhcyBjYWxsZWQgb25seSBvbmNlIChieSBKZXJzZXkpLgorICAgICAgICBhc3NlcnRFcXVhbHMoIlBhcmFtZXRlciBub3QgaW5qZWN0ZWQgaW50byByZXNvdXJjZSBtZXRob2QuIFJlc291cmNlIG1ldGhvZCBjb3VsZCBoYXZlIGJlZW4gY2FsbGVkIHR3aWNlLiAiLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFN0YXR1cygpLCBSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGMzODc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTIxNzY8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTIxNzY8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTIxNzYgLSBQcm9ibGVtcyB3aXRoIGNhbGxpbmcgY2xvc2UoKSBhbmQgZmx1c2goKQorICAgICAgICBtZXRob2RzIG9uIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0lzc3VlMjE3NlJlcHJvZHVjZXJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0lzc3VlMjE3NlJlcHJvZHVjZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGQwOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSXNzdWUyMTc2UmVwcm9kdWNlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL3Jlc291cmNlIikKK3B1YmxpYyBjbGFzcyBJc3N1ZTIxNzZSZXByb2R1Y2VyUmVzb3VyY2UgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBYX0ZBSUxfSEVBREVSID0gIlgtRkFJTCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBYX1JFU1BPTlNFX0VOVElUWV9IRUFERVIgPSAiWC1SRVNQT05TRS1FTlRJVFkiOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQFBhdGgoIntzdGF0dXN9IikKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0VGV4dChAUGF0aFBhcmFtKCJzdGF0dXMiKSBpbnQgdWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgdGhyb3dzIE15RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVjID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTXlFeGNlcHRpb24oIlVDPSAiICsgdWMpOworICAgICAgICB9IGVsc2UgaWYgKHVjID09IC0yKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVQz0gIiArIHVjKTsKKyAgICAgICAgfSBlbHNlIGlmICh1YyA9PSAtMykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCJVQz0gIiArIHVjLCAzMjEpOworICAgICAgICB9IGVsc2UgaWYgKHVjID09IC00KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oIlVDPSAiICsgdWMsIDQzMik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmVzcG9uc2VCdWlsZGVyID0gUmVzcG9uc2Uuc3RhdHVzKHVjKTsKKyAgICAgICAgaWYgKGhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcnMoKS5jb250YWluc0tleShYX1JFU1BPTlNFX0VOVElUWV9IRUFERVIpKSB7CisgICAgICAgICAgICByZXNwb25zZUJ1aWxkZXIuZW50aXR5KCJFTlRJVFkiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlQnVpbGRlci5idWlsZCgpOworICAgICAgICBpZiAoaGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpLmNvbnRhaW5zS2V5KFhfUkVTUE9OU0VfRU5USVRZX0hFQURFUikpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5hZGQoWF9SRVNQT05TRV9FTlRJVFlfSEVBREVSLCAidHJ1ZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXJzLmdldFJlcXVlc3RIZWFkZXJzKCkuY29udGFpbnNLZXkoWF9GQUlMX0hFQURFUikpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5hZGQoWF9GQUlMX0hFQURFUiwgInRydWUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NkFwcC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjhjZmMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZBcHAuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNzY7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTIxNzYgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK2Fic3RyYWN0IGNsYXNzIEplcnNleTIxNzZBcHAgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2V0U3RhdHVzT3ZlclNlbmRFcnJvcjsKKworICAgIHB1YmxpYyBKZXJzZXkyMTc2QXBwKGJvb2xlYW4gc2V0U3RhdHVzT3ZlclNlbmRFcnJvcikgeworICAgICAgICB0aGlzLnNldFN0YXR1c092ZXJTZW5kRXJyb3IgPSBzZXRTdGF0dXNPdmVyU2VuZEVycm9yOworCisgICAgICAgIHByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1IsIHNldFN0YXR1c092ZXJTZW5kRXJyb3IpOworICAgICAgICByZWdpc3RlcihNeVdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoSXNzdWUyMTc2UmVwcm9kdWNlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NldFN0YXR1c092ZXJTZW5kRXJyb3IoKSB7CisgICAgICAgIHJldHVybiBzZXRTdGF0dXNPdmVyU2VuZEVycm9yOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2U2VuZEVycm9yQXBwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNlbmRFcnJvckFwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGNhZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNlbmRFcnJvckFwcC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE3NjsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworLyoqCisgKiBDb25maWd1cmUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1JFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SfSBieSB7QGNvZGUgdHJ1ZX0gLQorICogbWV0aG9kIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZSNzZW5kRXJyb3J9IHdpbGwgYmUgY2FsbGVkIGluIGNhc2Ugb2YgZXJyb3JzCisgKiAoc3RhdHVzIHtAY29kZSA0eHh9IG9yIHtAY29kZSA1eHh9KS4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKEplcnNleTIxNzZTZW5kRXJyb3JBcHAuQVBQX1BBVEgpCitwdWJsaWMgY2xhc3MgSmVyc2V5MjE3NlNlbmRFcnJvckFwcCBleHRlbmRzIEplcnNleTIxNzZBcHAgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX1BBVEggPSAic2VuZC1lcnJvciI7CisKKyAgICBwdWJsaWMgSmVyc2V5MjE3NlNlbmRFcnJvckFwcCgpIHsKKyAgICAgICAgc3VwZXIoZmFsc2UpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZTZXRTdGF0dXNBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2U2V0U3RhdHVzQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxZGYwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2U2V0U3RhdHVzQXBwLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCisvKioKKyAqIENvbmZpZ3VyZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1J9IGJ5IHtAY29kZSB0cnVlfSAtCisgKiBtZXRob2Qge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlI3NldFN0YXR1c30gd2lsbCBiZSBjYWxsZWQgaW4gY2FzZSBvZiBlcnJvcnMKKyAqIChzdGF0dXMge0Bjb2RlIDR4eH0gb3Ige0Bjb2RlIDV4eH0pLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoSmVyc2V5MjE3NlNldFN0YXR1c0FwcC5BUFBfUEFUSCkKK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTc2U2V0U3RhdHVzQXBwIGV4dGVuZHMgSmVyc2V5MjE3NkFwcCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUEFUSCA9ICJzZXQtc3RhdHVzIjsKKworICAgIHB1YmxpYyBKZXJzZXkyMTc2U2V0U3RhdHVzQXBwKCkgeworICAgICAgICBzdXBlcih0cnVlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9NeUV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L015RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkYWYyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9NeUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE3NjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgcHVibGljIE15RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9NeVdyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvTXlXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTRmY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvTXlXcml0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE3NjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKKworCisvKioKKyAqIFRoaXMganVzdCBzZXQgbmV3IGNvbnRleHQgb3V0cHV0IHN0cmVhbSBhbmQgdGVzdCBhIGNsb25lIG1ldGhvZCBvbiBzZXQgb3V0cHV0IHN0cmVhbSBpbnN0YW5jZSBpcyBjYWxsZWQuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE15V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBib29sZWFuIGZhaWwgPSBjb250ZXh0LmdldEhlYWRlcnMoKS5jb250YWluc0tleShJc3N1ZTIxNzZSZXByb2R1Y2VyUmVzb3VyY2UuWF9GQUlMX0hFQURFUik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzcG9uc2VFbnRpdHkgPSBjb250ZXh0LmdldEhlYWRlcnMoKS5jb250YWluc0tleShJc3N1ZTIxNzZSZXByb2R1Y2VyUmVzb3VyY2UuWF9SRVNQT05TRV9FTlRJVFlfSEVBREVSKTsKKworICAgICAgICBpZiAocmVzcG9uc2VFbnRpdHkpIHsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgTXlPdXRwdXRTdHJlYW0oY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKSwgTWVzc2FnZVV0aWxzLmdldENoYXJzZXQoY29udGV4dC5nZXRNZWRpYVR5cGUoKSkpKTsKKyAgICAgICAgfQorICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgaWYgKGZhaWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZyb20gTXlXcml0ZXJJbnRlcmNlcHRvciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgICAgICBwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSBkZWxlZ2F0ZTsKKyAgICAgICAgZmluYWwgQ2hhcnNldCBjaGFyc2V0OworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBsb2NhbFN0cmVhbTsKKworICAgICAgICBwcml2YXRlIE15T3V0cHV0U3RyZWFtKGZpbmFsIE91dHB1dFN0cmVhbSBkZWxlZ2F0ZSwgZmluYWwgQ2hhcnNldCBjaGFyc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgICAgICAgICAgdGhpcy5jaGFyc2V0ID0gY2hhcnNldDsKKworICAgICAgICAgICAgdGhpcy5sb2NhbFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGxvY2FsU3RyZWFtLndyaXRlKCJbSU5URVJDRVBUT1JdIi5nZXRCeXRlcyhjaGFyc2V0KSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBsb2NhbFN0cmVhbS53cml0ZShiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBkZWxlZ2F0ZS53cml0ZShsb2NhbFN0cmVhbS50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIGxvY2FsU3RyZWFtLnJlc2V0KCk7CisgICAgICAgICAgICBkZWxlZ2F0ZS5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvY2FsU3RyZWFtLndyaXRlKCJbL0lOVEVSQ0VQVE9SXSIuZ2V0Qnl0ZXMoY2hhcnNldCkpOworCisgICAgICAgICAgICBkZWxlZ2F0ZS53cml0ZShsb2NhbFN0cmVhbS50b0J5dGVBcnJheSgpKTsKKworICAgICAgICAgICAgZGVsZWdhdGUuY2xvc2UoKTsKKyAgICAgICAgICAgIGxvY2FsU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9UcmFjZVJlc3BvbnNlRmlsdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvVHJhY2VSZXNwb25zZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMGVjZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvVHJhY2VSZXNwb25zZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE3NjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFjZVJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhfU0VSVkVSX0RVUkFUSU9OX0hFQURFUiA9ICJYLVNFUlZFUi1EVVJBVElPTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9TVEFUVVNfSEVBREVSID0gIlgtU1RBVFVTIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYX05PX0ZJTFRFUl9IRUFERVIgPSAiWC1OTy1GSUxURVIiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChmaW5hbCBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIEZpbHRlckNoYWluIGNoYWluKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgVHJhY2VSZXNwb25zZVdyYXBwZXIgd3JhcHBlZFJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgaWYgKCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0KS5nZXRIZWFkZXIoWF9OT19GSUxURVJfSEVBREVSKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXNwb25zZSA9IHdyYXBwZWRSZXNwb25zZSA9IG5ldyBUcmFjZVJlc3BvbnNlV3JhcHBlcigoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBzdGF0dXMgPSAibi9hIjsKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9ICJPSyI7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0aCkgeworICAgICAgICAgICAgc3RhdHVzID0gIkZBSUwiOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbiA9IFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnRUaW1lOworICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZSkuYWRkSGVhZGVyKFhfU0VSVkVSX0RVUkFUSU9OX0hFQURFUiwgU3RyaW5nLnZhbHVlT2YoZHVyYXRpb24pKTsKKyAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpLmFkZEhlYWRlcihYX1NUQVRVU19IRUFERVIsIHN0YXR1cyk7CisgICAgICAgICAgICBpZiAod3JhcHBlZFJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHJlc3BvbnNlKS5zZXRIZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgsIHdyYXBwZWRSZXNwb25zZS5nZXRDb250ZW50TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHdyYXBwZWRSZXNwb25zZS53cml0ZUJvZHlBbmRDbG9zZShyZXNwb25zZS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L1RyYWNlUmVzcG9uc2VXcmFwcGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvVHJhY2VSZXNwb25zZVdyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJmNjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L1RyYWNlUmVzcG9uc2VXcmFwcGVyLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRyYWNlUmVzcG9uc2VXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgeworICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGxvY2FsU3RyZWFtOworCisgICAgcHVibGljIFRyYWNlUmVzcG9uc2VXcmFwcGVyKGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKworICAgICAgICBsb2NhbFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgbG9jYWxTdHJlYW0ud3JpdGUoIltGSUxURVJdIi5nZXRCeXRlcyhyZXNwb25zZS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFNlcnZsZXRPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGxvY2FsU3RyZWFtLndyaXRlKGIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQm9keUFuZENsb3NlKGZpbmFsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbG9jYWxTdHJlYW0ud3JpdGUoIlsvRklMVEVSXSIuZ2V0Qnl0ZXMoZW5jb2RpbmcpKTsKKworICAgICAgICBzdXBlci5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShsb2NhbFN0cmVhbS50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgc3VwZXIuZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsKKyAgICAgICAgbG9jYWxTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihsb2NhbFN0cmVhbS5zaXplKCkgKyAiWy9GSUxURVJdIi5sZW5ndGgoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzkxMDlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5UcmFjZUZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE3Ni5UcmFjZVJlc3BvbnNlRmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+VHJhY2VGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NklUQ2FzZUJhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2SVRDYXNlQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZWVjMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NklUQ2FzZUJhc2UuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjE3Ni4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmVyc2V5MjE3NklUQ2FzZUJhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudDIyMigpIHsKKyAgICAgICAgdGVzdEdldENvbnRlbnQoMjIyLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50MzMzKCkgeworICAgICAgICB0ZXN0R2V0Q29udGVudCgzMzMsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbnRlbnQ0NDQoKSB7CisgICAgICAgIHRlc3RHZXRDb250ZW50KDQ0NCwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudDU1NSgpIHsKKyAgICAgICAgdGVzdEdldENvbnRlbnQoNTU1LCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50MjIyTm9SZXNwb25zZUVudGl0eSgpIHsKKyAgICAgICAgdGVzdEdldENvbnRlbnQoMjIyLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudDMzM05vUmVzcG9uc2VFbnRpdHkoKSB7CisgICAgICAgIHRlc3RHZXRDb250ZW50KDMzMywgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbnRlbnQ0NDROb1Jlc3BvbnNlRW50aXR5KCkgeworICAgICAgICB0ZXN0R2V0Q29udGVudCg0NDQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50NTU1Tm9SZXNwb25zZUVudGl0eSgpIHsKKyAgICAgICAgdGVzdEdldENvbnRlbnQoNTU1LCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9uXzEoKSB7CisgICAgICAgIHRlc3RHZXRFeGNlcHRpb24oLTEsIDUwMCwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4Y2VwdGlvbl8yKCkgeworICAgICAgICB0ZXN0R2V0RXhjZXB0aW9uKC0yLCA1MDAsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGNlcHRpb25fMygpIHsKKyAgICAgICAgdGVzdEdldEV4Y2VwdGlvbigtMywgMzIxLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9uXzQoKSB7CisgICAgICAgIHRlc3RHZXRFeGNlcHRpb24oLTQsIDQzMiwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4Y2VwdGlvbjIyMigpIHsKKyAgICAgICAgdGVzdEdldEV4Y2VwdGlvbigyMjIsIDUwMCwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RHZXRDb250ZW50KGludCB1YywgYm9vbGVhbiByZXNwb25zZUVudGl0eSkgeworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRDb250ZW50ID0gIkVOVElUWSI7CisgICAgICAgIGV4cGVjdGVkQ29udGVudCA9ICJbSU5URVJDRVBUT1JdIiArIGV4cGVjdGVkQ29udGVudCArICJbL0lOVEVSQ0VQVE9SXSI7CisgICAgICAgIGV4cGVjdGVkQ29udGVudCA9ICJbRklMVEVSXSIgKyBleHBlY3RlZENvbnRlbnQgKyAiWy9GSUxURVJdIjsKKworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHRhcmdldCgpLnBhdGgoIi9yZXNvdXJjZS8iICsgdWMpLnJlcXVlc3QoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlRW50aXR5KSB7CisgICAgICAgICAgICBidWlsZGVyLmhlYWRlcihJc3N1ZTIxNzZSZXByb2R1Y2VyUmVzb3VyY2UuWF9SRVNQT05TRV9FTlRJVFlfSEVBREVSLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuaGVhZGVyKFRyYWNlUmVzcG9uc2VGaWx0ZXIuWF9OT19GSUxURVJfSEVBREVSLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRlci5nZXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFzc2VydE1lc3NhZ2UgPSB1YyArICJ8IiArIHJlc3BvbnNlRW50aXR5OworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXNzZXJ0TWVzc2FnZSwgdWMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgaWYgKCFzZW5kRXJyb3JFeHBlY3RlZCh1YywgcmVzcG9uc2VFbnRpdHkpKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFzc2VydE1lc3NhZ2UsICJPSyIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhUcmFjZVJlc3BvbnNlRmlsdGVyLlhfU1RBVFVTX0hFQURFUikpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoYXNzZXJ0TWVzc2FnZSwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKFRyYWNlUmVzcG9uc2VGaWx0ZXIuWF9TRVJWRVJfRFVSQVRJT05fSEVBREVSKSk7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VFbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFzc2VydE1lc3NhZ2UsIGV4cGVjdGVkQ29udGVudCwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFzc2VydE1lc3NhZ2UsIFN0cmluZy52YWx1ZU9mKGV4cGVjdGVkQ29udGVudC5sZW5ndGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGFzc2VydE1lc3NhZ2UsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhUcmFjZVJlc3BvbnNlRmlsdGVyLlhfU1RBVFVTX0hFQURFUikpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoYXNzZXJ0TWVzc2FnZSwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKFRyYWNlUmVzcG9uc2VGaWx0ZXIuWF9TRVJWRVJfRFVSQVRJT05fSEVBREVSKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEdldEV4Y2VwdGlvbihpbnQgdWMsIGludCBleHBlY3RlZFN0YXR1cywgYm9vbGVhbiBmYWlsKSB7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gdGFyZ2V0KCkucGF0aCgiL3Jlc291cmNlLyIgKyB1YykucmVxdWVzdCgpOworICAgICAgICBidWlsZGVyID0gYnVpbGRlci5oZWFkZXIoSXNzdWUyMTc2UmVwcm9kdWNlclJlc291cmNlLlhfUkVTUE9OU0VfRU5USVRZX0hFQURFUiwgdHJ1ZSk7CisgICAgICAgIGlmIChmYWlsKSB7CisgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5oZWFkZXIoSXNzdWUyMTc2UmVwcm9kdWNlclJlc291cmNlLlhfRkFJTF9IRUFERVIsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLmdldCgpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZENvbnRlbnQgPSAiW0ZJTFRFUl1bL0ZJTFRFUl0iOworICAgICAgICBmaW5hbCBTdHJpbmcgYXNzZXJ0TWVzc2FnZSA9IHVjICsgIjoiICsgZXhwZWN0ZWRTdGF0dXMgKyAifCIgKyBmYWlsOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXNzZXJ0TWVzc2FnZSwgZXhwZWN0ZWRTdGF0dXMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgaWYgKCFzZW5kRXJyb3JFeHBlY3RlZChleHBlY3RlZFN0YXR1cywgZmFsc2UpKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFzc2VydE1lc3NhZ2UsIGV4cGVjdGVkU3RhdHVzID09IDUwMCA/ICJGQUlMIiA6ICJPSyIsCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhUcmFjZVJlc3BvbnNlRmlsdGVyLlhfU1RBVFVTX0hFQURFUikpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoYXNzZXJ0TWVzc2FnZSwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKFRyYWNlUmVzcG9uc2VGaWx0ZXIuWF9TRVJWRVJfRFVSQVRJT05fSEVBREVSKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGFzc2VydE1lc3NhZ2UsIFN0cmluZy52YWx1ZU9mKGV4cGVjdGVkQ29udGVudC5sZW5ndGgoKSksCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoYXNzZXJ0TWVzc2FnZSwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKFRyYWNlUmVzcG9uc2VGaWx0ZXIuWF9TVEFUVVNfSEVBREVSKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChhc3NlcnRNZXNzYWdlLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoVHJhY2VSZXNwb25zZUZpbHRlci5YX1NFUlZFUl9EVVJBVElPTl9IRUFERVIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kRXJyb3JFeHBlY3RlZChmaW5hbCBpbnQgdWMsIGZpbmFsIGJvb2xlYW4gcmVzcG9uc2VFbnRpdHkpIHsKKyAgICAgICAgcmV0dXJuICEoKEplcnNleTIxNzZBcHApIGNvbmZpZ3VyZSgpKS5pc1NldFN0YXR1c092ZXJTZW5kRXJyb3IoKSAmJiAodWMgPj0gNDAwKSAmJiAhcmVzcG9uc2VFbnRpdHk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNlbmRFcnJvcklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZTZW5kRXJyb3JJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWIyNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZTZW5kRXJyb3JJVENhc2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIxNzYuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxNzZTZW5kRXJyb3JJVENhc2UgZXh0ZW5kcyBKZXJzZXkyMTc2SVRDYXNlQmFzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIxNzZTZW5kRXJyb3JBcHAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKEplcnNleTIxNzZTZW5kRXJyb3JBcHAuQVBQX1BBVEgpLmJ1aWxkKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNldFN0YXR1c0lUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZTZXRTdGF0dXNJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODk0ZWUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZTZXRTdGF0dXNJVENhc2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIxNzYuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxNzZTZXRTdGF0dXNJVENhc2UgZXh0ZW5kcyBKZXJzZXkyMTc2SVRDYXNlQmFzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIxNzZTZXRTdGF0dXNBcHAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKEplcnNleTIxNzZTZXRTdGF0dXNBcHAuQVBQX1BBVEgpLmJ1aWxkKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTUxNTZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvcG9tLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTIxODQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTIxODQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yMTg0IC0gU2VydmxldENvbnRleHQgaW5qZWN0aW9uIGludG8gQXBwbGljYXRpb24gc3ViY2xhc3MgY29uc3RydWN0b3IuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE4NC9BcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE4NC9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGEyNzlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTg0L0FwcC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE4NDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKKy8qKgorICogVGVzdCBBcHBsaWNhdGlvbiBzdWJjbGFzcyBmb3IgSkVSU0VZLTIxODQgaW50ZWdyYXRpb24gdGVzdC4KKyAqCisgKiBUZXN0cyB0aGUgYWJpbGl0eSB0byBpbmplY3Qge0BsaW5rIFNlcnZsZXRDb250ZXh0fSBpbnRvIGFwcGxpY2F0aW9uIHN1YmNsYXNzIGNvbnN0cnVjdG9yCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICAvKiogY29uc3RydWN0b3ItaW5qZWN0ZWQgc2VydmxldENvbnRleHQgKi8KKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGN0eDsKKworICAgIHB1YmxpYyBBcHAoQENvbnRleHQgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQpIHsKKyAgICAgICAgdGhpcy5jdHggPSBzZXJ2bGV0Q29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBIYXNoU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBTdHJpbmcgZHluYW1pY0NsYXNzTmFtZSA9IGN0eC5nZXRJbml0UGFyYW1ldGVyKCJkeW5hbWljQ2xhc3NOYW1lIik7CisgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gbnVsbDsKKyAgICAgICAgaWYgKGNsYXNzZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShkeW5hbWljQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIHN3YWxsb3cgdGhlIGV4Y2VwdGlvbiAtIGlmIGNsYXNzIGlzIG5vdCBsb2FkZWQsIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IHdpbGwgZmFpbAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKGNsYXp6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxODQvTW9ua2V5UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE4NC9Nb25rZXlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTM1NmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxODQvTW9ua2V5UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxODQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIGZvciB0aGUgc2VydmxldDMtd2ViYXBwIGV4YW1wbGUuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgibW9ua2V5IikKK3B1YmxpYyBjbGFzcyBNb25rZXlSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBjaGF0dGVyKCkgeworICAgICAgICByZXR1cm4gIk9vb2ghIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGIxNjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMCIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxODQuQXBwPC9zZXJ2bGV0LW5hbWU+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE4NC5BcHA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi96b28vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgICAgPGNvbnRleHQtcGFyYW0+CisgICAgICAgIDxkZXNjcmlwdGlvbj5Db250ZXh0IHBhcmFtZXRlciB0byB0ZXN0IHRoZSBjb3JyZWN0IFNlcnZsZXRDb250ZXh0IGluamVjdGlvbiBpbnRvIEFwcGxpY2F0aW9uIHN1YmNsYXNzLjwvZGVzY3JpcHRpb24+CisgICAgICAgIDxwYXJhbS1uYW1lPmR5bmFtaWNDbGFzc05hbWU8L3BhcmFtLW5hbWU+CisgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTg0Lk1vbmtleVJlc291cmNlPC9wYXJhbS12YWx1ZT4KKyAgICA8L2NvbnRleHQtcGFyYW0+Cis8L3dlYi1hcHA+CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE4NC9KZXJzZXkyMTg0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxODQvSmVyc2V5MjE4NElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NDIwM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxODQvSmVyc2V5MjE4NElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE4NDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5IazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhlIEpFUlNFWS0yMTg0IGZpeCAodGhlIGFiaWxpdHkgdG8gaW5qZWN0IFNlcnZsZXRDb250ZXh0IGludG8gYXBwbGljYXRpb24gc3ViY2xhc3MgY29uc3RydWN0b3IpLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxODRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7ICAvLyBkdW1teSBBcHBsaWNhdGlvbiBpbnN0YW5jZSBmb3IgdGhlIHRlc3QgZnJhbWV3b3JrIC0gd2lsbCBubyBiZSB1c2VkLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiem9vIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiB7QGxpbmsgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dH0gaGFzIGJlZW4gY29ycmVjdGx5IGluamVjdGVkIGludG8ge0BsaW5rIEFwcH0gY29uc3RydWN0b3IgcGFyYW1ldGVyOworICAgICAqIFRoZSByZXNvdXJjZSB1bmRlciB0aGlzIFVSTCBpcyBiZWluZyBsb2FkZWQgZHluYW1pY2FsbHkgYmFzZWQgb24gYSBjb250ZXh0IHBhcmFtZXRlciBpbiB0aGUgd2ViLnhtbCwKKyAgICAgKiBzbyBpZiBpbmplY3Rpb24gZmFpbHMsIHRoZSByZXNvdXJjZSB3aWxsIG5vdCBiZSBhdmFpbGFibGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uKCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoIm1vbmtleSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPb29oISIsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjI1NS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWYyYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjI1NS9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjI1NTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjI1NTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5GaWx0ZXJpbmcgaGllcmFyY2h5IHRlc3QgLSBKRVJTRVktMjI1NSAtIEVudGl0eSBEYXRhIEZpbHRlcmluZyBzaG91bGQgc3VwcG9ydCBpbmhlcml0ZWQgZmllbGRzPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAJPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAJPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIAk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgCTxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjI1NS9Jc3N1ZTIyNTVSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMjU1L0lzc3VlMjI1NVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjMmYzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjI1NS9Jc3N1ZTIyNTVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIyNTU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBFcmljIE1pbGVzIChlbWlsZXN2dCBhdCBnbWFpbC5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIElzc3VlMjI1NVJlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQSB7CisKKyAgICAgICAgcHVibGljIEEoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQShTdHJpbmcgZmllbGRBMSkgeworICAgICAgICAgICAgdGhpcy5maWVsZEExID0gZmllbGRBMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkQTE7CisKKyAgICAgICAgQERldGFpbGVkCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRBMSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZEExOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmllbGRBMShmaW5hbCBTdHJpbmcgZmllbGRBMSkgeworICAgICAgICAgICAgdGhpcy5maWVsZEExID0gZmllbGRBMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQiBleHRlbmRzIEEgeworCisgICAgICAgIHB1YmxpYyBCKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIoU3RyaW5nIGZpZWxkQTEsIFN0cmluZyBmaWVsZEIxKSB7CisgICAgICAgICAgICBzdXBlcihmaWVsZEExKTsKKyAgICAgICAgICAgIHRoaXMuZmllbGRCMSA9IGZpZWxkQjE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBmaWVsZEIxOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRCMSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWVsZEIxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmllbGRCMShmaW5hbCBTdHJpbmcgZmllbGRCMSkgeworICAgICAgICAgICAgdGhpcy5maWVsZEIxID0gZmllbGRCMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQERvY3VtZW50ZWQKKyAgICBARW50aXR5RmlsdGVyaW5nCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIERldGFpbGVkIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIHtAY29kZSBQcm9qZWN0RGV0YWlsZWRWaWV3fSBhbm5vdGF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5CisgICAgICAgICAgICAgICAgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxEZXRhaWxlZD4KKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIERldGFpbGVkIHsKKworICAgICAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIERldGFpbGVkIGdldCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJBIikKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGdldEEoQFF1ZXJ5UGFyYW0oImRldGFpbGVkIikgZmluYWwgYm9vbGVhbiBpc0RldGFpbGVkKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgIC5vaygpCisgICAgICAgICAgICAgICAgLmVudGl0eShuZXcgQSgiZmllbGRBMVZhbHVlIiksIGlzRGV0YWlsZWQgPyBuZXcgQW5ub3RhdGlvbltdIHtEZXRhaWxlZC5GYWN0b3J5LmdldCgpfSA6IG5ldyBBbm5vdGF0aW9uWzBdKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBQYXRoKCJCIikKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGdldEIoQFF1ZXJ5UGFyYW0oImRldGFpbGVkIikgZmluYWwgYm9vbGVhbiBpc0RldGFpbGVkKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgIC5vaygpCisgICAgICAgICAgICAgICAgLmVudGl0eShuZXcgQigiZmllbGRBMVZhbHVlIiwgImZpZWxkQjFWYWx1ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXRhaWxlZCA/IG5ldyBBbm5vdGF0aW9uW10ge0RldGFpbGVkLkZhY3RvcnkuZ2V0KCl9IDogbmV3IEFubm90YXRpb25bMF0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjI1NS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIyNTUvSmVyc2V5MjI1NS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMjU1L0plcnNleTIyNTUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRkMWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMjU1L0plcnNleTIyNTUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIyNTU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjI1NSByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBFcmljIE1pbGVzIChlbWlsZXN2dCBhdCBnbWFpbC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMjU1IGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTIyNTUoKSB7CisgICAgICAgIHJlZ2lzdGVyKElzc3VlMjI1NVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMDUwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMjU1U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjI1NS5KZXJzZXkyMjU1PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMjU1U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMjU1L0plcnNleTIyNTVJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjI1NS9KZXJzZXkyMjU1SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5NmViYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjI1NS9KZXJzZXkyMjU1SVRDYXNlLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMjU1OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjI1NS5Jc3N1ZTIyNTVSZXNvdXJjZS5BOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIyNTUuSXNzdWUyMjU1UmVzb3VyY2UuQjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjI1NS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgTWlsZXMgKGVtaWxlc3Z0IGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIyNTVJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyMjU1KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXIgc2lkZSByZXNwb25zZSBpcyB3cmFwcGVkLCBuZWVkcyB0byBiZSByZWFkIHRvIHdyYXBwZXIgY2xhc3MuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NBR2V0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiQSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgQSBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KEEuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydE51bGwoZW50aXR5LmdldEZpZWxkQTEoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0YWlsZWRDbGFzc0FHZXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJBIikucXVlcnlQYXJhbSgiZGV0YWlsZWQiLCB0cnVlKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIEEgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShBLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRGaWVsZEExKCksIGVxdWFsVG8oImZpZWxkQTFWYWx1ZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXIgc2lkZSByZXNwb25zZSBpcyByZXR1cm5lZCBhcyBvcmlnIGNsYXNzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERldGFpbGVkQ2xhc3NCR2V0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiQiIpLnF1ZXJ5UGFyYW0oImRldGFpbGVkIiwgdHJ1ZSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBCIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoQi5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RmllbGRBMSgpLCBlcXVhbFRvKCJmaWVsZEExVmFsdWUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEZpZWxkQjEoKSwgZXF1YWxUbygiZmllbGRCMVZhbHVlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzQkdldCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIkIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIEIgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShCLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnROdWxsKGVudGl0eS5nZXRGaWVsZEExKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRGaWVsZEIxKCksIGVxdWFsVG8oImZpZWxkQjFWYWx1ZSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMjIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRhYTZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMjIvcG9tLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTIzMjI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTIzMjI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTIzMjIgLSBObyB3YXkgdG8gY29uZmlndXJlIGF1dG8tZGlzY292ZXJlZCBKYWNrc29uIDIueCBPYmplY3RNYXBwZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWV0YWluZi1zZXJ2aWNlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvSXNzdWUyMzIyUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9Jc3N1ZTIzMjJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOGIwNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvSXNzdWUyMzIyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMjI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIElzc3VlMjMyMlJlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNvblN0cmluZzEgeworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgSnNvblN0cmluZzEoKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEpzb25TdHJpbmcxKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzb25TdHJpbmcyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIEpzb25TdHJpbmcyKCkgeworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBKc29uU3RyaW5nMihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIjEiKQorICAgIEBQVVQKKyAgICBwdWJsaWMgSnNvblN0cmluZzEgcHV0KGZpbmFsIEpzb25TdHJpbmcxIHdyYXBwZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKc29uU3RyaW5nMSgiSGVsbG8gIiArIHdyYXBwZXIuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQFBhdGgoIjIiKQorICAgIEBQVVQKKyAgICBwdWJsaWMgSnNvblN0cmluZzIgcHV0KGZpbmFsIEpzb25TdHJpbmcyIHdyYXBwZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKc29uU3RyaW5nMigiSGkgIiArIHdyYXBwZXIuZ2V0VmFsdWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvSmVyc2V5MjMyMi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzIyL0plcnNleTIzMjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc5YzFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzIyL0plcnNleTIzMjIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMjI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjMyMiByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIzMjIgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MjMyMigpIHsKKyAgICAgICAgcmVnaXN0ZXIoSXNzdWUyMzIyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKE15T2JqZWN0TWFwcGVyUHJvdmlkZXIuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9NeU9iamVjdE1hcHBlclByb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvTXlPYmplY3RNYXBwZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmU2MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvTXlPYmplY3RNYXBwZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMyMjsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5EZXNlcmlhbGl6YXRpb25GZWF0dXJlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgTXlPYmplY3RNYXBwZXJQcm92aWRlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxPYmplY3RNYXBwZXI+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RNYXBwZXIgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlID09IElzc3VlMjMyMlJlc291cmNlLkpzb25TdHJpbmcxLmNsYXNzKSB7CisgICAgICAgICAgICBPYmplY3RNYXBwZXIgcmVzdWx0ID0gbmV3IE9iamVjdE1hcHBlcigpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpZ3VyZShTZXJpYWxpemF0aW9uRmVhdHVyZS5XUkFQX1JPT1RfVkFMVUUsIHRydWUpOworICAgICAgICAgICAgcmVzdWx0LmNvbmZpZ3VyZShEZXNlcmlhbGl6YXRpb25GZWF0dXJlLlVOV1JBUF9ST09UX1ZBTFVFLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2FkMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjMyMlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMjIuSmVyc2V5MjMyMjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjMyMlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9KZXJzZXkyMzIySVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvSmVyc2V5MjMyMklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOTczYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvSmVyc2V5MjMyMklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMyMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblByb3BlcnR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjMyMi4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjMyMklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyMzIyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXIgc2lkZSByZXNwb25zZSBpcyB3cmFwcGVkLCBuZWVkcyB0byBiZSByZWFkIHRvIHdyYXBwZXIgY2xhc3MuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmFja3NvbjJKc29uUHV0MSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIjEiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5qc29uKG5ldyBJc3N1ZTIzMjJSZXNvdXJjZS5Kc29uU3RyaW5nMSgiZm9vIikpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoV3JhcHBlcjEuY2xhc3MpLmdldEpzb25TdHJpbmcxKCkuZ2V0VmFsdWUoKSwgZXF1YWxUbygiSGVsbG8gZm9vIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcnZlciBzaWRlIHJlc3BvbnNlIGlzIHJldHVybmVkIGFzIG9yaWcgY2xhc3MuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmFja3NvbjJKc29uUHV0MigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIjIiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5qc29uKG5ldyBJc3N1ZTIzMjJSZXNvdXJjZS5Kc29uU3RyaW5nMigiZm9vIikpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoSXNzdWUyMzIyUmVzb3VyY2UuSnNvblN0cmluZzIuY2xhc3MpLmdldFZhbHVlKCksIGVxdWFsVG8oIkhpIGZvbyIpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV3JhcHBlcjEgeworICAgICAgICBASnNvblByb3BlcnR5KCJKc29uU3RyaW5nMSIpCisgICAgICAgIElzc3VlMjMyMlJlc291cmNlLkpzb25TdHJpbmcxIGpzb25TdHJpbmcxOworCisgICAgICAgIHB1YmxpYyBJc3N1ZTIzMjJSZXNvdXJjZS5Kc29uU3RyaW5nMSBnZXRKc29uU3RyaW5nMSgpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uU3RyaW5nMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEpzb25TdHJpbmcxKElzc3VlMjMyMlJlc291cmNlLkpzb25TdHJpbmcxIGpzb25TdHJpbmcxKSB7CisgICAgICAgICAgICB0aGlzLmpzb25TdHJpbmcxID0ganNvblN0cmluZzE7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWJlZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9wb20ueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjMzNTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjMzNTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjMzNSAtIFByb3ZpZGVycyBkbyBub3QgZ2V0IGluamVjdGVkIHByb3Blcmx5PC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1ldGFpbmYtc2VydmljZXM8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzM1L0NvbnN0cnVjdG9ySW5qZWN0ZWRQcm92aWRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzM1L0NvbnN0cnVjdG9ySW5qZWN0ZWRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTlkMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvQ29uc3RydWN0b3JJbmplY3RlZFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMzM1OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKKworLyoqCisgKiBDb25zdHJ1Y3RvciBpbmplY3RlZCBwcm92aWRlciB0byBwcm92ZSB0aGF0IHByb3ZpZGVyIHJlZ2lzdGVyZWQgdmlhIG1ldGEtaW5mL3NlcnZpY2VzCisgKiBtZWNoYW5pc20gZ2V0cyBjb25zdHJ1Y3RlZCB2aWEgSEsyIGFuZCBzbyB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVycyBhcmUgcHJvcGVybHkgaW5qZWN0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoInRleHQvY3Rvci1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JJbmplY3RlZFByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICBQcm92aWRlcnMgcHJvdmlkZXJzOworCisgICAgcHVibGljIENvbnN0cnVjdG9ySW5qZWN0ZWRQcm92aWRlcihAQ29udGV4dCBmaW5hbCBQcm92aWRlcnMgcHJvdmlkZXJzKSB7CisgICAgICAgIHRoaXMucHJvdmlkZXJzID0gcHJvdmlkZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFN0cmluZyB0LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyB0LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiBwbGFpblRleHRXcml0ZXIgPQorICAgICAgICAgICAgICAgIHByb3ZpZGVycy5nZXRNZXNzYWdlQm9keVdyaXRlcihTdHJpbmcuY2xhc3MsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgidmlhIGN0b3IgaW5qZWN0ZWQgcHJvdmlkZXI6Ii5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgICAgIHBsYWluVGV4dFdyaXRlci53cml0ZVRvKHQsIHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlLCBodHRwSGVhZGVycywgZW50aXR5U3RyZWFtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvRmllbGRJbmplY3RlZFByb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvRmllbGRJbmplY3RlZFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2YmMwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9GaWVsZEluamVjdGVkUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMzU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEZpZWxkIGluamVjdGVkIHByb3ZpZGVyIHRvIHByb3ZlIHRoYXQgcHJvdmlkZXIgcmVnaXN0ZXJlZCB2aWEgbWV0YS1pbmYvc2VydmljZXMKKyAqIG1lY2hhbmlzbSBnZXRzIGluamVjdGVkIHZpYSBISzIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoInRleHQvZmllbGQtaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIEZpZWxkSW5qZWN0ZWRQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4geworCisgICAgQENvbnRleHQgUHJvdmlkZXJzIHByb3ZpZGVyczsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFN0cmluZyB0LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyB0LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiBwbGFpblRleHRXcml0ZXIgPQorICAgICAgICAgICAgICAgIHByb3ZpZGVycy5nZXRNZXNzYWdlQm9keVdyaXRlcihTdHJpbmcuY2xhc3MsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgidmlhIGZpZWxkIGluamVjdGVkIHByb3ZpZGVyOiIuZ2V0Qnl0ZXMoTWVzc2FnZVV0aWxzLmdldENoYXJzZXQobWVkaWFUeXBlKSkpOworICAgICAgICBwbGFpblRleHRXcml0ZXIud3JpdGVUbyh0LCB0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMsIGVudGl0eVN0cmVhbSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzM1L0lzc3VlMjMzNVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvSXNzdWUyMzM1UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE0NGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzM1L0lzc3VlMjMzNVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMzM1OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogVGVzdCByZXNvdXJjZSB0aGF0IHByb3ZpZGVzIGEgc2ltcGxlIHRleHQgcmVzcG9uc2UuCisgKiBUaGUgcmVzcG9uc2UgdGV4dCB0aGVuIGdldHMgc2VyaWFsaXplZCB1c2luZyBtZXNzYWdlIGJvZHkgd3JpdGVyCisgKiBzcGVjaWZpZWQgYnkgbWVkaWEgdHlwZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL3RleHQiKQorcHVibGljIGNsYXNzIElzc3VlMjMzNVJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvKiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGV5IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvSmVyc2V5MjMzNS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzM1L0plcnNleTIzMzUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGZmN2UyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzM1L0plcnNleTIzMzUuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMzU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTIzMzUgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMzM1IGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTIzMzUoKSB7CisgICAgICAgIHJlZ2lzdGVyKElzc3VlMjMzNVJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWJjYThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcgpAQCAtMCwwICsxLDIgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMzUuRmllbGRJbmplY3RlZFByb3ZpZGVyCitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMzM1LkNvbnN0cnVjdG9ySW5qZWN0ZWRQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZDhiNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjMzNVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMzUuSmVyc2V5MjMzNTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjMzNVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9KZXJzZXkyMzM1SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvSmVyc2V5MjMzNUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYTU3MzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvSmVyc2V5MjMzNUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMzNTsKKworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yMzM1LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMzM1SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIzMzUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpZWxkSW5qZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXh0IikucmVxdWVzdCgpLmFjY2VwdCgidGV4dC9maWVsZC1pbmplY3RlZCIpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJ2aWEgZmllbGQgaW5qZWN0ZWQgcHJvdmlkZXI6SGV5IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbnN0cnVjdG9ySW5qZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXh0IikucmVxdWVzdCgpLmFjY2VwdCgidGV4dC9jdG9yLWluamVjdGVkIikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oInZpYSBjdG9yIGluamVjdGVkIHByb3ZpZGVyOkhleSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjQyMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI0MjEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGFlMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI0MjEvcG9tLnhtbApAQCAtMCwwICsxLDYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI0MjE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI0MjE8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+Q2xpZW50IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjQyMSAtIE11bHRpUGFydEZlYXR1cmUgcmVxdWlyZXMgamVyc2V5LXNlcnZlciB0byBiZSBvbiB0aGUgY2xhc3MtcGF0aDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjQyMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI0MjEvSmVyc2V5MjQyMVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNDIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjQyMS9KZXJzZXkyNDIxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzExODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjQyMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI0MjEvSmVyc2V5MjQyMVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNDIxOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFCb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5OdWxsT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yNDIxLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjQyMVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdENvbm5lY3RvciBpbXBsZW1lbnRzIENvbm5lY3RvciwgQ29ubmVjdG9yUHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UgYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0U3RyZWFtUHJvdmlkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShmaW5hbCBpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTnVsbE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC53cml0ZUVudGl0eSgpOworCisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0SGVhZGVyU3RyaW5nKCJDb250ZW50LVR5cGUiKS5jb250YWlucygiYm91bmRhcnkiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudFJlc3BvbnNlKFJlc3BvbnNlLlN0YXR1cy5PSywgcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgLy8gTk9PUAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRSZXNwb25zZShSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QsIHJlcXVlc3QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGdXR1cmU8Pz4gYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcihmaW5hbCBDbGllbnQgY2xpZW50LCBmaW5hbCBDb25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IG11bHRpcGFydCBmZWF0dXJlIHdvcmtzIG9uIHRoZSBjbGllbnQtc2lkZSAtIGN1c3RvbSBjb25uZWN0b3IgY2hlY2tzIHByZXNlbmNlIG9mIHtAY29kZSBib3VuZGFyeX0gcGFyYW1ldGVyIGluCisgICAgICogdGhlIHtAY29kZSBDb250ZW50LVR5cGV9IGhlYWRlciAodGhlIGhlYWRlciBpcyBhZGRlZCB0byB0aGUgcmVxdWVzdCBpbiBNQlcpLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpUGFydEZlYXR1cmVPbkNsaWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBUZXN0Q29ubmVjdG9yKCkpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBNdWx0aVBhcnQgZW50aXR5ID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgICAgICAuYm9keVBhcnQobmV3IEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgicGFydCIpLmJ1aWxkKCksICJDT05URU5UIikpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGNsYXNzZXMgZnJvbSBqZXJzZXktc2VydmVyIG1vZHVsZSBjYW5ub3QgYmUgbG9hZGVkLgorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEplcnNleVNlcnZlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZmQ4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjU1MTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjU1MTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjU1MSAtIEluamVjdGlvbnMjZ2VuZXJhdG9yIGZpZWxkIGlzIGhhcmQgY29kZWQgdG8gU2VydmljZUxvY2F0b3JHZW5lcmF0b3JJbXBsPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9KZXJzZXkyNTUxLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvSmVyc2V5MjU1MS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZjMyNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvSmVyc2V5MjU1MS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjU1MTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjU1MSByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyNTUxIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTI1NTEoKSB7CisgICAgICAgIHJlZ2lzdGVyKFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZGJlODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI1NTE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3I7CisKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2F0b3IgaW5zdGFuY2VvZiBTZXJ2aWNlTG9jYXRvckdlbmVyYXRvci5DdXN0b21TZXJ2aWNlTG9jYXRvcgorICAgICAgICAgICAgPyBSZXNwb25zZS5vaygpLmJ1aWxkKCkgOiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNTUxL1NlcnZpY2VMb2NhdG9yR2VuZXJhdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvU2VydmljZUxvY2F0b3JHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTBiYTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNTUxL1NlcnZpY2VMb2NhdG9yR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNTUxOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5EeW5hbWljQ29uZmlndXJhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5CdWlsZGVySGVscGVyOworCitpbXBvcnQgb3JnLmp2bmV0LmhrMi5leHRlcm5hbC5nZW5lcmF0b3IuU2VydmljZUxvY2F0b3JHZW5lcmF0b3JJbXBsOworaW1wb3J0IG9yZy5qdm5ldC5oazIuaW50ZXJuYWwuRGVmYXVsdENsYXNzQW5hbHl6ZXI7CitpbXBvcnQgb3JnLmp2bmV0LmhrMi5pbnRlcm5hbC5EeW5hbWljQ29uZmlndXJhdGlvbkltcGw7CitpbXBvcnQgb3JnLmp2bmV0LmhrMi5pbnRlcm5hbC5EeW5hbWljQ29uZmlndXJhdGlvblNlcnZpY2VJbXBsOworaW1wb3J0IG9yZy5qdm5ldC5oazIuaW50ZXJuYWwuU2VydmljZUxvY2F0b3JJbXBsOworaW1wb3J0IG9yZy5qdm5ldC5oazIuaW50ZXJuYWwuVXRpbGl0aWVzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgU2VydmljZUxvY2F0b3JHZW5lcmF0b3IgZXh0ZW5kcyBTZXJ2aWNlTG9jYXRvckdlbmVyYXRvckltcGwgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNlcnZpY2VMb2NhdG9yIGNyZWF0ZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU2VydmljZUxvY2F0b3IgcGFyZW50KSB7CisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIFNlcnZpY2VMb2NhdG9ySW1wbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigicGFyZW50IG11c3QgYmUgYSAiICsgU2VydmljZUxvY2F0b3JJbXBsLmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgaW5zdGVhZCBpdCBpcyBhICIgKyBwYXJlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU2VydmljZUxvY2F0b3JJbXBsIHNsaSA9IG5ldyBDdXN0b21TZXJ2aWNlTG9jYXRvcihuYW1lLCAoU2VydmljZUxvY2F0b3JJbXBsKSBwYXJlbnQpOworCisgICAgICAgIGZpbmFsIER5bmFtaWNDb25maWd1cmF0aW9uSW1wbCBkY2kgPSBuZXcgRHluYW1pY0NvbmZpZ3VyYXRpb25JbXBsKHNsaSk7CisKKyAgICAgICAgLy8gVGhlIHNlcnZpY2UgbG9jYXRvciBpdHNlbGYKKyAgICAgICAgZGNpLmJpbmQoVXRpbGl0aWVzLmdldExvY2F0b3JEZXNjcmlwdG9yKHNsaSkpOworCisgICAgICAgIC8vIFRoZSBpbmplY3Rpb24gcmVzb2x2ZXIgZm9yIHRocmVlIHRoaXJ0eQorICAgICAgICBkY2kuYWRkQWN0aXZlRGVzY3JpcHRvcihVdGlsaXRpZXMuZ2V0VGhyZWVUaGlydHlEZXNjcmlwdG9yKHNsaSkpOworCisgICAgICAgIC8vIFRoZSBkeW5hbWljIGNvbmZpZ3VyYXRpb24gdXRpbGl0eQorICAgICAgICBkY2kuYmluZChCdWlsZGVySGVscGVyLmxpbmsoRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlSW1wbC5jbGFzcywgZmFsc2UpCisgICAgICAgICAgICAgICAgLnRvKER5bmFtaWNDb25maWd1cmF0aW9uU2VydmljZS5jbGFzcykKKyAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAubG9jYWxPbmx5KCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgZGNpLmJpbmQoQnVpbGRlckhlbHBlci5jcmVhdGVDb25zdGFudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgbmV3IERlZmF1bHRDbGFzc0FuYWx5emVyKHNsaSkpKTsKKworICAgICAgICBkY2kuY29tbWl0KCk7CisKKyAgICAgICAgcmV0dXJuIHNsaTsKKyAgICB9CisKKyAgICBjbGFzcyBDdXN0b21TZXJ2aWNlTG9jYXRvciBleHRlbmRzIFNlcnZpY2VMb2NhdG9ySW1wbCB7CisKKyAgICAgICAgcHVibGljIEN1c3RvbVNlcnZpY2VMb2NhdG9yKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTZXJ2aWNlTG9jYXRvckltcGwgcGFyZW50KSB7CisgICAgICAgICAgICBzdXBlcihuYW1lLCBwYXJlbnQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guaGsyLmV4dGVuc2lvbi5TZXJ2aWNlTG9jYXRvckdlbmVyYXRvciBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmhrMi5leHRlbnNpb24uU2VydmljZUxvY2F0b3JHZW5lcmF0b3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3MGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmhrMi5leHRlbnNpb24uU2VydmljZUxvY2F0b3JHZW5lcmF0b3IKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjU1MS5TZXJ2aWNlTG9jYXRvckdlbmVyYXRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWJkNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjU1MVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI1NTEuSmVyc2V5MjU1MTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjU1MVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9KZXJzZXkyNTUxSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvSmVyc2V5MjU1MUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NWUxYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvSmVyc2V5MjU1MUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjU1MTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjU1MS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI1NTFJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjU1MSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUxvY2F0b3JTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZTU1YWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9wb20ueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjYxMjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjYxMjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjYxMiAtIFNpbmdsZVZhbHVlRXh0cmFjdG9yIG1ha2VzIGl0IGltcG9zc2libGUgdG8gc3VwcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWwgKG9yIEd1YXZhIE9wdGlvbmFsKS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvSmVyc2V5MjYxMi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL0plcnNleTI2MTIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGI2Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL0plcnNleTI2MTIuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MTI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTI2MTIgcmVwcm9kdWNlciB0ZXN0LgorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjYxMiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkyNjEyKCkgeworICAgICAgICByZWdpc3RlcihSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKE9wdGlvbmFsUGFyYW1GZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvT3B0aW9uYWxQYXJhbUJpbmRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL09wdGlvbmFsUGFyYW1CaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODgwOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL09wdGlvbmFsUGFyYW1CaW5kZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MTI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CisKK2ZpbmFsIGNsYXNzIE9wdGlvbmFsUGFyYW1CaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIFBhcmFtIGNvbnZlcnRlciBwcm92aWRlcnMKKyAgICAgICAgYmluZChPcHRpb25hbFBhcmFtQ29udmVydGVyUHJvdmlkZXIuY2xhc3MpLnRvKFBhcmFtQ29udmVydGVyUHJvdmlkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL09wdGlvbmFsUGFyYW1Db252ZXJ0ZXJQcm92aWRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL09wdGlvbmFsUGFyYW1Db252ZXJ0ZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjZlZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvT3B0aW9uYWxQYXJhbUNvbnZlcnRlclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjEyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uQ2xhc3NUeXBlUGFpcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PcHRpb25hbDsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIE9wdGlvbmFsUGFyYW1Db252ZXJ0ZXJQcm92aWRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIE9wdGlvbmFsUGFyYW1Db252ZXJ0ZXJQcm92aWRlcihmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihmaW5hbCBDbGFzczxUPiByYXdUeXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgZmluYWwgTGlzdDxDbGFzc1R5cGVQYWlyPiBjdHBzID0gUmVmbGVjdGlvbkhlbHBlci5nZXRUeXBlQXJndW1lbnRBbmRDbGFzcyhnZW5lcmljVHlwZSk7CisgICAgICAgIGZpbmFsIENsYXNzVHlwZVBhaXIgY3RwID0gKGN0cHMuc2l6ZSgpID09IDEpID8gY3Rwcy5nZXQoMCkgOiBudWxsOworICAgICAgICBpZiAoY3RwID09IG51bGwgfHwgY3RwLnJhd0NsYXNzKCkgPT0gU3RyaW5nLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmFtQ29udmVydGVyPFQ+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBUIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByYXdUeXBlLmNhc3QoT3B0aW9uYWwuZnJvbU51bGxhYmxlKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhmaW5hbCBUIHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTZXQ8UGFyYW1Db252ZXJ0ZXJQcm92aWRlcj4gY29udmVydGVyUHJvdmlkZXJzID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0UHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIFBhcmFtQ29udmVydGVyUHJvdmlkZXIuY2xhc3MpOworICAgICAgICBmb3IgKFBhcmFtQ29udmVydGVyUHJvdmlkZXIgcHJvdmlkZXIgOiBjb252ZXJ0ZXJQcm92aWRlcnMpIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgZmluYWwgUGFyYW1Db252ZXJ0ZXI8Pz4gY29udmVydGVyID0gcHJvdmlkZXIuZ2V0Q29udmVydGVyKGN0cC5yYXdDbGFzcygpLCBjdHAudHlwZSgpLCBhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICBpZiAoY29udmVydGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmFtQ29udmVydGVyPFQ+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYXdUeXBlLmNhc3QoT3B0aW9uYWwuZnJvbU51bGxhYmxlKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmFuc2Zvcm0oKEZ1bmN0aW9uPFN0cmluZywgT2JqZWN0PikgcyAtPiBjb252ZXJ0ZXIuZnJvbVN0cmluZyh2YWx1ZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIFQgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9PcHRpb25hbFBhcmFtRmVhdHVyZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL09wdGlvbmFsUGFyYW1GZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhZjRkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9PcHRpb25hbFBhcmFtRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYxMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitwdWJsaWMgY2xhc3MgT3B0aW9uYWxQYXJhbUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IE9wdGlvbmFsUGFyYW1CaW5kZXIoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMWJlMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MTI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9wdGlvbmFsOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICBAUGF0aCgiaGVsbG8iKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgaGVsbG8oQFF1ZXJ5UGFyYW0oIm5hbWUiKSBmaW5hbCBPcHRpb25hbDxTdHJpbmc+IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyAiICsgbmFtZS5vcigiV29ybGQiKSArICIhIjsKKyAgICB9CisKKyAgICBAUGF0aCgic3F1YXJlIikKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgaW50IGVjaG8oQFF1ZXJ5UGFyYW0oInZhbHVlIikgZmluYWwgT3B0aW9uYWw8SW50ZWdlcj4gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLnRyYW5zZm9ybShuZXcgRnVuY3Rpb248SW50ZWdlciwgSW50ZWdlcj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGFwcGx5KGZpbmFsIEludGVnZXIgaW50ZWdlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnRlZ2VyICogaW50ZWdlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkub3IoMCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTA2ODA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTI2MTJTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjEyLkplcnNleTI2MTI8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTI2MTJTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvSmVyc2V5MjYxMklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL0plcnNleTI2MTJJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmZiYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL0plcnNleTI2MTJJVENhc2UuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MTI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjYxMi4KKyAqLworcHVibGljIGNsYXNzIEplcnNleTI2MTJJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjYxMigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNZXRob2RXaXRoT3B0aW9uYWxHaXZlbk5vUXVlcnlQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2hlbGxvIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJIZWxsbyBXb3JsZCEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNZXRob2RXaXRoT3B0aW9uYWxHaXZlblF1ZXJ5UGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9oZWxsbyIpLnF1ZXJ5UGFyYW0oIm5hbWUiLCAiSmVyc2V5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJIZWxsbyBKZXJzZXkhIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTWV0aG9kV2l0aE9wdGlvbmFsSW50R2l2ZW5Ob1F1ZXJ5UGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9zcXVhcmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIjAiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNZXRob2RXaXRoT3B0aW9uYWxJbnRHaXZlblF1ZXJ5UGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9zcXVhcmUiKS5xdWVyeVBhcmFtKCJ2YWx1ZSIsICI0MiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiMTc2NCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MzcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjE1NzkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MzcvcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI2Mzc8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI2Mzc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yNjM3IC0gc2Vuc2l0aXZlIHBhcmFtcyBjYW4gYmUgZXhwb3NlZCBpbiBsb2dzIGV2ZW4gZm9yIFBPU1QgcmVxdWVzdHMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzNy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L0plcnNleTI2MzcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjIxNmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L0plcnNleTI2MzcuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2Mzc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTI2MzcgcmVwcm9kdWNlciB0ZXN0LgorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjYzNyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkyNjM3KCkgeworICAgICAgICByZWdpc3RlcihSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L1BhcmFtRWF0aW5nRmlsdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvUGFyYW1FYXRpbmdGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTUyMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L1BhcmFtRWF0aW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjM3OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbUVhdGluZ0ZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KGZpbmFsIEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTk9PUAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgZmluYWwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAvLyBOT00tTk9NLgorICAgICAgICByZXF1ZXN0LmdldFBhcmFtZXRlck1hcCgpOworCisgICAgICAgIC8vIENvbnRpbnVlLgorICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgLy8gTk9PUAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYzNy9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0MDFjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYzNy9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYzNzsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgcGFyYW1zKEBGb3JtUGFyYW0oInVzZXJuYW1lIikgQERlZmF1bHRWYWx1ZSgia28iKSBmaW5hbCBTdHJpbmcgdXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgicGFzc3dvcmQiKSBARGVmYXVsdFZhbHVlKCJrbyIpIGZpbmFsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICByZXR1cm4gdXNlcm5hbWUgKyAiXyIgKyBwYXNzd29yZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTFkNDNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDgwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXkyNjM3RmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjM3LlBhcmFtRWF0aW5nRmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+amVyc2V5MjYzN0ZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmRlZmF1bHQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MzcuSmVyc2V5MjYzNzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+ZGVmYXVsdDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2RlZmF1bHQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5lbmFibGVkPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjM3LkplcnNleTI2Mzc8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZvcm0ucXVlcnlQYXJhbXMuZGlzYWJsZWQ8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmVuYWJsZWQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9lbmFibGVkLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+ZGlzYWJsZWQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MzcuSmVyc2V5MjYzNzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZsZXQuZm9ybS5xdWVyeVBhcmFtcy5kaXNhYmxlZDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5kaXNhYmxlZDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2Rpc2FibGVkLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L0plcnNleTI2MzdEaXNhYmxlZElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L0plcnNleTI2MzdEaXNhYmxlZElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNmI2OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzN0Rpc2FibGVkSVRDYXNlLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYzNzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yNjM3IC0gUXVlcnkgcGFyYW1zIGNhbm5vdCBiZSBpbmplY3RlZCB1c2luZyB7QGxpbmsgamF2YXgud3MucnMuRm9ybVBhcmFtfS4KKyAqLworcHVibGljIGNsYXNzIEplcnNleTI2MzdEaXNhYmxlZElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyNjM3KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCkKKyAgICAgICAgICAgICAgICAucGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKQorICAgICAgICAgICAgICAgIC5wYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJkaXNhYmxlZCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5mb3JtKGZvcm0pKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInVzZXJfcGFzcyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZGlzYWJsZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCkpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoImtvX2tvIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZVF1ZXJ5UGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJkaXNhYmxlZCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKS5xdWVyeVBhcmFtKCJwYXNzd29yZCIsICJwYXNzIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXNlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZm9ybShuZXcgRm9ybSgpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJrb19rbyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkUXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImRpc2FibGVkIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXMlMjBlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZm9ybShuZXcgRm9ybSgpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJrb19rbyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtQW5kUXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKQorICAgICAgICAgICAgICAgIC5wYXJhbSgidXNlcm5hbWUiLCAidXNlciIpCisgICAgICAgICAgICAgICAgLnBhcmFtKCJwYXNzd29yZCIsICJwYXNzIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImRpc2FibGVkIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXNlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZm9ybShmb3JtKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJ1c2VyX3Bhc3MiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybUFuZERvdWJsZVF1ZXJ5UGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCkKKyAgICAgICAgICAgICAgICAucGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKQorICAgICAgICAgICAgICAgIC5wYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJkaXNhYmxlZCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKS5xdWVyeVBhcmFtKCJwYXNzd29yZCIsICJwYXNzIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXNlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZm9ybShmb3JtKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJ1c2VyX3Bhc3MiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L0plcnNleTI2MzdFbmFibGVkSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzN0VuYWJsZWRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQwYmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L0plcnNleTI2MzdFbmFibGVkSVRDYXNlLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYzNzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjYzNyAtIFF1ZXJ5IHBhcmFtcyBjYW4gYmUgaW5qZWN0ZWQgdXNpbmcge0BsaW5rIGphdmF4LndzLnJzLkZvcm1QYXJhbX0uCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSmVyc2V5MjYzN0VuYWJsZWRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJwYXRoID0gezB9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IHBhdGhzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXXt7ImRlZmF1dCJ9LCB7ImVuYWJsZWQifX0pOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgIHB1YmxpYyBTdHJpbmcgcGF0aDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjYzNygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpCisgICAgICAgICAgICAgICAgLnBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikKKyAgICAgICAgICAgICAgICAucGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZm9ybShmb3JtKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJ1c2VyX3Bhc3MiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXNlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZm9ybShuZXcgRm9ybSgpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJ1c2VyX3Bhc3MiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXNlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCkpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInVzZXJfcGFzcyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkUXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXMlMjBlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZm9ybShuZXcgRm9ybSgpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJ1cyBlcl9wYXNzIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1BbmRRdWVyeVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpCisgICAgICAgICAgICAgICAgLnBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikKKyAgICAgICAgICAgICAgICAucGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKGZvcm0pKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInVzZXJfcGFzcyIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU3NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvcG9tLnhtbApAQCAtMCwwICsxLDYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yNjU0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yNjU0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSB0ZXN0IHdlYiBhcHBsaWNhdGlvbiAtIHNlcnZsZXQvZmlsdGVyLCBKRVJTRVktMjY1NCByZXByb2R1Y2VyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NTQvU2VydmxldEZpbHRlclRlc3RSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjU0L1NlcnZsZXRGaWx0ZXJUZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmMwNjJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjU0L1NlcnZsZXRGaWx0ZXJUZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2NTQ7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogVGVzdCByZXNvdXJjZSB0byBiZSBjYWxsZWQgd2l0aGluIGFuIFNlcnZsZXRDb250YWluZXIgcmVnaXN0ZXJlZCBhcyBzZXJ2bGV0IGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJmaWx0ZXIiKQorcHVibGljIGNsYXNzIFNlcnZsZXRGaWx0ZXJUZXN0UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSB3aGF0WW91U2VuZElzV2hhdFlvdUdldChARGVmYXVsdFZhbHVlKCIiKSBAUXVlcnlQYXJhbSgianNvbiIpIGZpbmFsIFN0cmluZyBqc29uKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShqc29uKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY1NC9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY1NC9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTkwMDhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjU0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY1NDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiB0byBjb25maWd1cmUgcmVzb3VyY2VzIGZvciBKRVJTRVktMjUyNSByZXByb2R1Y2VyLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGNsYXNzZXMuYWRkKFNlcnZsZXRGaWx0ZXJUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVjMjBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPk15QXBwbGljYXRpb248L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2NTQuVGVzdEFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPk15QXBwbGljYXRpb248L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjU0L0plcnNleTI2NTRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjU0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY1NC9KZXJzZXkyNjU0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4OWI2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjU0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY1NC9KZXJzZXkyNjU0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjU0OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmV0LlNvY2tldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjY1NAorICoKKyAqIFRlc3RzLCB0aGF0IHVuZW5jb2RlZCBjdXJseSBicmFja2V0cyAodHlwaWNhbGx5IHVzZWQgaW4gVVJJIHF1ZXJpZXMgY29udGFpbmluZyBKU09OKSBkbyBub3QgY2F1c2UgdGhlIHJlcXVlc3QgdG8KKyAqIGZhaWwgd2hlbiBydW5uaW5nIGluIGEgc2VydmxldCBlbnZpcm9ubWVudCBhbmQgY29uZmlndXJlZCBhcyBhIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyNjU0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkluVXJpV2l0aFNvY2tldHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBMb3cgbGV2ZWwgYXBwcm9hY2ggd2l0aCBzb2NrZXRzIGlzIHVzZWQsIGJlY2F1c2UgY29tbW9uIEphdmEgSFRUUCBjbGllbnRzIGFyZSB1c2luZyBqYXZhLm5ldC5VUkksCisgICAgICAgIC8vIHdoaWNoIGZhaWxzIHdoZW4gdW5lbmNvZGVkIGN1cmx5IGJyYWNrZXQgaXMgcGFydCBvZiB0aGUgVVJJCisgICAgICAgIGZpbmFsIFNvY2tldCBzb2NrZXQgPSBuZXcgU29ja2V0KGdldEJhc2VVcmkoKS5nZXRIb3N0KCksIGdldEJhc2VVcmkoKS5nZXRQb3J0KCkpOworICAgICAgICBmaW5hbCBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpKSk7CisKKyAgICAgICAgLy8gcXVvdGVzIGFyZSBlbmNvZGVkIGJ5IGJyb3dzZXJzLCBjdXJseSBicmFja2V0cyBhcmUgbm90LCBzbyB0aGUgcXVvdGVzIHdpbGwgYmUgc2VudCBwcmUtZW5jb2RlZAorICAgICAgICAvLyBIVFRQIDEuMCBpcyB1c2VkIGZvciBzaW1wbGljaXR5CisgICAgICAgIHB3LnByaW50bG4oIkdFVCAvZmlsdGVyP2pzb249eyUyMmZvbyUyMjolMjJiYXIlMjJ9IEhUVFAvMS4wIik7CisgICAgICAgIHB3LnByaW50bG4oKTsgICAvLyBodHRwIHJlcXVlc3Qgc2hvdWxkIGVuZCB3aXRoIGEgYmxhbmsgbGluZQorICAgICAgICBwdy5mbHVzaCgpOworCisgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKSkpOworCisgICAgICAgIFN0cmluZyBsYXN0TGluZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyByZWFkIHRoZSByZXNwb25zZSBhbmQgcmVtZW1iZXIgdGhlIGxhc3QgbGluZQorICAgICAgICAgICAgbGFzdExpbmUgPSBsaW5lOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygie1wiZm9vXCI6XCJiYXJcIn0iLCBsYXN0TGluZSk7CisgICAgICAgIGJyLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3YWEzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3BvbS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjY3MzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjY3MzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgdGVzdCB3ZWIgYXBwbGljYXRpb24gLSBzZXJ2bGV0L2ZpbHRlciwgSkVSU0VZLTI2NzMgcmVwcm9kdWNlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9KZXJzZXkyNjczLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NzMvSmVyc2V5MjY3My5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZjYyNzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NzMvSmVyc2V5MjY3My5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY3MzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjY3MyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkyNjczKCkgeworICAgICAgICAvLyBSZXNvdXJjZXMuCisgICAgICAgIHJlZ2lzdGVyKFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICAvLyBQcm92aWRlcnMuCisgICAgICAgIHJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdmFsaWRhdGlvbnMgZXJyb3JzIGFyZSByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAgICBwcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX1NFTkRfRVJST1JfSU5fUkVTUE9OU0UsIHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjczL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2YTM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY3MzsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi8iKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIEBWYWxpZAorICAgIHB1YmxpYyBSZXNwb25zZSBwcm9jZXNzQmVhbihAVmFsaWQgZmluYWwgU2FtcGxlQmVhbiBiZWFuKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhuZXcgU2FtcGxlQmVhbigpKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9TYW1wbGVCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NzMvU2FtcGxlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWMwMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NzMvU2FtcGxlQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY3MzsKKworaW1wb3J0IG9yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLk5vdEVtcHR5OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgU2FtcGxlQmVhbiB7CisKKyAgICBATm90RW1wdHkKKyAgICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKKworICAgIHB1YmxpYyBieXRlW10gZ2V0QXJyYXkoKSB7CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShmaW5hbCBieXRlW10gYXJyYXkpIHsKKyAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMjg3OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IgorICAgICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY3My5KZXJzZXkyNjczPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NzMvSmVyc2V5MjY3M0lUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjczL0plcnNleTI2NzNJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU3MDAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjczL0plcnNleTI2NzNJVENhc2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2NzM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25FcnJvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNjczOiA0MDAgZXJyb3JzIGdlbmVyYXRlZCBieSBhIFZhbGlkYXRpb25FeGNlcHRpb24gYXJlIHJldHVybmluZyBkZWZhdWx0IGVycm9yIHBhZ2UgaW5zdGVhZCBvZgorICogdGhlIEJlYW4gVmFsaWRhdGlvbidzIHJlc3BvbnNlIGVudGl0eS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI2NzNJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjY3MygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikucG9zdChFbnRpdHkuanNvbihuZXcgU2FtcGxlQmVhbigpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpLCBpcyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QuZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShuZXcgR2VuZXJpY1R5cGU8TGlzdDxWYWxpZGF0aW9uRXJyb3I+PigpIHt9KS5zaXplKCksIGlzKDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRwdXRQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU2FtcGxlQmVhbiBlbnRpdHkgPSBuZXcgU2FtcGxlQmVhbigpOworICAgICAgICBlbnRpdHkuc2V0QXJyYXkobmV3IGJ5dGVbXSB7NDJ9KTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikucG9zdChFbnRpdHkuanNvbihlbnRpdHkpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IuZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShuZXcgR2VuZXJpY1R5cGU8TGlzdDxWYWxpZGF0aW9uRXJyb3I+PigpIHt9KS5zaXplKCksIGlzKDEpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NTgzYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9wb20ueG1sCkBAIC0wLDAgKzEsOTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjY4OTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjY4OTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjY4OSAtIFByb2JsZW0gd2l0aCB2YWxpZGF0aW9uIGVycm9ycyBvbiBwcmltaXRpdmUgdHlwZSBhcnJheXM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amFja3Nvbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amFja3Nvbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amFja3Nvbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5qYXhyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tamF4cnMtanNvbi1wcm92aWRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amFja3Nvbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvSmVyc2V5MjY4OS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjg5L0plcnNleTI2ODkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzE4MzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjg5L0plcnNleTI2ODkuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2ODk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5TZXJpYWxpemF0aW9uRmVhdHVyZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uamF4cnMuanNvbi5KYWNrc29uSmF4Ykpzb25Qcm92aWRlcjsKKworLyoqCisgKiBAYXV0aG9yIE9zY2FyIEd1aW5kemJlcmcKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI2ODkgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MjY4OSgpIHsKKyAgICAgICAgLy8gU2V0IHBhY2thZ2UgdG8gbG9vayBmb3IgcmVzb3VyY2VzIGluCisgICAgICAgIHBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjg5Iik7CisKKyAgICAgICAgdGhpcy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX1NFTkRfRVJST1JfSU5fUkVTUE9OU0UsIHRydWUpOworCisgICAgICAgIC8vIGNyZWF0ZSBjdXN0b20gT2JqZWN0TWFwcGVyCisgICAgICAgIGZpbmFsIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisgICAgICAgIG1hcHBlci5lbmFibGUoU2VyaWFsaXphdGlvbkZlYXR1cmUuSU5ERU5UX09VVFBVVCk7CisKKyAgICAgICAgLy8gY3JlYXRlIEpzb25Qcm92aWRlciB0byBwcm92aWRlIGN1c3RvbSBPYmplY3RNYXBwZXIKKyAgICAgICAgZmluYWwgSmFja3NvbkpheGJKc29uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSmFja3NvbkpheGJKc29uUHJvdmlkZXIoKTsKKyAgICAgICAgcHJvdmlkZXIuc2V0TWFwcGVyKG1hcHBlcik7CisgICAgICAgIHRoaXMucmVnaXN0ZXIocHJvdmlkZXIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY4OS9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOTdiOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2ODk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOworCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBAUGF0aCgiL3Bvc3QtYmVhbiIpCisgICAgcHVibGljIHZvaWQgcHJvY2Vzc0JlYW4oQFZhbGlkIGZpbmFsIFNhbXBsZUJlYW4gYmVhbikgeworICAgICAgICAvL2RvLW5vdGhpbmcKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvU2FtcGxlQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjg5L1NhbXBsZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU3NTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjg5L1NhbXBsZUJlYW4uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2ODk7CisKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5Ob3RFbXB0eTsKKworcHVibGljIGNsYXNzIFNhbXBsZUJlYW4geworCisgICAgQE5vdEVtcHR5CisgICAgcHJpdmF0ZSBieXRlW10gYXJyYXk7CisKKyAgICBwdWJsaWMgYnl0ZVtdIGdldEFycmF5KCkgeworICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJyYXkoYnl0ZVtdIGFycmF5KSB7CisgICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDI4NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IgorICAgICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY4OS5KZXJzZXkyNjg5PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvSmVyc2V5MjY4OUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjg5L0plcnNleTI2ODlJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGIyZWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjg5L0plcnNleTI2ODlJVENhc2UuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjg5OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5TZXJpYWxpemF0aW9uRmVhdHVyZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uamF4cnMuanNvbi5KYWNrc29uSmF4Ykpzb25Qcm92aWRlcjsKKworLyoqCisgKiBUZXN0cyBmb3IgSkVSU0VZLTI2ODk6IFByb2JsZW0gd2l0aCB2YWxpZGF0aW9uIGVycm9ycyBvbiBwcmltaXRpdmUgdHlwZSBhcnJheXMuCisgKiA8cC8+IFRoZXJlIGlzIGEgYnVnIHdoZW4gYSB2YWxpZGF0aW9uIGZhaWxzIGZvciBhIHByaW1pdGl2ZSBkYXRhIGFycmF5LiBFZyBhIE5vdE51bGwgZmFpbGVkIHZhbGlkYXRpb24gb24gYSBieXRlW10gY2F1c2VzIHRoZSBjb2RlIHRvIHRocm93IGEgQ2xhc3NDYXN0RXhjZXB0aW9uLiBUaGUgcHJvYmxlbSBpcyBjYXVzZWQgYnkgVmFsaWRhdGlvbkhlbHBlci5nZXRWaW9sYXRpb25JbnZhbGlkVmFsdWUoT2JqZWN0IGludmFsaWRWYWx1ZSkgSXQgdHJpZXMgdG8gY2FzdCBhbnkgYXJyYXkgdG8gYSBPYmplY3RbXSBBIGJ5dGVbXSBwYXJhbWV0ZXIgd291bGQgZ2VuZXJhdGUgYSBDbGFzc0Nhc3RFeGNlcHRpb24uKgorICogQGF1dGhvciBPc2NhciBHdWluZHpiZXJnIChvc2Nhci5ndWluZHpiZXJnIGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI2ODlJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyNjg5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYSB0aHJlYWQgZ2V0cyBzdHVjayB3aGVuIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gaXMgdGhyb3duIGZyb20gdGhlIHtAY29kZQorICAgICAqIE1lc3NhZ2VCb2R5V3JpdGVyI3dyaXRlVG99LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBFeGVjdXRvci4KKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZXNwb25zZUZ1dHVyZSA9IGV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8UmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgU2FtcGxlQmVhbiBiZWFuID0gbmV3IFNhbXBsZUJlYW4oKTsKKyAgICAgICAgICAgICAgICBiZWFuLnNldEFycmF5KG5ldyBieXRlW117fSk7CisKKyAgICAgICAgICAgICAgICBPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworICAgICAgICAgICAgICAgIG1hcHBlci5lbmFibGUoU2VyaWFsaXphdGlvbkZlYXR1cmUuSU5ERU5UX09VVFBVVCk7CisgICAgICAgICAgICAgICAgSmFja3NvbkpheGJKc29uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSmFja3NvbkpheGJKc29uUHJvdmlkZXIoKTsKKyAgICAgICAgICAgICAgICBwcm92aWRlci5zZXRNYXBwZXIobWFwcGVyKTsKKyAgICAgICAgICAgICAgICBjbGllbnQoKS5yZWdpc3Rlcihwcm92aWRlcik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0KCkucGF0aCgicG9zdC1iZWFuIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShiZWFuLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0pOworCisgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5UaW1lID0gZXhlY3V0b3IuYXdhaXRUZXJtaW5hdGlvbig1MDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCisgICAgICAgIC8vIEFzc2VydHMuCisgICAgICAgIGFzc2VydFRydWUoaW5UaW1lKTsKKworICAgICAgICAvLyBSZXNwb25zZS4KKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNwb25zZUZ1dHVyZS5nZXQoKTsKKworICAgICAgICAvL01ha2Ugc3VyZSB3ZSBnZXQgYSA0MDAgZXJyb3IgYW5kIG5vdCBhIDUwMCBlcnJvcgorICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlYTM2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3BvbS54bWwKQEAgLTAsMCArMSw2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yNzA0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yNzA0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGlzIHRlc3QgaXMgdG8gdmVyaWZ5IGlmIFNlcnZpY2VMb2NhdG9yIGNhbiBiZSBjb25maWd1cmVkIHdpdGhpbiB0aGUgc2VydmVyIGNvbnRleHQKKyAgICAgICAgaW4gc3VjaCBhIHdheSB0aGF0IEplcnNleSBjYW4gdXNlIGl0IGFzIGEgcGFyZW50IFNlcnZpY2VMb2NhdG9yIGluIHRoZSBXZWJDb21wb25lbnQuCisgICAgICAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gSkVSU0VZLTI3MDQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9TZXJ2aWNlTG9jYXRvclNldHVwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvU2VydmljZUxvY2F0b3JTZXR1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjhiZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvU2VydmljZUxvY2F0b3JTZXR1cC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0TGlzdGVuZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLlNlcnZpY2VMb2NhdG9yVXRpbGl0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNC5zZXJ2aWNlcy5IYXBweVNlcnZpY2U7CisKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHRvIGxpc3RlbiBmb3Ige0BsaW5rIFNlcnZsZXRDb250ZXh0RXZlbnR9IGdlbmVyYXRlZCB3aGVuZXZlciBjb250ZXh0CisgKiBpcyBpbml0aWFsaXplZCBhbmQgc2V0IHtAbGluayBTZXJ2bGV0UHJvcGVydGllcyNTRVJWSUNFX0xPQ0FUT1J9IGF0dHJpYnV0ZSB0byBwb2ludAorICoge0BsaW5rIFNlcnZpY2VMb2NhdG9yfSBwcmUtcG9wdWxhdGVkIHdpdGgge0BsaW5rIEhhcHB5U2VydmljZX0gaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBCYXJ0b3N6IEZpcnluIChzYXJ4b3MpCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2aWNlTG9jYXRvclNldHVwIGltcGxlbWVudHMgU2VydmxldENvbnRleHRMaXN0ZW5lciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworICAgICAgICBTZXJ2aWNlTG9jYXRvciBsb2NhdG9yID0gU2VydmljZUxvY2F0b3JVdGlsaXRpZXMuY3JlYXRlQW5kUG9wdWxhdGVTZXJ2aWNlTG9jYXRvcigpOworICAgICAgICBTZXJ2aWNlTG9jYXRvclV0aWxpdGllcy5hZGRPbmVDb25zdGFudChsb2NhdG9yLCBuZXcgSGFwcHlTZXJ2aWNlKCkpOworICAgICAgICBldmVudC5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZShTZXJ2bGV0UHJvcGVydGllcy5TRVJWSUNFX0xPQ0FUT1IsIGxvY2F0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQoU2VydmxldENvbnRleHRFdmVudCBldmVudCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzdiYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworCisvKioKKyAqIEplcnNleSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEJhcnRvc3ogRmlyeW4gKGJhcnRvc3pmaXJ5biBhdCBnbWFpbC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA3Zjk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworCisvKioKKyAqIFRoaXMgcmVzb3VyY2UgaXMgdXNlZCB0byB0ZXN0IGlmIHNwZWNpZmljIHNlcnZpY2UgY2xhc3MgaW5zdGFuY2UgaXMgYXZhaWxhYmxlIGluIHRoZQorICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IHRoYXQgY29tZXMgZnJvbSBKZXJzZXkgY29udGV4dC4KKyAqCisgKiBAYXV0aG9yIEJhcnRvc3ogRmlyeW4gKGJhcnRvc3pmaXJ5biBhdCBnbWFpbC5jb20pCisgKi8KK0BQYXRoKCJ0ZXN0IikKK3B1YmxpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgLyoqCisgICAgICogSW5qZWN0IHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBmcm9tIEplcnNleSBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgdGhlIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfQorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgVGVzdFJlc291cmNlKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgdGVzdCBnaXZlbiBjbGFzcyBieSBjaGVja2luZyBpZiBpdCBpcyBhdmFpbGFibGUgaW4ge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9CisgICAgICogdGhhdCBoYXMgYmVlbiBpbmplY3RlZCBmcm9tIHRoZSBKZXJzZXkgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgc2VydmljZSBjbGFzcyBuYW1lIHRvIGNoZWNrCisgICAgICogQHJldHVybiB7QGxpbmsgUmVzcG9uc2V9IHdpdGggc3RhdHVzIGNvZGUgMjAwIGlmIHNlcnZpY2UgaXMgYXZhaWxhYmxlLCA2MDAgb3RoZXJ3aXNlCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSB3aGVuIHRoZXJlIGFyZSBhbnkgZXJyb3IgKGUuZy4gY2xhc3Mgbm90IGV4aXN0KQorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgie2NsYXp6fSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgUmVzcG9uc2UgdGVzdChAUGF0aFBhcmFtKCJjbGF6eiIpIFN0cmluZyBjbGF6eikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgLnN0YXR1cyhpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhenopKSAhPSBudWxsID8gMjAwIDogNjAwKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L3NlcnZpY2VzL0hhcHB5U2VydmljZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L3NlcnZpY2VzL0hhcHB5U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODdkOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvc2VydmljZXMvSGFwcHlTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzA0LnNlcnZpY2VzOworCitpbXBvcnQgb3JnLmp2bmV0LmhrMi5hbm5vdGF0aW9ucy5TZXJ2aWNlOworCisKKy8qKgorICogVGhpcyBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcn0gYW5kIHRoZXJlZm9yZQorICogY2FuIGJlIHVzZWQgaW4gSmVyc2V5IHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIEJhcnRvc3ogRmlyeW4gKGJhcnRvc3pmaXJ5biBhdCBnbWFpbC5jb20pCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgSGFwcHlTZXJ2aWNlIHsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L3NlcnZpY2VzL1NhZFNlcnZpY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9zZXJ2aWNlcy9TYWRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0ZGYyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9zZXJ2aWNlcy9TYWRTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzA0LnNlcnZpY2VzOworCitpbXBvcnQgb3JnLmp2bmV0LmhrMi5hbm5vdGF0aW9ucy5TZXJ2aWNlOworCisKKy8qKgorICogVGhpcyBzZXJ2aWNlIGlzIG5vdCByZWdpc3RlcmVkIGluIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcn0gYW5kIHRoZXJlZm9yZSBjYW5ub3QKKyAqIGJlIHVzZWQgaW4gdGhlIEplcnNleSByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBCYXJ0b3N6IEZpcnluIChiYXJ0b3N6ZmlyeW4gYXQgZ21haWwuY29tKQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIFNhZFNlcnZpY2UgeworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGEyNTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNC5TZXJ2aWNlTG9jYXRvclNldHVwPC9saXN0ZW5lci1jbGFzcz4KKyAgICA8L2xpc3RlbmVyPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3Q8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3MDQuVGVzdEFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvSmVyc2V5MjcwNElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L0plcnNleTI3MDRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ4MjllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L0plcnNleTI3MDRJVENhc2UuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3MDQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3MDQuc2VydmljZXMuSGFwcHlTZXJ2aWNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3MDQuc2VydmljZXMuU2FkU2VydmljZTsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVGhpcyB0ZXN0IGNhc2UgaXMgdG8gY292ZXIgZW5oYW5jZW1lbnQgaW1wbGVtZW50ZWQgaW4gSkVSU0VZLTI3MDQuIFRoZSBnb2FsIG9mIHRoaXMgZW5oYW5jZW1lbnQKKyAqIGlzIHRvIGdpdmUgdXNlcnMgcG9zc2liaWxpdHkgdG8gcmVnaXN0ZXIgbWFpbiB7QGxpbmsgU2VydmljZUxvY2F0b3J9IGluIHRoZSBzZXJ2bGV0IGNvbnRleHQsIHNvCisgKiBpdCBjYW4gYmUgbGF0ZXIgdXNlZCBieSBKZXJzZXkuIFRoaXMgY3JlYXRlcyB0aGUgb3Bwb3J0dW5pdHkgdG8gd2lyZSBKZXJzZXktc3BlY2lmaWMgY2xhc3NlcyB3aXRoCisgKiB0aGUgc2VydmljZXMgY3JlYXRlZCBvdXRzaWRlIHRoZSBKZXJzZXkgY29udGV4dC4KKyAqCisgKiBAYXV0aG9yIEJhcnRvc3ogRmlyeW4gKGJhcnRvc3pmaXJ5biBhdCBnbWFpbC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyNzA0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyBSRVNUIGVuZHBvaW50IHRvIGNoZWNrIHdoZXRoZXIgc3BlY2lmaWMgY2xhc3Mgc2VydmljZSBpcyByZWdpc3RlcmVkIGluIHRoZQorICAgICAqIHtAbGluayBTZXJ2aWNlTG9jYXRvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSB0aGUgc2VydmljZSBjbGFzcworICAgICAqIEByZXR1cm4gSFRUUCBzdGF0dXMgY29kZSwgMjAwIHdoZW4gc2VydmljZSBpcyBhdmFpbGFibGUgYW5kIDYwMCBvdGhlcndpc2UKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGluIGNhc2Ugb2YgcHJvYmxlbXMgd2l0aCBIVFRQIGNvbW11bmljYXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB0ZXN0KENsYXNzPD8+IHNlcnZpY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBzZXJ2aWNlLmdldENhbm9uaWNhbE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJ0ZXN0LyIgKyBuYW1lOworCisgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIG5ldyBVUkwocGF0aCkub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKyAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCk7CisgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOworCisgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gY292ZXIgc3VubnkgZGF5IHNjZW5hcmlvLCBpLmUuIHNwZWNpZmljIHNlcnZpY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCBpbiB0aGUgcGFyZW50CisgICAgICoge0BsaW5rIFNlcnZpY2VMb2NhdG9yfSBzbyBpdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgb25lIHRoYXQgaXMgdXNlZCBpbiBKZXJzZXkgY29udGV4dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0SW5qZWN0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHRlc3QoSGFwcHlTZXJ2aWNlLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBjb3ZlciByYWlueSBkYXkgc2NlbmFyaW8sIGkuZS4gc3BlY2lmaWMgc2VydmljZSBoYXMgPGI+bm90PC9iPiBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICogcGFyZW50IHtAbGluayBTZXJ2aWNlTG9jYXRvcn0gc28gaXQgY2Fubm90IGJlIHVzZWQgdG8gd2lyZSBKZXJzZXkgY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNpbmdJbmplY3Rpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMCwgdGVzdChTYWRTZXJ2aWNlLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3NzYvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0ODRhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3BvbS54bWwKQEAgLTAsMCArMSw4MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yNzc2PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yNzc2PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGlzIHRlc3QgaXMgdG8gdmVyaWZ5IHRoYXQgbXVsdGlwYXJ0IHN1cHBvcnQgKHNlcnZlciBzaWRlKSB3b3JrcyBldmVuIGlmIGFwYWNoZSBDWEYncyBSdW50aW1lRGVsZWdhdGVJbXBsIGlzIHVzZWQgaW5zdGVhZAorICAgICAgICBvZiB0aGUgUnVudGltZURlbGVnYXRlSW1wbCBzaGlwcGVkIHdpdGggSmVyc2V5LgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8IS0tIEZvciB0ZXN0aW5nIG11bHRpcGFydCBzdXBwb3J0IHdpdGggYW5vdGhlciBodHRwIGNsaWVudCAtLT4KKyAgICAgICAgPCEtLSBUaGUgb3JkZXIgb2YgdGhlc2UgaW1wb3J0cyBhcmUgaW1wb3J0YW50IGFzIGl0J3MgdGhlIGZpcnN0IGRlcGVuZGVuY3kgdGhhdCBoYXMgYSBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlIGluCisgICAgICAgICAgICAgdGhlIHNlcnZpY2VzIHRoYXQgd2lsbCBiZSB1c2VkLiAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmN4ZjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmN4Zi1ydC1ycy1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3NzYvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3NzYvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczOWJhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3NzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSmVyc2V5IGFwcGxpY2F0aW9uLgorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3NzYvVGVzdFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3NzYvVGVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwNWU5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3NzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFCb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTsKKworQFBhdGgoIi9maWxlcyIpCitwdWJsaWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIHVwbG9hZERvY3VtZW50KEBGb3JtRGF0YVBhcmFtKCJmaWxlX3BhdGgiKSBmaW5hbCBGb3JtRGF0YUJvZHlQYXJ0IGJvZHkpIHsKKyAgICAgICAgcmV0dXJuIGJvZHkuZ2V0VmFsdWVBcyhTdHJpbmcuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9KZXJzZXkyNzc2SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3NzYvSmVyc2V5Mjc3NklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmQyYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3NzYvSmVyc2V5Mjc3NklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjc3NjsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsLk11bHRpUGFydFJlYWRlckNsaWVudFNpZGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jeGYuamF4cnMuY2xpZW50LkpBWFJTQ2xpZW50RmFjdG9yeUJlYW47CitpbXBvcnQgb3JnLmFwYWNoZS5jeGYuamF4cnMuZXh0Lm11bHRpcGFydC5BdHRhY2htZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY3hmLmpheHJzLmV4dC5tdWx0aXBhcnQuQXR0YWNobWVudEJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jeGYuamF4cnMuZXh0Lm11bHRpcGFydC5Db250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jeGYuamF4cnMuZXh0Lm11bHRpcGFydC5NdWx0aXBhcnRCb2R5OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIENvZGUgdW5kZXIgdGVzdDoge0BsaW5rIE11bHRpUGFydFJlYWRlckNsaWVudFNpZGV9ICh1bnF1b3RlTWVkaWFUeXBlUGFyYW1ldGVycykKKyAqCisgKiBAYXV0aG9yIEpvbmF0YW4gSsO2bnNzb24gKGpvbnRlamogYXQgZ21haWwuY29tKQorICovCitASWdub3JlCitwdWJsaWMgY2xhc3MgSmVyc2V5Mjc3NklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBQYXRoKCIvZmlsZXMiKQorICAgIHB1YmxpYyBpbnRlcmZhY2UgQXBhY2hlQ3hmTXVsdGlwYXJ0Q2xpZW50IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgU3RyaW5nIHVwbG9hZERvY3VtZW50KE11bHRpcGFydEJvZHkgY29udGVudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhhdE11bHRpcGFydFNlcnZlclN1cHBvcnRzQm91bmRhcnlRdW90ZXNFdmVuV2l0aEludGVyZmVyaW5nUnVudGltZURlbGVnYXRlKCkgeworICAgICAgICBmaW5hbCBKQVhSU0NsaWVudEZhY3RvcnlCZWFuIGJlYW4gPSBuZXcgSkFYUlNDbGllbnRGYWN0b3J5QmVhbigpOworICAgICAgICBiZWFuLnNldEFkZHJlc3MoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICBiZWFuLnNldFNlcnZpY2VDbGFzcyhBcGFjaGVDeGZNdWx0aXBhcnRDbGllbnQuY2xhc3MpOworICAgICAgICBmaW5hbCBBcGFjaGVDeGZNdWx0aXBhcnRDbGllbnQgY3hmQ2xpZW50ID0gYmVhbi5jcmVhdGUoQXBhY2hlQ3hmTXVsdGlwYXJ0Q2xpZW50LmNsYXNzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgb3JpZ2luYWxDb250ZW50ID0gImFiYyI7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBjb250ZW50ID0gb3JpZ2luYWxDb250ZW50LmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpOworICAgICAgICBmaW5hbCBBdHRhY2htZW50IGZpbGVBdHRhY2htZW50ID0gbmV3IEF0dGFjaG1lbnRCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAub2JqZWN0KGNvbnRlbnQpCisgICAgICAgICAgICAgICAgLmNvbnRlbnREaXNwb3NpdGlvbihuZXcgQ29udGVudERpc3Bvc2l0aW9uKCJmb3JtLWRhdGE7IGZpbGVuYW1lPVwiYWJjLWZpbGVcIjsgbmFtZT1cImZpbGVfcGF0aFwiIikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVDb250ZW50UmV0dXJuZWRGcm9tU2VydmVyID0gY3hmQ2xpZW50LnVwbG9hZERvY3VtZW50KG5ldyBNdWx0aXBhcnRCb2R5KGZpbGVBdHRhY2htZW50KSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsZUNvbnRlbnRSZXR1cm5lZEZyb21TZXJ2ZXIsIGVxdWFsVG8ob3JpZ2luYWxDb250ZW50KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwOTY0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3BvbS54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yNzk0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yNzk0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBSZXByb2R1Y2VyIG9mIEpFUlNFWS0yNzk0LiBUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGF0IHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIHZpYSBtaW1lcHVsbCBsaWJyYXJ5IGFyZSBkZWxldGVkIHJpZ2h0IGFmdGVyCisgICAgICAgIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgZmFpbGVkIGFuZCBub3Qgd2hlbiB0aGUgSlZNIGlzIHNodXQgZG93bi4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc5NC9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc5NC9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTVkZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzk0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjc5NDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnRGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKZXJzZXkgYXBwbGljYXRpb24gZm9yIEpFUlNFWS0yNzk0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc5NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3OTQvVGVzdFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc5NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3OTQvVGVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4Yjg5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc5NC9UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3OTQ7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBAUFVUCisgICAgQENvbnN1bWVzKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgcHV0KEBGb3JtRGF0YVBhcmFtKCJzdHJlYW0iKSBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuICJPSyI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzk0L0plcnNleTI3OTRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc5NC9KZXJzZXkyNzk0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhNTRjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc5NC9KZXJzZXkyNzk0SVRDYXNlLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjc5NDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0UmVzdWx0OworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TaW1wbGVGaWxlVmlzaXRvcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogSkVSU0VZLTI3OTQgcmVwcm9kdWNlci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI3OTRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWltZVRlbXBGaWxlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKKworICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIG1hdGNoaW5nIE1JTUUqdG1wIGZpbGVzICh0aGUgbnVtYmVyIHNob3VsZCBiZSB0aGUgc2FtZSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXN0KS4KKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVGVtcEZpbGVzID0gbWF0Y2hpbmdUZW1wRmlsZXModGVtcERpcik7CisKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICBmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIlBVVCIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgInRleHQvcGxhaW4iKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT1YWFhYX1lZWVkiKTsKKworICAgICAgICBjb25uZWN0aW9uLnNldERvT3V0cHV0KHRydWUpOworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCItLVhYWFhfWVlZWSIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iLmdldEJ5dGVzKCkpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoJ1xuJyk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiYmlnLXBhcnRcIiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworCisgICAgICAgIC8vIFNlbmQgYmlnIGNodW5rIG9mIGRhdGEuCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTYgKiA0MDk2OyBpKyspIHsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnRScpOworICAgICAgICAgICAgaWYgKGkgJSAxMDI0ID09IDApIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERvIE5PVCBzZW5kIGVuZCBvZiB0aGUgTXVsdGlQYXJ0IG1lc3NhZ2UgdG8gc2ltdWxhdGUgdGhlIGlzc3VlLgorCisgICAgICAgIC8vIEdldCBSZXNwb25zZSAuLi4KKyAgICAgICAgYXNzZXJ0VGhhdCgiQmFkIFJlcXVlc3QgZXhwZWN0ZWQiLCBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpLCBpcyg0MDApKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgTWltZXB1bGwgbWVzc2FnZSBhbmQgaXQncyBwYXJ0cyBoYXZlIGJlZW4gY2xvc2VkIGFuZCB0ZW1wb3JhcnkgZmlsZXMgZGVsZXRlZC4KKyAgICAgICAgYXNzZXJ0VGhhdCgiVGVtcG9yYXJ5IG1pbWVwdWxsIGZpbGVzIHdlcmUgbm90IGRlbGV0ZWQiLCBtYXRjaGluZ1RlbXBGaWxlcyh0ZW1wRGlyKSwgaXMoZXhwZWN0ZWRUZW1wRmlsZXMpKTsKKworICAgICAgICAvLyAuLi4gRGlzY29ubmVjdC4KKyAgICAgICAgY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbWF0Y2hpbmdUZW1wRmlsZXMoZmluYWwgU3RyaW5nIHRlbXBEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEF0b21pY0ludGVnZXIgY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgRmlsZXMud2Fsa0ZpbGVUcmVlKFBhdGhzLmdldCh0ZW1wRGlyKSwgbmV3IFNpbXBsZUZpbGVWaXNpdG9yPFBhdGg+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZShQYXRoIGZpbGUsIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuZ2V0RmlsZU5hbWUoKS5zdGFydHNXaXRoKCJNSU1FIikgJiYgZmlsZS5nZXRGaWxlTmFtZSgpLmVuZHNXaXRoKCJ0bXAiKSkgeworICAgICAgICAgICAgICAgICAgICBjb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZUZhaWxlZChQYXRoIGZpbGUsIElPRXhjZXB0aW9uIGV4YykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgcG9zdFZpc2l0RGlyZWN0b3J5KFBhdGggZGlyLCBJT0V4Y2VwdGlvbiBleGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBjb3VudC5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NDYvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTU0ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NDYvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI4NDY8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI4NDY8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFJlcHJvZHVjZXIgb2YgSkVSU0VZLTI4NDYuIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgdmlhIG1pbWVwdWxsIChhbmQgbW92ZWQgYnkgSmVyc2V5KSBsaWJyYXJ5CisgICAgICAgIGFyZSBkZWxldGVkIHJpZ2h0IGFmdGVyIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgKGVpdGhlciBzdWNjZXNzZnVsIG9yIHVuc3VjY2Vzc2Z1bCkgYW5kIG5vdCB3aGVuIHRoZSBKVk0gaXMgc2h1dCBkb3duLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NDYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODQ2L1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NDYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODQ2L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGFmYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NDYvVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODQ2OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEplcnNleSBhcHBsaWNhdGlvbiBmb3IgSkVSU0VZLTI4NDYuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODQ2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg0Ni9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODQ2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg0Ni9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzU2ZmNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NDYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODQ2L1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg0NjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW07CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcygibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJFeGNlcHRpb25Jbk1ldGhvZCIpCisgICAgcHVibGljIFN0cmluZyBleGNlcHRpb25Jbk1ldGhvZChARm9ybURhdGFQYXJhbSgiZmlsZSIpIGZpbmFsIEZpbGUgZmlsZSkgeworICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgiU3VjY2Vzc2Z1bE1ldGhvZCIpCisgICAgcHVibGljIFN0cmluZyBzdWNjZXNzZnVsTWV0aG9kKEBGb3JtRGF0YVBhcmFtKCJmaWxlIikgZmluYWwgRmlsZSBmaWxlKSB7CisgICAgICAgIHJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODQ2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg0Ni9KZXJzZXkyODQ2SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NDYvSmVyc2V5Mjg0NklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWNhYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NDYvSmVyc2V5Mjg0NklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4NDY7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0UmVzdWx0OworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TaW1wbGVGaWxlVmlzaXRvcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQm9keVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YU11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEpFUlNFWS0yODQ2IHJlcHJvZHVjZXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyODQ2SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTXVsdGlQYXJ0RmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZW1wRmlsZURlbGV0ZWRBZnRlclN1Y2Nlc3NmdWxQcm9jZXNzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0U21hbGwoIlN1Y2Nlc3NmdWxNZXRob2QiLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVtcEZpbGVEZWxldGVkQWZ0ZXJFeGNlcHRpb25Jbk1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFNtYWxsKCJFeGNlcHRpb25Jbk1ldGhvZCIsIDUwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZW1wRmlsZURlbGV0ZWRBZnRlclN1Y2Nlc3NmdWxQcm9jZXNzaW5nQmlnRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0QmlnKCJTdWNjZXNzZnVsTWV0aG9kIiwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlbXBGaWxlRGVsZXRlZEFmdGVyRXhjZXB0aW9uSW5NZXRob2RCaWdFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RCaWcoIkV4Y2VwdGlvbkluTWV0aG9kIiwgNTAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEJpZyhmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgaW50IHN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBhcnJheSA9IG5ldyBieXRlWzgxOTZdOworICAgICAgICBBcnJheXMuZmlsbChhcnJheSwgKGJ5dGUpIDUyKTsKKworICAgICAgICBfdGVzdChwYXRoLCBzdGF0dXMsIGFycmF5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFNtYWxsKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBpbnQgc3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QocGF0aCwgc3RhdHVzLCAiQ09OVEVOVCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBpbnQgc3RhdHVzLCBmaW5hbCBPYmplY3QgZW50aXR5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlbXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CisKKyAgICAgICAgLy8gR2V0IG51bWJlciBvZiBtYXRjaGluZyBNSU1FKnRtcCBmaWxlcyAodGhlIG51bWJlciBzaG91bGQgYmUgdGhlIHNhbWUgYXQgdGhlIGVuZCBvZiB0aGUgdGVzdCkuCisgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFRlbXBGaWxlcyA9IG1hdGNoaW5nVGVtcEZpbGVzKHRlbXBEaXIpOworCisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG11bHRpcGFydCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpOworICAgICAgICBmaW5hbCBGb3JtRGF0YUJvZHlQYXJ0IGJvZHlwYXJ0ID0gbmV3IEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgiZmlsZSIpLmZpbGVOYW1lKCJmaWxlIikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICBlbnRpdHksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICBtdWx0aXBhcnQuYm9keVBhcnQoYm9keXBhcnQpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChwYXRoKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG11bHRpcGFydCwgTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpKTsKKworICAgICAgICAvLyBHZXQgUmVzcG9uc2UgLi4uCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKHN0YXR1cykpOworICAgICAgICAvLyBXYWl0IGEgc2Vjb25kIHRvIG1ha2Ugc3VyZSB0aGUgZmlsZXMgZG9uJ3QgZXhpc3QuCisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbWVzc2FnZSBhbmQgaXQncyBwYXJ0cyBoYXZlIGJlZW4gY2xvc2VkIGFuZCB0ZW1wb3JhcnkgZmlsZXMgZGVsZXRlZC4KKyAgICAgICAgYXNzZXJ0VGhhdCgiVGVtcG9yYXJ5IGZpbGVzIHdlcmUgbm90IGRlbGV0ZWQiLCBtYXRjaGluZ1RlbXBGaWxlcyh0ZW1wRGlyKSwgaXMoZXhwZWN0ZWRUZW1wRmlsZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtYXRjaGluZ1RlbXBGaWxlcyhmaW5hbCBTdHJpbmcgdGVtcERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQXRvbWljSW50ZWdlciBjb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBGaWxlcy53YWxrRmlsZVRyZWUoUGF0aHMuZ2V0KHRlbXBEaXIpLCBuZXcgU2ltcGxlRmlsZVZpc2l0b3I8UGF0aD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlKFBhdGggZmlsZSwgQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBQYXRoIG5hbWUgPSBmaWxlLmdldEZpbGVOYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lLnN0YXJ0c1dpdGgoInJlcCIpIHx8IG5hbWUuc3RhcnRzV2l0aCgiTUlNRSIpKSAmJiBuYW1lLmVuZHNXaXRoKCJ0bXAiKSkgeworICAgICAgICAgICAgICAgICAgICBjb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHZpc2l0RmlsZUZhaWxlZChQYXRoIGZpbGUsIElPRXhjZXB0aW9uIGV4YykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgcG9zdFZpc2l0RGlyZWN0b3J5KFBhdGggZGlyLCBJT0V4Y2VwdGlvbiBleGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBjb3VudC5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NzgvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Y2YWUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NzgvcG9tLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI4Nzg8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI4Nzg8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFJlcHJvZHVjZXIgb2YgSkVSU0VZLTI4NzguCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg3OC9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg3OC9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y1MzNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg3ODsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKZXJzZXkgYXBwbGljYXRpb24gZm9yIEpFUlNFWS0yODc4LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFRlc3RBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NzgvVGVzdFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NzgvVGVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhZGE2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg3OC9UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4Nzg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBBIHNpbXBsZSByZXNvdXJjZSB0aGF0IHJldHVybnMgYSBzdHJpbmcuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgic3RyaW5nIikKK3B1YmxpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkhlbGxvLCBXb3JsZCEgIgorICAgICAgICAgICAgICAgICsgIkluIHByb2R1Y3Rpb24gdGhpcyByZXNwb25zZSB3b3VsZCBiZSBsYXJnZSwgIgorICAgICAgICAgICAgICAgICsgImFuZCB1bnN1aXRhYmxlIGZvciBidWZmZXJpbmcgaW4gbWVtb3J5IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NzgvSmVyc2V5Mjg3OEFwYWNoZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L0plcnNleTI4NzhBcGFjaGVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg2YjUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L0plcnNleTI4NzhBcGFjaGVJVENhc2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4Nzg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CisKKy8qKgorICogQWRkaXRpb25hbCB0ZXN0IGNsYXNzIHRoYXQgdGVzdHMgamVyc2V5IGNsaWVudCBjb25maWd1cmVkIHdpdGggdGhlIGFwYWNoZSBodHRwLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI4NzhBcGFjaGVJVENhc2UgZXh0ZW5kcyBKZXJzZXkyODc4SVRDYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisKKyAgICAgICAgc3VwZXIuY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L0plcnNleTI4NzhJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg3OC9KZXJzZXkyODc4SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxZjQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg3OC9KZXJzZXkyODc4SVRDYXNlLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg3ODsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworcHVibGljIGNsYXNzIEplcnNleTI4NzhJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgTGlzdDxJbnB1dFN0cmVhbT4gcmVzcG9uc2VJbnB1dFN0cmVhbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBDbGllbnRSZXNwb25zZUZpbHRlciB0cmFja0lucHV0U3RyZWFtcyA9IG5ldyBDbGllbnRSZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJlc3BvbnNlSW5wdXRTdHJlYW1zLmFkZChyZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5U3RyZWFtKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcih0cmFja0lucHV0U3RyZWFtcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb25zdW1lU3RyZWFtRnVsbHkoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlIChpbnB1dFN0cmVhbS5yZWFkKCkgIT0gLTEpIHsKKyAgICAgICAgICAgIC8vY29uc3VtZSB0aGUgc3RyZWFtIGZ1bGx5CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRoaXNTaG91bGRXb3JrQnV0RmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gdGFyZ2V0KCJzdHJpbmciKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnN1bWVTdHJlYW1GdWxseShzdHJlYW0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biB3aGVuIHJlYWQoKSB3YXMgY2FsbGVkIG9uIGNsb3NlZCBzdHJlYW0hIFN0cmVhbSBpbXBsZW1lbnRhdGlvbjogIiArIHN0cmVhbS5nZXRDbGFzcygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBkZXNpcmVkCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUaGF0QWxsSW5wdXRTdHJlYW1zQXJlQ2xvc2VkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0aGlzV29ya3NCdXRJc1JlYWxseVVnbHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInN0cmluZyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKSAhPSBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LlNVQ0NFU1NGVUwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXZSBoYXZlIHRvIG1hbnVhbGx5IGNoZWNrIHRoYXQgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIik7CisgICAgICAgIH0KKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gcmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25zdW1lU3RyZWFtRnVsbHkoc3RyZWFtKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biB3aGVuIHJlYWQoKSB3YXMgY2FsbGVkIG9uIGNsb3NlZCBzdHJlYW0hIFN0cmVhbSBpbXBsZW1lbnRhdGlvbjogIiArIHN0cmVhbS5nZXRDbGFzcygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBkZXNpcmVkCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUaGF0QWxsSW5wdXRTdHJlYW1zQXJlQ2xvc2VkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0aGlzQWxzb0ZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJzdHJpbmciKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0RmFtaWx5KCkgIT0gUmVzcG9uc2UuU3RhdHVzLkZhbWlseS5TVUNDRVNTRlVMKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiV2UgaGF2ZSB0byBtYW51YWxseSBjaGVjayB0aGF0IHRoZSByZXNwb25zZSB3YXMgc3VjY2Vzc2Z1bCIpOworICAgICAgICB9CisKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gcmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25zdW1lU3RyZWFtRnVsbHkoc3RyZWFtKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24gd2hlbiByZWFkKCkgd2FzIGNhbGxlZCBvbiBjbG9zZWQgc3RyZWFtISBTdHJlYW0gaW1wbGVtZW50YXRpb246ICIgKyBzdHJlYW0uZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgZGVzaXJlZAorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VGhhdEFsbElucHV0U3RyZWFtc0FyZUNsb3NlZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd29ya3NXaXRoQUNhc3RfaWZZb3VLbm93VGhhdFlvdUNhbkNhc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInN0cmluZyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKSAhPSBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LlNVQ0NFU1NGVUwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXZSBoYXZlIHRvIG1hbnVhbGx5IGNoZWNrIHRoYXQgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIik7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSAoSW5wdXRTdHJlYW0pIHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uc3VtZVN0cmVhbUZ1bGx5KHN0cmVhbSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIHdoZW4gcmVhZCgpIHdhcyBjYWxsZWQgb24gY2xvc2VkIHN0cmVhbSEgU3RyZWFtIGltcGxlbWVudGF0aW9uOiAiICsgc3RyZWFtLmdldENsYXNzKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIGRlc2lyZWQKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRoYXRBbGxJbnB1dFN0cmVhbXNBcmVDbG9zZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VGhhdEFsbElucHV0U3RyZWFtc0FyZUNsb3NlZCgpIHsKKyAgICAgICAgaWYgKHJlc3BvbnNlSW5wdXRTdHJlYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBmYWlsKCJubyBpbnB1dCBzdHJlYW0gdG8gY2hlY2siKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKElucHV0U3RyZWFtIHN0cmVhbSA6IHJlc3BvbnNlSW5wdXRTdHJlYW1zKSB7CisgICAgICAgICAgICBhc3NlcnRDbG9zZWQoc3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDbG9zZWQoSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMjU2XTsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkKGJ1ZmZlcik7IC8vaXQncyBub3QgaWdub3JlZCDigJQgd2UncmUgY2hlY2tpbmcgZm9yIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgIGZhaWwoIlN0cmVhbSBpcyBub3QgY2xvc2VkISBTdHJlYW0gaW1wbGVtZW50YXRpb246ICIgKyBzdHJlYW0uZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvbiBpcyBkZXNpcmVkCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQ2NDdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvcG9tLnhtbApAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI4OTI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI4OTI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFJlcHJvZHVjZXIgb2YgSkVSU0VZLTI4OTIuCisKKyAgICAgICAgUmVwZWF0aW5nIGNsYXNzZXMgaW4gb2JqZWN0IGdyYXBoIG9mIGVudGl0eSBmaWx0ZXJpbmcgZmFjaWxpdHkgc2hvdWxkIG5vdCBiZSBhbHdheXMgZmlsdGVyZWQgb3V0LgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gd2hpY2ggamVyc2V5IG1lZGlhIHByb3ZpZGVyIHRvIHVzZSBpcyBkZXRlcm1pbmVkIGluIHdlYi54bWwgYnkgdXNpbmcgJ2plcnNleS5jb25maWcuanNvbkZlYXR1cmUnIGluaXQgcGFyYW0gLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODkyL1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODkyL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjVlYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODkyOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSmVyc2V5IGFwcGxpY2F0aW9uIGZvciBKRVJTRVktMjg3OCBhbmQgYWxzbyBKLTYwNSAod2hpY2ggaXMgZGVyaXZlZCBmcm9tIHRoZSBmb3JtZXIgb25lKS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTliMjUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODkyL1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4OTI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworCisvKioKKyAqIEEgcmVzb3VyY2UgdGhhdCBwcm92aWRlcyBhIG1lYW5zIHRvIHRlc3Qgd2hldGhlciByZXBlYXRpbmcgY2xhc3NlcyBpbiBvYmplY3QgZ3JhcGggYXJlIGNvcnJlY3RseSBmaWx0ZXJlZCBvdXQuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCitwdWJsaWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUGF0aCgicG9pbnRlciIpCisgICAgcHVibGljIFBvaW50ZXIgcG9pbnRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludGVyKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQb2ludGVyIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgUGVyc29ucyBwZXJzb25zID0gbmV3IFBlcnNvbnMoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBQZXJzb25zIGlzc3VlKCkgeworICAgICAgICByZXR1cm4gbmV3IFBlcnNvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbnMgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBQZXJzb24gZmlyc3QgPSBuZXcgUGVyc29uKCJMYXJyeSIsICJBbXBoaXRoZWF0cmUgUGt3eSIsIDE2MDAsICJNb3VudGFpbiBWaWV3Iik7CisgICAgICAgIHB1YmxpYyBmaW5hbCBQZXJzb24gc2Vjb25kID0gbmV3IFBlcnNvbigiQmlsbCIsICJNaWNyb3NvZnQgV2F5IiwgMSwgIlJlZG1vbmQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbiB7CisKKyAgICAgICAgcHVibGljIFBlcnNvbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQZXJzb24oZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBzdHJlZXROYW1lLCBmaW5hbCBpbnQgc3RyZWV0TnVtYmVyLCBmaW5hbCBTdHJpbmcgY2l0eSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIGFkZHJlc3MgPSBuZXcgQWRkcmVzcyhzdHJlZXROYW1lLCBzdHJlZXROdW1iZXIsIGNpdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFkZHJlc3MgYWRkcmVzczsKKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWRkcmVzcyB7CisKKyAgICAgICAgcHVibGljIEFkZHJlc3MoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWRkcmVzcyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgaW50IG51bWJlciwgZmluYWwgU3RyaW5nIGNpdHkpIHsKKyAgICAgICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7CisgICAgICAgICAgICBzdHJlZXQgPSBuZXcgU3RyZWV0KG5hbWUsIG51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyZWV0IHN0cmVldDsKKyAgICAgICAgcHVibGljIFN0cmluZyBjaXR5OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyZWV0IHsKKworICAgICAgICBwdWJsaWMgU3RyZWV0KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmVldChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgaW50IG51bWJlcikgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgICAgICBwdWJsaWMgaW50IG51bWJlcjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlY3Vyc2l2ZSIpCisgICAgcHVibGljIFJlY3Vyc2l2ZSByZWN1cnNpdmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVjdXJzaXZlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWN1cnNpdmUgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaWRSZWN1cnNpdmUgPSAiYSI7CisgICAgICAgIHB1YmxpYyBTdWJGaWVsZCBzdWJGaWVsZCA9IG5ldyBTdWJGaWVsZCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViRmllbGQgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaWRTdWJGaWVsZCA9ICJiIjsKKyAgICAgICAgcHVibGljIGZpbmFsIFN1YlN1YkZpZWxkIHN1YlN1YkZpZWxkOworCisgICAgICAgIHB1YmxpYyBTdWJGaWVsZCgpIHsKKyAgICAgICAgICAgIHN1YlN1YkZpZWxkID0gbmV3IFN1YlN1YkZpZWxkKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJTdWJGaWVsZCB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBpZFN1YlN1YkZpZWxkID0gImMiOworCisgICAgICAgIEBYbWxUcmFuc2llbnQKKyAgICAgICAgcHVibGljIFN1YkZpZWxkIHN1YkZpZWxkOworCisgICAgICAgIHB1YmxpYyBTdWJTdWJGaWVsZCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdWJTdWJGaWVsZChmaW5hbCBTdWJGaWVsZCBzdWJGaWVsZCkgeworICAgICAgICAgICAgdGhpcy5zdWJGaWVsZCA9IHN1YkZpZWxkOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyYTQzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5TW94eUZpbHRlcmluZ0ZlYXR1cmU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4OTIuVGVzdEFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuanNvbkZlYXR1cmU8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+TW94eUpzb25GZWF0dXJlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXlNb3h5RmlsdGVyaW5nRmVhdHVyZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L21veHkvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXlKYWNrc29uRmlsdGVyaW5nRmVhdHVyZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg5Mi5UZXN0QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5qc29uRmVhdHVyZTwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5KYWNrc29uRmVhdHVyZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5SmFja3NvbkZpbHRlcmluZ0ZlYXR1cmU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9qYWNrc29uLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvQWJzdHJhY3RKZXJzZXlFbnRpdHlGaWx0ZXJpbmdJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9BYnN0cmFjdEplcnNleUVudGl0eUZpbHRlcmluZ0lUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNWE3YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvQWJzdHJhY3RKZXJzZXlFbnRpdHlGaWx0ZXJpbmdJVENhc2UuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4OTI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgY2xhc3NlcyByZXBlYXRpbmcgaW4gdGhlIG9iamVjdCBncmFwaCBhcmUgZmlsdGVyZWQgb3V0IGNvcnJlY3RseS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEplcnNleUVudGl0eUZpbHRlcmluZ0lUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgc3ViLXN1Yi1maWVsZCwge0BsaW5rIFRlc3RSZXNvdXJjZS5TdHJlZXR9IGluIHBhcnRpY3VsYXIsCisgICAgICogaXMgbm90IGZpbHRlcmVkIG91dC4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBjb3JyZXNwb25kcyB3aXRoIHRoZSBKRVJTRVktMjg5MiByZXBvcnRlZCBjYXNlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdoZXRoZXJTdWJTdWJGaWxlZElzTm90RmlsdGVyZWRPdXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KHByb3ZpZGVyKCkgKyAiL3Rlc3QiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldCgpOworCisgICAgICAgIGZpbmFsIFRlc3RSZXNvdXJjZS5QZXJzb25zIHBlcnNvbnMgPSByZXNwb25zZS5yZWFkRW50aXR5KFRlc3RSZXNvdXJjZS5QZXJzb25zLmNsYXNzKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJBbXBoaXRoZWF0cmUgUGt3eSIsIHBlcnNvbnMuZmlyc3QuYWRkcmVzcy5zdHJlZXQubmFtZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1pY3Jvc29mdCBXYXkiLCBwZXJzb25zLnNlY29uZC5hZGRyZXNzLnN0cmVldC5uYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIGEgZGUtcmVmZXJlbmNlZCBjYXNlIG9mIHRoZSByZXBvcnRlZCBwcm9ibGVtIGlzIHN0aWxsIGNvcnJlY3RseSBub3QgZmlsdGVyZWQgb3V0LiBJbiBwYXJ0aWN1bGFyLCBhCisgICAgICogc3ViLXN1Yi1zdWItZmllbGQgb2YgdGhlIHNhbWUgY2xhc3MgaXMgbm90IGZpbHRlcmVkIG91dC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGV0aGVyU3ViU3ViU3ViRmllbGRJc05vdEZpbHRlcmVkT3V0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwcm92aWRlcigpICsgIi9wb2ludGVyIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5nZXQoKTsKKworICAgICAgICBmaW5hbCBUZXN0UmVzb3VyY2UuUG9pbnRlciBwb2ludGVyID0gcmVzcG9uc2UucmVhZEVudGl0eShUZXN0UmVzb3VyY2UuUG9pbnRlci5jbGFzcyk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQW1waGl0aGVhdHJlIFBrd3kiLCBwb2ludGVyLnBlcnNvbnMuZmlyc3QuYWRkcmVzcy5zdHJlZXQubmFtZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1pY3Jvc29mdCBXYXkiLCBwb2ludGVyLnBlcnNvbnMuc2Vjb25kLmFkZHJlc3Muc3RyZWV0Lm5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYSByZWZlcmVuY2UgY3ljbGUgaXMgZGV0ZWN0ZWQgYW5kIGluZmluaXRlIHJlY3Vyc2lvbiBpcyBwcmV2ZW50ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2hldGhlclJlZmVyZW5jZUN5Y2xlSXNEZXRlY3RlZCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocHJvdmlkZXIoKSArICIvcmVjdXJzaXZlIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5nZXQoKTsKKworICAgICAgICBmaW5hbCBUZXN0UmVzb3VyY2UuUmVjdXJzaXZlIHJlY3Vyc2l2ZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoVGVzdFJlc291cmNlLlJlY3Vyc2l2ZS5jbGFzcyk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYyIsIHJlY3Vyc2l2ZS5zdWJGaWVsZC5zdWJTdWJGaWVsZC5pZFN1YlN1YkZpZWxkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKZXJzZXkgRW50aXR5IGZpbHRlcmluZyBmZWF0dXJlIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcHJvdmlkZXIgc3RyaW5nIHRvIG1hdGNoIHdpdGggYXBwcm9wcmlhdGUgSmVyc2V5IGFwcCBjb25maWd1cmVkIGluIHdlYi54bWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBwcm92aWRlcigpOworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvSjYwNU1veHlJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9KNjA1TW94eUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMWRmNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvSjYwNU1veHlJVENhc2UuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4OTI7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBjbGFzc2VzIHJlcGVhdGluZyBpbiB0aGUgb2JqZWN0IGdyYXBoIGFyZSBmaWx0ZXJlZCBvdXQgY29ycmVjdGx5IHdoZW4gdXNpbmcgTU9YWSBqc29uIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEo2MDVNb3h5SVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RKZXJzZXlFbnRpdHlGaWx0ZXJpbmdJVENhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuICJtb3h5IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvSmVyc2V5Mjg5MkphY2tzb25JVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9KZXJzZXkyODkySmFja3NvbklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTg1OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvSmVyc2V5Mjg5MkphY2tzb25JVENhc2UuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4OTI7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBjbGFzc2VzIHJlcGVhdGluZyBpbiB0aGUgb2JqZWN0IGdyYXBoIGFyZSBmaWx0ZXJlZCBvdXQgY29ycmVjdGx5IHdoZW4gdXNpbmcgSmFja3NvbiBqc29uIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI4OTJKYWNrc29uSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RKZXJzZXlFbnRpdHlGaWx0ZXJpbmdJVENhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuICJqYWNrc29uIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk2MjE3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTc4MDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktNzgwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS03ODAgLSBNYWxmb3JtZWQgVVJMIHJldHVybnMgYSA1MDAgaW5zdGVhZCBvZiBhIDQwMDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXk3ODAvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5NzgwL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDljMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5NzgwL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5NzgwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5NzgwL0plcnNleTc4MC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTc4MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTc4MC9KZXJzZXk3ODAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE4NTBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTc4MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTc4MC9KZXJzZXk3ODAuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTc4MDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTc4MCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48Q2xhc3M8Pz4+c2luZ2xldG9uKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTc4MC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTc4MC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwN2Q2MDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5NzgwLkplcnNleTc4MDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5NzgwL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTc4MC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTc4MC9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRkNTMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTc4MC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTc4MC9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTc4MDsKKworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkucmVnaXN0ZXJJbnN0YW5jZXMobmV3IEplcnNleTc4MCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBleHBlY3RlZENvZGVzID0gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QuZ2V0U3RhdHVzQ29kZSgpLCBSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5ELmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZFBocmFzZXMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVC5nZXRSZWFzb25QaHJhc2UoKSwgUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORC5nZXRSZWFzb25QaHJhc2UoKSk7CisKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyAiXiIpOworICAgICAgICBmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKworICAgICAgICBmaW5hbCBpbnQgc3RhdHVzQ29kZSA9IGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdGF0dXNNZXNzYWdlID0gY29ubmVjdGlvbi5nZXRSZXNwb25zZU1lc3NhZ2UoKTsKKworICAgICAgICBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyByZXNwb25zZSBzdGF0dXMgY29kZTogIiArIHN0YXR1c0NvZGUsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRDb2Rlcy5jb250YWlucyhzdGF0dXNDb2RlKSk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIHJlc3BvbnNlIHN0YXR1cyByZWFzb246ICIgKyBzdGF0dXNNZXNzYWdlLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkUGhyYXNlcy5jb250YWlucyhzdGF0dXNNZXNzYWdlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4ODY1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvbS54bWwKQEAgLTAsMCArMSwyNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uPC9uYW1lPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+YXN5bmMtamVyc2V5LWZpbHRlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktZWpiLXRlc3Qtd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktbXVsdGltb2R1bGU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lamItbXVsdGltb2R1bGUtcmVsb2FkPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2RpLW11bHRpcGFydC13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktdGVzdC13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNsaWVudC1jb25uZWN0b3ItcHJvdmlkZXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lamItbXVsdGltb2R1bGU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lamItdGVzdC13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qLTM3NjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmotNDQxPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ai01OTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmpheHJzLWNvbXBvbmVudC1pbmplY3Q8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMTEwNzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0xMjIzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTE2MDQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMTY2NzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0xODI5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTE4ODM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMTkyODwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0xOTYwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTE5NjQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjAzMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yMTM2PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTIxMzc8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjE1NDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yMTYwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTIxNjQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjE2NzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yMTc2PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTIxODQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjI1NTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yMzIyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTIzMzU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjQyMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yNTUxPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTI2MTI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjYzNzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yNjU0PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTI2NzM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjY4OTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yNzA0PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTI3NzY8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjc5NDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yODQ2PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTI4Nzg8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjg5MjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS03ODA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5wb3J0YWJpbGl0eS1qZXJzZXktMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnBvcnRhYmlsaXR5LWplcnNleS0yPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHJvcGVydHktY2hlY2s8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZWN1cml0eS1kaWdlc3Q8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTIuNS1maWx0ZXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluaXQtMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluaXQtMjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluaXQtMzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluaXQtNDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluaXQtNTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluaXQtNjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluaXQtNzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluaXQtODwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LW12Yy0xPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtbXZjLTI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTIuNS1tdmMtMzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LXJlbG9hZDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1hc3luYzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1jaHVua2VkLWlvPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWZpbHRlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1nZi1hc3luYzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1pbmZsZWN0b3ItMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1pbml0LTE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtaW5pdC0yPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWluaXQtMzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1pbml0LTQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtaW5pdC01PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWluaXQtNjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1pbml0LTc8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtaW5pdC04PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWluaXQtcHJvdmlkZXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtcGFyYW1zPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLXNzZS0xPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtdGVzdHM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zb25hci10ZXN0PC9tb2R1bGU+CisgICAgICAgIDwhLS0gVE9ETzogdGVtcG9yYXJpbHkgcmVtb3Zpbmcgc3ByaW5nIDQgaW50ZWdyYXRpb24gdGVzdCAtLT4KKyAgICAgICAgPCEtLSBUT0RPOiBjb25mbGljdCBpbiBBU00gdmVyc2lvbiAodG9vIG9sZCkgb2YgamV0dHkgcGx1Z2luIC0tPgorICAgICAgICA8IS0tPG1vZHVsZT5zcHJpbmc0PC9tb2R1bGU+LS0+CisgICAgICAgIDxtb2R1bGU+dHJhY2luZy1zdXBwb3J0PC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5kZWZhdWx0PC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxlbnY+ZGVmYXVsdDwvZW52PgorICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+OTk5ODwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPGVudj5kZWZhdWx0PC9lbnY+CisgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD45OTk4PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgPGpldHR5LmxvZy5maWxlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2pldHR5LW91dC5sb2c8L2pldHR5LmxvZy5maWxlPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29uZmlndXJlIEpldHR5IHRvIHJ1biBpbiBhIHNlcGFyYXRlZCBKVk0gaW4gb3JkZXIgdG8gZ2V0IHByb3BlciBjb3ZlcmFnZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnN0YXJ0LWpldHR5LWZvcmtlZDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJlLWludGVncmF0aW9uLXRlc3Q8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bi1mb3JrZWQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRQYXRoPi88L2NvbnRleHRQYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjA8L3NjYW5JbnRlcnZhbFNlY29uZHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdhaXRGb3JDaGlsZD5mYWxzZTwvd2FpdEZvckNoaWxkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqdm1BcmdzPiR7c2VydmVyLmNvdmVyYWdlLmFyZ2xpbmV9IC1EamV0dHkucG9ydD0ke2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURvcmcuc2xmNGouc2ltcGxlTG9nZ2VyLmxvZ0ZpbGU9JHtqZXR0eS5sb2cuZmlsZX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2p2bUFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnN0YXJ0LWpldHR5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5ub25lPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotc2ltcGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS43LjU8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisgICAgPC9wcm9maWxlcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwPiR7c2tpcC50ZXN0c308L3NraXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wUG9ydD45OTk5PC9zdG9wUG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wS2V5PlNUT1A8L3N0b3BLZXk+CisgICAgICAgICAgICAgICAgICAgICAgICA8d2ViQXBwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2ViSW5mSW5jbHVkZUphclBhdHRlcm4+LiovLipqZXJzZXktW14vXVwuamFyJDwvd2ViSW5mSW5jbHVkZUphclBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3dlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0b3JzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0b3IgaW1wbGVtZW50YXRpb249Im9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5uaW8uU2VsZWN0Q2hhbm5lbENvbm5lY3RvciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb3J0PiR7amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0fTwvcG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heElkbGVUaW1lPjYwMDAwPC9tYXhJZGxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3Rvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdG9ycz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqdm1BcmdzPiR7c2VydmVyLmNvdmVyYWdlLmFyZ2xpbmV9PC9qdm1BcmdzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c3RhcnQtamV0dHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MDwvc2NhbkludGVydmFsU2Vjb25kcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRhZW1vbj50cnVlPC9kYWVtb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zdG9wLWpldHR5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cG9zdC1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0b3A8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0OTlkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3BvbS54bWwKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnBvcnRhYmlsaXR5LWplcnNleS0xPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXBvcnRhYmlsaXR5LWplcnNleS0xPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgcG9ydGFiaWxpdHkgdGVzdCAtIHRlc3RpbmcgY28tYnVuZGxpbmcgd2l0aCBKZXJzZXkgMTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2bGV0LXBvcnRhYmlsaXR5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXkuamVyc2V5LXRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqZXJzZXkxLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXkuamVyc2V5LXRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2plcnNleTEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqZXJzZXkxLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGVzPiA8IS0tIHRoaXMgaXMgdG8gZW5zdXJlIG9ubHkgb25lIEplcnNleSB2ZXJzaW9uIGlzIHByZXNlbnQgaW4gdGhlIGNsYXNzcGF0aCAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU6amVyc2V5LWNvbW1vbjwvY2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlOmplcnNleS1zZXJ2ZXI8L2NsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTpqZXJzZXktY2xpZW50PC9jbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNGQ1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTFBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmI5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTFBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHk7CisKK2ltcG9ydCBjb20uc3VuLmplcnNleS5hcGkuY29yZS5QYWNrYWdlc1Jlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MUFwcGxpY2F0aW9uIGV4dGVuZHMgUGFja2FnZXNSZXNvdXJjZUNvbmZpZyB7CisgICAgcHVibGljIEplcnNleTFBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgLy8gZG8gdGhlIHBhY2thZ2Ugc2Nhbm5pbmcKKyAgICAgICAgc3VwZXIoIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5Iik7CisKKyAgICAgICAgLy8gZXhwbGljaXRseSBhZGQgdW5hbm5vdGF0ZWQgSmVyc2V5IDEgc3BlY2lmaWMgcmVzb3VyY2UKKyAgICAgICAgZ2V0RXhwbGljaXRSb290UmVzb3VyY2VzKCkucHV0KCJqZXJzZXkiLCBKZXJzZXkxUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTFSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDRmY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTFSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBnZXRKZXJzZXkxKCkgeworICAgICAgICByZXR1cm4gIlVzaW5nIEplcnNleSAxLngiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MkFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTJBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTBlMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTJBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MkFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTJBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgLy8gZG8gdGhlIHBhY2thZ2Ugc2Nhbm5pbmcKKyAgICAgICAgcGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5Iik7CisKKyAgICAgICAgLy8gZXhwbGljaXRseSBhZGQgdW5hbm5vdGF0ZWQgSmVyc2V5IDIgc3BlY2lmaWMgcmVzb3VyY2UKKyAgICAgICAgUmVzb3VyY2UuQnVpbGRlciByYiA9IFJlc291cmNlLmJ1aWxkZXIoSmVyc2V5MlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXJSZXNvdXJjZXMocmIucGF0aCgiamVyc2V5IikuYnVpbGQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2ODNlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MlJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEplcnNleTJSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEplcnNleTIoKSB7CisgICAgICAgIHJldHVybiAiVXNpbmcgSmVyc2V5IDIueCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkM2U0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkplcnNleSBXZWIgQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5wb3J0YWJpbGl0eS5Qb3J0YWJsZVNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5MSNjb20uc3VuLmplcnNleS5jb25maWcucHJvcGVydHkucmVzb3VyY2VDb25maWdDbGFzczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eS5KZXJzZXkxQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5MiNqYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eS5KZXJzZXkyQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkplcnNleSBXZWIgQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvUG9ydGFiaWxpdHlJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvUG9ydGFiaWxpdHlJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDgwNWU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9Qb3J0YWJpbGl0eUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHk7CisKK2ltcG9ydCBjb20uc3VuLmplcnNleS5hcGkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IGNvbS5zdW4uamVyc2V5LnRlc3QuZnJhbWV3b3JrLkFwcERlc2NyaXB0b3I7CitpbXBvcnQgY29tLnN1bi5qZXJzZXkudGVzdC5mcmFtZXdvcmsuSmVyc2V5VGVzdDsKK2ltcG9ydCBjb20uc3VuLmplcnNleS50ZXN0LmZyYW1ld29yay5XZWJBcHBEZXNjcmlwdG9yOworaW1wb3J0IGNvbS5zdW4uamVyc2V5LnRlc3QuZnJhbWV3b3JrLnNwaS5jb250YWluZXIuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uc3VuLmplcnNleS50ZXN0LmZyYW1ld29yay5zcGkuY29udGFpbmVyLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IGNvbS5zdW4uamVyc2V5LnRlc3QuZnJhbWV3b3JrLnNwaS5jb250YWluZXIuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFBvcnRhYmlsaXR5SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwRGVzY3JpcHRvciBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgV2ViQXBwRGVzY3JpcHRvci5CdWlsZGVyKCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSByZXNvdXJjZSgpLnBhdGgoImhlbGxvd29ybGQiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCEiLCBzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkoKSB7CisgICAgICAgIENsaWVudFJlc3BvbnNlIHIgPSByZXNvdXJjZSgpLnBhdGgoImplcnNleSIpLmdldChDbGllbnRSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVzaW5nIEplcnNleSAxLngiLCByLmdldEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgd2hvbGUgcHJvamVjdCBpcyBzZXR1cCBmb3IgSmVyc2V5IDIuIE5lZWQgdG8gZ2V0IHRoZSBlZmZlY3RpdmUgcG9ydCBudW1iZXIKKyAgICAgKiBmcm9tIEplcnNleSAyIHByb3BlcnRpZXMgdG8gbWFrZSBIdWRzb24gaGFwcHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFBvcnQgdG8gdXNlIGlmIG5vIG90aGVyIGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlCisgICAgICogQHJldHVybiBwb3J0IG51bWJlciB0byB1c2UgYnkgdGhlIGNsaWVudAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0UG9ydChpbnQgZGVmYXVsdFBvcnQpIHsKKworICAgICAgICBTdHJpbmcgcG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0Iik7CisgICAgICAgIGlmIChudWxsICE9IHBvcnQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocG9ydCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uKCJqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQgd2l0aCBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInZhbHVlIG9mIFwiIiArIHBvcnQgKyAiXCIgaXMgbm90IGEgdmFsaWQgaW50ZWdlci4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBvcnQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIkpFUlNFWV9URVNUX1BPUlQiKTsKKyAgICAgICAgaWYgKG51bGwgIT0gcG9ydCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChwb3J0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RDb250YWluZXJFeGNlcHRpb24oIkpFUlNFWV9URVNUX1BPUlQgd2l0aCBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInZhbHVlIG9mIFwiIiArIHBvcnQgKyAiXCIgaXMgbm90IGEgdmFsaWQgaW50ZWdlci4iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFBvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2MzU0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3BvbS54bWwKQEAgLTAsMCArMSw4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnBvcnRhYmlsaXR5LWplcnNleS0yPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXBvcnRhYmlsaXR5LWplcnNleS0yPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgcG9ydGFiaWxpdHkgdGVzdCAtIHRlc3RpbmcgY28tYnVuZGxpbmcgd2l0aCBKZXJzZXkgMjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2bGV0LXBvcnRhYmlsaXR5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amVyc2V5MS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZXM+IDwhLS0gdGhpcyBpcyB0byBlbnN1cmUgb25seSBvbmUgSmVyc2V5IHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgY2xhc3NwYXRoIC0tPgorICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+Y29tLnN1bi5qZXJzZXk6amVyc2V5LWNvcmU8L2NsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+Y29tLnN1bi5qZXJzZXk6amVyc2V5LXNlcnZlcjwvY2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT5jb20uc3VuLmplcnNleTpqZXJzZXktc2VydmxldDwvY2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM0ZDViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkxQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2YjlmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IGNvbS5zdW4uamVyc2V5LmFwaS5jb3JlLlBhY2thZ2VzUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxQXBwbGljYXRpb24gZXh0ZW5kcyBQYWNrYWdlc1Jlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgSmVyc2V5MUFwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBkbyB0aGUgcGFja2FnZSBzY2FubmluZworICAgICAgICBzdXBlcigib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHkiKTsKKworICAgICAgICAvLyBleHBsaWNpdGx5IGFkZCB1bmFubm90YXRlZCBKZXJzZXkgMSBzcGVjaWZpYyByZXNvdXJjZQorICAgICAgICBnZXRFeHBsaWNpdFJvb3RSZXNvdXJjZXMoKS5wdXQoImplcnNleSIsIEplcnNleTFSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkxUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0NGZjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEplcnNleTFSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEplcnNleTEoKSB7CisgICAgICAgIHJldHVybiAiVXNpbmcgSmVyc2V5IDEueCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MkFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMGUxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MkFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyQXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MkFwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBkbyB0aGUgcGFja2FnZSBzY2FubmluZworICAgICAgICBwYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHkiKTsKKworICAgICAgICAvLyBleHBsaWNpdGx5IGFkZCB1bmFubm90YXRlZCBKZXJzZXkgMiBzcGVjaWZpYyByZXNvdXJjZQorICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIHJiID0gUmVzb3VyY2UuYnVpbGRlcihKZXJzZXkyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlclJlc291cmNlcyhyYi5wYXRoKCJqZXJzZXkiKS5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzY4M2UzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MlJlc291cmNlIHsKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmVyc2V5MigpIHsKKyAgICAgICAgcmV0dXJuICJVc2luZyBKZXJzZXkgMi54IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2QzZTRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LnBvcnRhYmlsaXR5LlBvcnRhYmxlU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkxI2NvbS5zdW4uamVyc2V5LmNvbmZpZy5wcm9wZXJ0eS5yZXNvdXJjZUNvbmZpZ0NsYXNzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5LkplcnNleTFBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkyI2phdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5LkplcnNleTJBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9Qb3J0YWJpbGl0eUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9Qb3J0YWJpbGl0eUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNThmZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L1BvcnRhYmlsaXR5SVRDYXNlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBQb3J0YWJpbGl0eUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIGR1bW15IHJlc291cmNlIGNvbmZpZworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISIsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiamVyc2V5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVc2luZyBKZXJzZXkgMi54Iiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3Byb3BlcnR5LWNoZWNrL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wcm9wZXJ0eS1jaGVjay9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDdlNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wcm9wZXJ0eS1jaGVjay9wb20ueG1sCkBAIC0wLDAgKzEsMTA2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+cHJvcGVydHktY2hlY2s8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tcHJvcGVydHktY2hlY2s8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+UHJvcGVydHkgb3ZlcmxhcHBpbmcvZHVwbGljYXRlIGNoZWNrIHRlc3Q8L2Rlc2NyaXB0aW9uPgorICAgIDwhLS0KKyAgICBOb3RlIHRoYXQgd2hlbmV2ZXIgbmV3ICpQcm9wZXJ0aWVzLmphdmEgZmlsZSBpcyBjcmVhdGVkLCBpdCBoYXMgdG8gYmUgYWRkZWQgaW4gdGhlIHRlc3Qgc291cmNlIGZpbGUKKyAgICBpbiBvcmRlciB0byBiZSBjaGVja2VkIGZvciBkdXBsaWNhdGVzL292ZXJsYXBwaW5nLgorCisgICAgVXNlIGZpbmQgLiAtbmFtZSAiKlByb3BlcnRpZXMuamF2YSIgaW4gdGhlIEplcnNleSByb290IHByb2plY3QgZm9sZGVyIHRvIGZpbmQgZmlsZXMgdG8gYWRkLgorICAgIC0tPgorICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj40LjExPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1qZXR0eS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1zc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3Byb3BlcnR5LWNoZWNrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcHJvcGVydHljaGVjay9Qcm9wZXJ0eU92ZXJsYXBwaW5nQ2hlY2tUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wcm9wZXJ0eS1jaGVjay9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3Byb3BlcnR5Y2hlY2svUHJvcGVydHlPdmVybGFwcGluZ0NoZWNrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNzA3MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wcm9wZXJ0eS1jaGVjay9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3Byb3BlcnR5Y2hlY2svUHJvcGVydHlPdmVybGFwcGluZ0NoZWNrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnByb3BlcnR5Y2hlY2s7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0NsYXNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0eUFsaWFzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3Rvci5KZXR0eUNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuSW50ZXJuYWxTZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QsIHRoYXQgdGhlcmUgYXJlIG5vIHByb3BlcnRpZXMgd2l0aCBvdmVybGFwcGluZyBuYW1lcyBpbiBrbm93biBKZXJzZXkge0Bjb2RlICpQcm9wZXJ0aWVzfSBhbmQge0Bjb2RlICpGZWF0dXJlfQorICogY2xhc3Nlcy4KKyAqIDxwPgorICogRm9yIHRlY2huaWNhbCByZWFzb25zLCB3ZSBkbyBub3Qgd2FudCB0aGUgcHJvcGVydHkgbmFtZXMgdG8gPGk+b3ZlcmxhcDwvaT4uCisgKiBJbiBvdGhlciB3b3Jkcywgbm8gcHJvcGVydHkgc2hvdWxkIGNvbnRhaW4gYSA8aT5uYW1lc3BhY2UgcHJlZml4PC9pPiwgdGhhdCBpcyBhbHJlYWR5IHVzZWQgYXMgYSBjb25jcmV0ZSBwcm9wZXJ0eSBuYW1lLAorICogc3VjaCBhcyB7QGNvZGUgYS5ifSBhbmQge0Bjb2RlIGEuYi5jfS4KKyAqIDwvcD4KKyAqIDxwPgorICogQWRkaXRpb25hbGx5LCB0aGUgdGVzdCBhbHNvIHJlcG9ydHMgYWxsIHRoZSBkdXBsaWNhdGVzIHByb3BlcnR5IG5hbWVzIGZvdW5kIHRocm91Z2hvdXQgdGhlIGNoZWNrZWQgZmlsZXMuCisgKiA8L3A+CisgKiA8cD4KKyAqIE5vdGUgdGhhdCB0aGUgbGlzdCBvZiBmaWxlcyBpcyBoYXJkY29kZWQgZGlyZWN0bHkgaW4gdGhpcyB0ZXN0IGluIGEgc3RhdGljIGFycmF5CisgKiAodG8gYXZvaWQgdGhlIG5lY2Vzc2l0eSBvZiB3cml0aW5nIGN1c3RvbSBjbGFzcyBsb2FkZXIgZm9yIHRoaXMgdGVzdCkuCisgKiBJZiBhIGphdmEgY2xhc3MgY29udGFpbmluZyBwcm9wZXJ0aWVzIHNob3VsZCBieSBpbmNsdWRlZCBpbiB0aGUgY2hlY2ssIGl0IGhhcyB0byBiZSBhZGRlZCBoZXJlLgorICogQWxzbyBub3RlIHRoYXQgdGhlIHRlc3QgaXMgcmVseWluZyBvbiB7QGxpbmsgUHJvcGVydHl9LCB7QGxpbmsgUHJvcGVydGllc0NsYXNzfSBhbmQge0BsaW5rIFByb3BlcnR5QWxpYXN9IGFubm90YXRpb25zCisgKiB0byByZWNvZ25pemUgaW5kaXZpZHVhbCBwcm9wZXJ0aWVzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eU92ZXJsYXBwaW5nQ2hlY2tUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFByb3BlcnR5T3ZlcmxhcHBpbmdDaGVja1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gY2xhc3NlcyA9IG5ldyBDbGFzc1tdIHsKKyAgICAgICAgICAgIEpldHR5Q2xpZW50UHJvcGVydGllcy5jbGFzcywKKyAgICAgICAgICAgIEFwYWNoZUNsaWVudFByb3BlcnRpZXMuY2xhc3MsCisgICAgICAgICAgICBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLmNsYXNzLAorICAgICAgICAgICAgU2VydmxldFByb3BlcnRpZXMuY2xhc3MsCisgICAgICAgICAgICBDb21tb25Qcm9wZXJ0aWVzLmNsYXNzLAorICAgICAgICAgICAgTWVzc2FnZVByb3BlcnRpZXMuY2xhc3MsCisgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLmNsYXNzLAorICAgICAgICAgICAgSW50ZXJuYWxTZXJ2ZXJQcm9wZXJ0aWVzLmNsYXNzLAorICAgICAgICAgICAgQ2xpZW50UHJvcGVydGllcy5jbGFzcywKKyAgICAgICAgICAgIE11bHRpUGFydFByb3BlcnRpZXMuY2xhc3MsCisgICAgICAgICAgICBUZXN0UHJvcGVydGllcy5jbGFzcywKKyAgICAgICAgICAgIFNzZUZlYXR1cmUuY2xhc3MKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvYmxlbVJlcG9ydCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFyZW50UHJvcGVydHk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZVBhcmVudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2hpbGRQcm9wZXJ0eTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lQ2hpbGQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkdXBsaWNhdGU7CisKKyAgICAgICAgcHJpdmF0ZSBQcm9ibGVtUmVwb3J0KFN0cmluZyBwYXJlbnRQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWVQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2hpbGRQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWVDaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZHVwbGljYXRlKSB7CisgICAgICAgICAgICB0aGlzLnBhcmVudFByb3BlcnR5ID0gcGFyZW50UHJvcGVydHk7CisgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZVBhcmVudCA9IGNsYXNzTmFtZVBhcmVudDsKKyAgICAgICAgICAgIHRoaXMuY2hpbGRQcm9wZXJ0eSA9IGNoaWxkUHJvcGVydHk7CisgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZUNoaWxkID0gY2xhc3NOYW1lQ2hpbGQ7CisgICAgICAgICAgICB0aGlzLmR1cGxpY2F0ZSA9IGR1cGxpY2F0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUHJvYmxlbVJlcG9ydChTdHJpbmcgcGFyZW50UHJvcGVydHksIFN0cmluZyBjbGFzc05hbWVQYXJlbnQsIFN0cmluZyBjaGlsZFByb3BlcnR5LCBTdHJpbmcgY2xhc3NOYW1lQ2hpbGQpIHsKKyAgICAgICAgICAgIHRoaXMocGFyZW50UHJvcGVydHksIGNsYXNzTmFtZVBhcmVudCwgY2hpbGRQcm9wZXJ0eSwgY2xhc3NOYW1lQ2hpbGQsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50UHJvcGVydHkoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyZW50UHJvcGVydHk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZVBhcmVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWVQYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkUHJvcGVydHkoKSB7CisgICAgICAgICAgICByZXR1cm4gY2hpbGRQcm9wZXJ0eTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lQ2hpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NOYW1lQ2hpbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0R1cGxpY2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBkdXBsaWNhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBhbGxQcm9wZXJ0eU5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlUb0NsYXNzTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBMaXN0PFByb2JsZW1SZXBvcnQ+IHByb2JsZW1zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgc3RyaW5nIGZpZWxkcyBvZiBhYm92ZSBkZWNsYXJlZCBjbGFzc2VzCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xhenogOiBjbGFzc2VzKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNoZWNrRmllbGRQcm9wZXJ0eUFubm90YXRpb24gPSBjbGF6ei5nZXRBbm5vdGF0aW9uKFByb3BlcnRpZXNDbGFzcy5jbGFzcykgPT0gbnVsbDsKKyAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7CisgICAgICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrRmllbGRQcm9wZXJ0eUFubm90YXRpb24gJiYgZmllbGQuZ2V0QW5ub3RhdGlvbihQcm9wZXJ0eS5jbGFzcykgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGZpZWxkcyBub3QgYW5ub3RhdGVkIHdpdGggQFByb3BlcnR5IGluIGNsYXNzZXMgbm90IGFubm90YXRlZCB3aXRoIEBQcm9wZXJ0aWVzQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRBbm5vdGF0aW9uKFByb3BlcnR5QWxpYXMuY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBwcm9wZXJ0eSBhbGlhc2VzCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuZ2V0VHlwZSgpLmlzQXNzaWduYWJsZUZyb20oU3RyaW5nLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IChTdHJpbmcpIGZpZWxkLmdldChudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYWxsUHJvcGVydHlOYW1lcy5hZGQocHJvcGVydHlWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgc3VjaCBwcm9wZXJ0eSBpbiB0aGUgbWFwOyByZXBvcnQgYSBwcm9ibGVtIGlmIHRydWUgb3Igc3RvcmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5LXRvLWNsYXNzIHJlbGF0aW9uc2hpcCBpbnRvIHRoZSBtYXAgZm9yIGxhdGVyIHVzZQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlNYXBFbnRyeSA9IHByb3BlcnR5VG9DbGFzc01hcC5nZXQocHJvcGVydHlWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVRvQ2xhc3NNYXAuZ2V0KHByb3BlcnR5VmFsdWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIkR1cGxpY2F0ZSBwcm9wZXJ0eSBmb3VuZDogIiArIHByb3BlcnR5VmFsdWUgKyAiIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydHlNYXBFbnRyeSArICIgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXp6LmdldE5hbWUoKSArICIuIFRlc3Qgd29uJ3QgZmFpbCBiZWNhdXNlIG9mIHRoaXMsIGFzIHRoZSBjaGVjaworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgY3VycmVudGx5IGRpc2FibGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYW5ub3QgY2F1c2UgdGhlIHRlc3QgdG8gZmFpbCwgYXMgdGhlcmUgYXJlIGFsaWFzZXMgaW4gQ2xpZW50UHJvcGVydGllcyBhbmQgU2VydmVyUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGFyZSBieSBkZWZpbml0aW9uIGVxdWFsIHRvIHRob3NlIGRlZmluZWQgaW4gQ29tbW9uUHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbXMuYWRkKG5ldyBQcm9ibGVtUmVwb3J0KHByb3BlcnR5VmFsdWUsIHByb3BlcnR5TWFwRW50cnksIHByb3BlcnR5VmFsdWUsIGNsYXp6LmdldE5hbWUoKSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUb0NsYXNzTWFwLnB1dChwcm9wZXJ0eVZhbHVlLCBjbGF6ei5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHNvcnQgdGhlIHByb3BlcnRpZXMgYnkgbmFtZSAobmF0dXJhbCksIHNvIHRoYXQgaWYgdHdvIHByb3BlcnRpZXMgaGF2ZSBvdmVybGFwcGluZyBuYW1lcywKKyAgICAgICAgLy8gdGhleSB3aWxsIGFwcGVhciBvbmUgYWZ0ZXIgYW5vdGhlcgorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGFsbFByb3BlcnR5TmFtZXMpOworCisgICAgICAgIFN0cmluZyBwcmV2aW91c1Byb3BlcnR5ID0gIiI7CisgICAgICAgIGZvciAoU3RyaW5nIHByb3BlcnR5IDogYWxsUHJvcGVydHlOYW1lcykgeworICAgICAgICAgICAgLy8gaXMgdGhlIHByb3BlcnR5IG92ZXJsYXBwaW5nIHdpdGggdGhlIHByZXZpb3VzIG9uZT8KKyAgICAgICAgICAgIC8vIGRvIG5vdCBjb25zaWRlciBvdmVybGFwcGluZyBzdWNoIGFzIGZvby5iYXIgdnMgZm9vLmJhcmJhciwganVzdCBmb28uYmFyIHZzIGZvby5iYXIuYmFyCisgICAgICAgICAgICBpZiAocHJvcGVydHkuc3RhcnRzV2l0aChwcmV2aW91c1Byb3BlcnR5ICsgIi4iKSkgeworICAgICAgICAgICAgICAgIHByb2JsZW1zLmFkZChuZXcgUHJvYmxlbVJlcG9ydChwcmV2aW91c1Byb3BlcnR5LCBwcm9wZXJ0eVRvQ2xhc3NNYXAuZ2V0KHByZXZpb3VzUHJvcGVydHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksIHByb3BlcnR5VG9DbGFzc01hcC5nZXQocHJvcGVydHkpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoZSAicG9pbnRlciIgaXMgbW92ZWQgb25seSBpZiB0aGVyZSB3YXMgbm8gb3ZlcmxhcHBpbmcgZGV0ZWN0ZWQgaW4gdGhpcyBpdGVyYXRpb24KKyAgICAgICAgICAgICAgICAvLyBhcyB0aGlzIHdvdWxkIHBvdGVudGlhbGx5IGhpZGUgdGhlIDJuZCAob3Igbi10aCkgcHJvcGVydHkgb3ZlcmxhcHBpbmcgd2l0aCB0aGUgc2FtZSBvbmUKKyAgICAgICAgICAgICAgICBwcmV2aW91c1Byb3BlcnR5ID0gcHJvcGVydHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXByb2JsZW1zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbG9nLnNldmVyZSgiUHJvcGVydHkgbmFtaW5nIHByb2JsZW1zIGRldGVjdGVkOiAiKTsKKyAgICAgICAgICAgIGZvciAoUHJvYmxlbVJlcG9ydCBwcm9ibGVtIDogcHJvYmxlbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvYmxlbS5pc0R1cGxpY2F0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5zZXZlcmUoIkR1cGxpY2F0ZSBwcm9wZXJ0eSBuYW1lOiBcbiAgcHJvcGVydHk6ICIgKyBwcm9ibGVtLmdldFBhcmVudFByb3BlcnR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiAgY2xhc3MxOiAiICsgcHJvYmxlbS5nZXRDbGFzc05hbWVQYXJlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuICBjbGFzczI6ICIgKyBwcm9ibGVtLmdldENsYXNzTmFtZUNoaWxkKCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2cuc2V2ZXJlKCJPdmVybGFwcGluZyBwcm9wZXJ0eSBuYW1lczogXG4gIHByb3BlcnR5MTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvYmxlbS5nZXRQYXJlbnRQcm9wZXJ0eSgpICsgIlxuICBpbjogIiArIHByb2JsZW0uZ2V0Q2xhc3NOYW1lUGFyZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiAgcHJvcGVydHkyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9ibGVtLmdldENoaWxkUHJvcGVydHkoKSArICJcbiAgaW4gIiArIHByb2JsZW0uZ2V0Q2xhc3NOYW1lQ2hpbGQoKSArICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBmYWlsIGlmIHByb2JsZW1zIGRldGVjdGVkCisgICAgICAgIGFzc2VydFRydWUocHJvYmxlbXMuaXNFbXB0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3QvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmZkZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3QvcG9tLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8YXJ0aWZhY3RJZD5zZWN1cml0eS1kaWdlc3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LXNlY3VyaXR5LWRpZ2VzdDwvbmFtZT4KKyAgICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+CisKKworICAgIDxkZXNjcmlwdGlvbj5UZXN0IG9mIERJR0VTVCBhdXRoZW50aWNhdGlvbjwvZGVzY3JpcHRpb24+CisKKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKworICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8IS0tIGRlZmluZSBsb2dpbiBzZXJ2aWNlIGZvciBqZXR0eSBhbmQgdGhlIHJlYWxtIHRvIGJlIHVzZWQgLS0+CisgICAgICAgICAgICAgICAgICAgIDxsb2dpblNlcnZpY2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxvZ2luU2VydmljZSBpbXBsZW1lbnRhdGlvbj0ib3JnLmVjbGlwc2UuamV0dHkuc2VjdXJpdHkuSGFzaExvZ2luU2VydmljZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+bXktcmVhbG08L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZz4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlcy9qZXR0eS9yZWFsbS5wcm9wZXJ0aWVzPC9jb25maWc+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xvZ2luU2VydmljZT4KKyAgICAgICAgICAgICAgICAgICAgPC9sb2dpblNlcnZpY2VzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDgwYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eWRpZ2VzdC9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZWN1cml0eWRpZ2VzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworLyoqCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAQXBwbGljYXRpb25QYXRoKCIvcmVzdC8qIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKE15UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5ZGlnZXN0L015UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5ZGlnZXN0L015UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJmZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvTXlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VjdXJpdHlkaWdlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBUaGlzIHJlc291cmNlIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBhcmUgc2VjdXJlZCB1c2luZyB3ZWIueG1sIGRlY2xhcmF0aXZlIHNlY3VyaXR5LiBOYW1lcyBvZiBtZXRob2RzCisgKiBkZXNjcmliZSB3aGljaCB1c2VyIHJvbGVzIGhhdmUgYWNjZXNzIHRvIHRoZW0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUGF0aCgicmVzb3VyY2UiKQorcHVibGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgIEBJbmplY3QKKyAgICBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0OworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckFkbWluKCkgeworICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250ZXh0LmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCkgKyBnZXRBdXRoKCk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3RVc2VyQWRtaW4oU3RyaW5nIGVudGl0eSkgeworICAgICAgICByZXR1cm4gInBvc3QtIiArIGVudGl0eSArICItIiArIHNlY3VyaXR5Q29udGV4dC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpICsgZ2V0QXV0aCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgic3ViIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkbWluKCkgeworICAgICAgICByZXR1cm4gInN1YmdldC0iICsgc2VjdXJpdHlDb250ZXh0LmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCkgKyBnZXRBdXRoKCk7CisgICAgfQorCisgICAgQFBhdGgoImxvY2F0b3IiKQorICAgIHB1YmxpYyBDbGFzczxTdWJSZXNvdXJjZT4gZ2V0U3ViUmVzb3VyY2VVc2VyQWRtaW4oKSB7CisgICAgICAgIHJldHVybiBTdWJSZXNvdXJjZS5jbGFzczsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRBdXRoKCkgeworICAgICAgICByZXR1cm4gIi9zY2hlbWU6IiArIHNlY3VyaXR5Q29udGV4dC5nZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvU3ViUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5ZGlnZXN0L1N1YlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljNmVkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5ZGlnZXN0L1N1YlJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZWN1cml0eWRpZ2VzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2UgeworICAgIEBJbmplY3QKKyAgICBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0OworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckFkbWluKCkgeworICAgICAgICByZXR1cm4gImxvY2F0b3ItIiArIHNlY3VyaXR5Q29udGV4dC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpICsgZ2V0QXV0aCgpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEF1dGgoKSB7CisgICAgICAgIHJldHVybiAiL3NjaGVtZToiICsgc2VjdXJpdHlDb250ZXh0LmdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL3Jlc291cmNlcy9qZXR0eS9yZWFsbS5wcm9wZXJ0aWVzIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL3Jlc291cmNlcy9qZXR0eS9yZWFsbS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzBkZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vcmVzb3VyY2VzL2pldHR5L3JlYWxtLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOSBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitob21lcjpIb21lcixteS11c2VyCittYXJnZTpNYXJnZSxteS1hZG1pbgorYmFydDpCYXJ0LG15LXVzZXIsbXktYWRtaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwNGY0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisKKyAgICA8ZGlzcGxheS1uYW1lPkFyY2hldHlwZSBDcmVhdGVkIFdlYiBBcHBsaWNhdGlvbjwvZGlzcGxheS1uYW1lPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlY3VyaXR5ZGlnZXN0Lk15QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlY3VyaXR5ZGlnZXN0Lk15QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlY3VyaXR5ZGlnZXN0Lk15QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9yZXN0Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDx3ZWxjb21lLWZpbGUtbGlzdD4KKyAgICAgICAgPHdlbGNvbWUtZmlsZT5pbmRleC5odG1sPC93ZWxjb21lLWZpbGU+CisgICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KKworICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgorICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+cmVzdCBhcGk8L3dlYi1yZXNvdXJjZS1uYW1lPgorICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi9yZXN0Lyo8L3VybC1wYXR0ZXJuPgorICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICA8YXV0aC1jb25zdHJhaW50PgorICAgICAgICAgICAgPHJvbGUtbmFtZT5teS11c2VyPC9yb2xlLW5hbWU+CisgICAgICAgICAgICA8cm9sZS1uYW1lPm15LWFkbWluPC9yb2xlLW5hbWU+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgorICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+cmVzdCBhcGk8L3dlYi1yZXNvdXJjZS1uYW1lPgorICAgICAgICAgICAgPHVybC1wYXR0ZXJuPi9yZXN0L3Jlc291cmNlL3N1YjwvdXJsLXBhdHRlcm4+CisgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgICAgICA8cm9sZS1uYW1lPm15LWFkbWluPC9yb2xlLW5hbWU+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KKworICAgIDxzZWN1cml0eS1yb2xlPgorICAgICAgICA8cm9sZS1uYW1lPm15LXVzZXI8L3JvbGUtbmFtZT4KKyAgICA8L3NlY3VyaXR5LXJvbGU+CisgICAgPHNlY3VyaXR5LXJvbGU+CisgICAgICAgIDxyb2xlLW5hbWU+bXktYWRtaW48L3JvbGUtbmFtZT4KKyAgICA8L3NlY3VyaXR5LXJvbGU+CisKKworICAgIDxsb2dpbi1jb25maWc+CisgICAgICAgIDxhdXRoLW1ldGhvZD5ESUdFU1Q8L2F1dGgtbWV0aG9kPgorICAgICAgICA8cmVhbG0tbmFtZT5teS1yZWFsbTwvcmVhbG0tbmFtZT4KKyAgICA8L2xvZ2luLWNvbmZpZz4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvU2VjdXJpdHlEaWdlc3RBdXRoZW50aWNhdGlvbklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvU2VjdXJpdHlEaWdlc3RBdXRoZW50aWNhdGlvbklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjQyMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eWRpZ2VzdC9TZWN1cml0eURpZ2VzdEF1dGhlbnRpY2F0aW9uSVRDYXNlLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VjdXJpdHlkaWdlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBTZWN1cml0eURpZ2VzdEF1dGhlbnRpY2F0aW9uSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15QXBwbGljYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKFNlY3VyaXR5RGlnZXN0QXV0aGVudGljYXRpb25JVENhc2UuY2xhc3MuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUdldCgpIHsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZUdldChIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdCgiaG9tZXIiLCAiSG9tZXIiKSk7CisgICAgICAgIF90ZXN0UmVzb3VyY2VHZXQoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWwoImhvbWVyIiwgIkhvbWVyIikpOworICAgICAgICBfdGVzdFJlc291cmNlR2V0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzRm9yRGlnZXN0KCJob21lciIsICJIb21lciIpLmJ1aWxkKCkpOworICAgICAgICBfdGVzdFJlc291cmNlR2V0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzRm9yRGlnZXN0KCJob21lciIsICJIb21lciIpCisgICAgICAgICAgICAgICAgLmNyZWRlbnRpYWxzRm9yQmFzaWMoImFhYSIsICJiYmIiKS5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFJlc291cmNlR2V0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvcmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmZWF0dXJlKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaG9tZXIvc2NoZW1lOkRJR0VTVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VHZXQ0MDEoKSB7CisgICAgICAgIF90ZXN0UmVzb3VyY2VHZXQ0MDEoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoIm5vbmV4aXN0aW5nIiwgImZvbyIpKTsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZUdldDQwMShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFscygibm9uZXhpc3RpbmciLCAiZm9vIikuYnVpbGQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3RSZXNvdXJjZUdldDQwMShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGZlYXR1cmUpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L3Jlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmVhdHVyZSkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAxLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VQb3N0KCkgeworICAgICAgICBfdGVzdFJlc291cmNlUG9zdChIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdCgiaG9tZXIiLCAiSG9tZXIiKSk7CisgICAgICAgIF90ZXN0UmVzb3VyY2VQb3N0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsKCJob21lciIsICJIb21lciIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFJlc291cmNlUG9zdChIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGZlYXR1cmUpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L3Jlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmVhdHVyZSkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgiaGVsbG93b3JsZCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJwb3N0LWhlbGxvd29ybGQtaG9tZXIvc2NoZW1lOkRJR0VTVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTdWJHZXQ0MDMoKSB7CisgICAgICAgIF90ZXN0UmVzb3VyY2VTdWJHZXQ0MDMoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoImhvbWVyIiwgIkhvbWVyIikpOworICAgICAgICBfdGVzdFJlc291cmNlU3ViR2V0NDAzKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsKCJob21lciIsICJIb21lciIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFJlc291cmNlU3ViR2V0NDAzKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvcmVzb3VyY2Uvc3ViIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmVhdHVyZSkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTdWJHZXQoKSB7CisgICAgICAgIF90ZXN0UmVzb3VyY2VTdWJHZXQyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuZGlnZXN0KCJiYXJ0IiwgIkJhcnQiKSk7CisgICAgICAgIF90ZXN0UmVzb3VyY2VTdWJHZXQyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsKCJiYXJ0IiwgIkJhcnQiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3RSZXNvdXJjZVN1YkdldDIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBmZWF0dXJlKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9yZXNvdXJjZS9zdWIiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmZWF0dXJlKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygic3ViZ2V0LWJhcnQvc2NoZW1lOkRJR0VTVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VMb2NhdG9yR2V0KCkgeworICAgICAgICBfdGVzdFJlc291cmNlTG9jYXRvckdldChIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdCgiYmFydCIsICJCYXJ0IikpOworICAgICAgICBfdGVzdFJlc291cmNlTG9jYXRvckdldChIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbCgiYmFydCIsICJCYXJ0IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0UmVzb3VyY2VMb2NhdG9yR2V0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgZmVhdHVyZSkgeworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9yZXNvdXJjZS9sb2NhdG9yIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmVhdHVyZSkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImxvY2F0b3ItYmFydC9zY2hlbWU6RElHRVNUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU11bHRpcGxlUmVxdWVzdHNXaXRoT25lRmlsdGVyKCkgeworICAgICAgICBfdGVzdFJlc291cmNlTXVsdGlwbGVSZXF1ZXN0c1dpdGhPbmVGaWx0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoImhvbWVyIiwgIkhvbWVyIikpOworICAgICAgICBfdGVzdFJlc291cmNlTXVsdGlwbGVSZXF1ZXN0c1dpdGhPbmVGaWx0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWwoImhvbWVyIiwgIkhvbWVyIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0UmVzb3VyY2VNdWx0aXBsZVJlcXVlc3RzV2l0aE9uZUZpbHRlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGhhZikgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVzdC9yZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGhhZik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJob21lci9zY2hlbWU6RElHRVNUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImhvbWVyL3NjaGVtZTpESUdFU1QiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInN1YiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImhvbWVyL3NjaGVtZTpESUdFU1QiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoImxvY2F0b3IiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImxvY2F0b3ItaG9tZXIvc2NoZW1lOkRJR0VTVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDgxZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEgLSBhdXRvLWRpc2NvdmVyeSBvZiBVcmlDb25uZWdGaWx0ZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMS9MYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzEvTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzE2MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzEvTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8xOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlZhcmlhbnQ7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi9hYmMiKQorcHVibGljIGNsYXNzIExhbmd1YWdlVmFyaWFudFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZG9HZXQoQENvbnRleHQgUmVxdWVzdCByKSB7CisgICAgICAgIExpc3Q8VmFyaWFudD4gdnMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgLm1lZGlhVHlwZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2ZvbyIpKQorICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iKSkubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImZyIikpLmFkZCgpCisgICAgICAgICAgICAgICAgLm1lZGlhVHlwZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpKQorICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iKSkubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImZyIikpLmFkZCgpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgVmFyaWFudCB2ID0gci5zZWxlY3RWYXJpYW50KHZzKTsKKyAgICAgICAgaWYgKHYgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vdEFjY2VwdGFibGUodnMpLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sodi5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpICsgIiwgIiArIHYuZ2V0TGFuZ3VhZ2UoKSwgdikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1ZGU4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0QXV0b0Rpc2NvdmVyeTE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8xPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLm1lZGlhVHlwZU1hcHBpbmdzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmZvbyA6IGFwcGxpY2F0aW9uL2ZvbywgYmFyIDogYXBwbGljYXRpb24vYmFyPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLmxhbmd1YWdlTWFwcGluZ3M8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZW5nbGlzaCA6IGVuLCBmcmVuY2ggOiBmcjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdEF1dG9EaXNjb3ZlcnkxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMS9MYW5ndWFnZVZhcmlhbnRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzEvTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQ1ZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzEvTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8xOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIExhbmd1YWdlVmFyaWFudFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKExhbmd1YWdlVmFyaWFudFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZXNBbmRMYW5ndWFnZXMoKSB7CisgICAgICAgIF90ZXN0KCJlbmdsaXNoIiwgImZvbyIsICJlbiIsICJhcHBsaWNhdGlvbi9mb28iKTsKKyAgICAgICAgX3Rlc3QoImZyZW5jaCIsICJmb28iLCAiZnIiLCAiYXBwbGljYXRpb24vZm9vIik7CisKKyAgICAgICAgX3Rlc3QoImVuZ2xpc2giLCAiYmFyIiwgImVuIiwgImFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICBfdGVzdCgiZnJlbmNoIiwgImJhciIsICJmciIsICJhcHBsaWNhdGlvbi9iYXIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoU3RyaW5nIHVsLCBTdHJpbmcgdW0sIFN0cmluZyBsLCBTdHJpbmcgbSkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgiYWJjLiIgKyB1bCArICIuIiArIHVtKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtICsgIiwgIiArIGwsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwsIHIuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0sIHIuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgciA9IHRhcmdldCgpLnBhdGgoImFiYy4iICsgdW0gKyAiLiIgKyB1bCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobSArICIsICIgKyBsLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsLCByLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtLCByLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHIgPSB0YXJnZXQoKS5wYXRoKCJhYmMiKS5yZXF1ZXN0KG0pLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfTEFOR1VBR0UsIGwpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobSArICIsICIgKyBsLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsLCByLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtLCByLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyMjBlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9wb20ueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMiAtIGF1dG8tZGlzY292ZXJ5IG9mIEJlYW4gVmFsaWRhdGlvbiAoSkFYLVJTIGJ1bmRsZSk8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5idW5kbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4cnMtcmk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5qYXI8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzIvVmFsaWRhdGlvblJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMi9WYWxpZGF0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDE1OGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzIvVmFsaWRhdGlvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMjsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBATm90TnVsbAorICAgIHB1YmxpYyBTdHJpbmcgcG9zdChATm90TnVsbCBAU2l6ZShtaW4gPSAxKSBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLmlzRW1wdHkoKSB8fCAifCIuZXF1YWxzKHZhbHVlKSA/IG51bGwgOiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYWRmYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdEF1dG9EaXNjb3ZlcnkyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdEF1dG9EaXNjb3ZlcnkyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMi9WYWxpZGF0aW9uUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8yL1ZhbGlkYXRpb25SZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmFlZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMi9WYWxpZGF0aW9uUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8yOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVmFsaWRhdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25Qb3NpdGl2ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJ2YWx1ZSIpKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25SZXF1ZXN0TmVnYXRpdmUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJ8IikpLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9SZXNwb25zZW5OZWdhdGl2ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QobnVsbCkuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWZpbHRlci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA0MTZkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWZpbHRlci9wb20ueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1maWx0ZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtZmlsdGVyPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWZpbHRlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzJfNV9maWx0ZXIvTXlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yXzVfZmlsdGVyL015UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBhODAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yXzVfZmlsdGVyL015UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMl81X2ZpbHRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm15cmVzb3VyY2UiKQorcHVibGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiT0siOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWZpbHRlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4YWVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWZpbHRlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIucGFja2FnZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yXzVfZmlsdGVyPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuY29udGV4dFBhdGg8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+L215YXBwLzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9teWFwcC8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yXzVfZmlsdGVyL015UmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMl81X2ZpbHRlci9NeVJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI0YTAxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMl81X2ZpbHRlci9NeVJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzJfNV9maWx0ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmV0dXJuIHJjLnBhY2thZ2VzKE15UmVzb3VyY2VJVENhc2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNeVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgibXlhcHAiKS5wYXRoKCJteXJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhZGwoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgibXlhcHAvYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKS5zdGFydHNXaXRoKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmOTY4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3BvbS54bWwKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LWluZmxlY3Rvci0xPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWluZmxlY3Rvci0xPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBTZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMSAtIENoZWNrIHRoYXQgaW5mbGVjdG9ycyBpbiBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZWQgcmVzb3VyY2VzIGFyZQorICAgICAgICBwcm9wZXJseSBpbmplY3RlZC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbmZsZWN0b3JfMS9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5ZDVlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbmZsZWN0b3JfMS9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJyZXNvdXJjZSIpOworCisgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRDaGlsZFJlc291cmNlKCJjbGFzcyIpCisgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiR0VUIikKKyAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KE15SW5mbGVjdG9yLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoImluc3RhbmNlIikKKyAgICAgICAgICAgICAgICAuYWRkTWV0aG9kKCJHRVQiKQorICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkobmV3IE15SW5mbGVjdG9yKCkpOworCisgICAgICAgIHJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5mbGVjdG9yXzEvTXlJbmZsZWN0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbmZsZWN0b3JfMS9NeUluZmxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzlhM2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5mbGVjdG9yXzEvTXlJbmZsZWN0b3IuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5mbGVjdG9yXzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE15SW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4geworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXF1ZXN0UHJvdmlkZXI7CisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8SHR0cFNlcnZsZXRSZXNwb25zZT4gcmVzcG9uc2VQcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIC8vIFJlcXVlc3QgcHJvdmlkZXIgJiByZXF1ZXN0LgorICAgICAgICBpZiAocmVxdWVzdFByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJyZXF1ZXN0UHJvdmlkZXJfIik7CisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChyZXF1ZXN0UHJvdmlkZXIuZ2V0KCkgIT0gbnVsbCA/ICJyZXF1ZXN0IiA6IG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIm51bGxfbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoJ18nKTsKKworICAgICAgICAvLyBSZXNwb25zZSBwcm92aWRlciAmIHJlc3BvbnNlLgorICAgICAgICBpZiAocmVzcG9uc2VQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgicmVzcG9uc2VQcm92aWRlcl8iKTsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHJlc3BvbnNlUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbCA/ICJyZXNwb25zZSIgOiBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJudWxsX251bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwNmZlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5mbGVjdG9yXzEuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbmZsZWN0b3JfMS5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xLk15QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbmZsZWN0b3JfMS9JbmZsZWN0b3JJbmplY3Rpb25UZXN0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5mbGVjdG9yXzEvSW5mbGVjdG9ySW5qZWN0aW9uVGVzdElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljY2IyY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5mbGVjdG9yXzEvSW5mbGVjdG9ySW5qZWN0aW9uVGVzdElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbmZsZWN0b3JfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEluZmxlY3RvckluamVjdGlvblRlc3RJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9yQ2xhc3NJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RJbmZsZWN0b3JJbmplY3Rpb24oImNsYXNzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9ySW5zdGFuY2VJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RJbmZsZWN0b3JJbmplY3Rpb24oImluc3RhbmNlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0SW5mbGVjdG9ySW5qZWN0aW9uKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnBhdGgocGF0aCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXF1ZXN0UHJvdmlkZXJfcmVxdWVzdF9yZXNwb25zZVByb3ZpZGVyX3Jlc3BvbnNlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZGQ3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtaW5pdC0xPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWluaXQtMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1pbml0LTEgLSBjb25maWd1cmVkIHZpYSBqYXgtcnMgYXBwbGljYXRpb248L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL0NsaWVudFVzaW5nUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL0NsaWVudFVzaW5nUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzI4NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvQ2xpZW50VXNpbmdSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzE7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIEEgcmVzb3VyY2UgdGhhdCBpbnN0YW50aWF0ZWQgJiB1c2VzIEpBWC1SUy9KZXJzZXkgY2xpZW50IHRvIGFjY2VzcyBhbm90aGVyIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJ2aWFjbGllbnQiKQorcHVibGljIGNsYXNzIENsaWVudFVzaW5nUmVzb3VyY2UgeworICAgIEBQYXRoKCJoZWxsb3dvcmxkIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRQcm94aWVkTWVzc2FnZShAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgcmV0dXJuIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkKKyAgICAgICAgICAgICAgICAudGFyZ2V0KHVyaUluZm8ucmVzb2x2ZShVUkkuY3JlYXRlKCJoZWxsb3dvcmxkIikpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWI2ZjViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LldlYkNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImluamVjdGlvbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRJbmplY3Rpb24oQENvbnRleHQgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEBDb250ZXh0IEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgV2ViQ29uZmlnIHdlYkNvbmZpZywgQENvbnRleHQgU2VydmxldENvbmZpZyBzZXJ2bGV0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldE1ldGhvZCgpICsgKHJlc3BvbnNlICE9IG51bGwpICsgd2ViQ29uZmlnLmdldE5hbWUoKSArIHNlcnZsZXRDb25maWcuZ2V0U2VydmxldE5hbWUoKQorICAgICAgICAgICAgICAgICsgc2VydmxldENvbnRleHQuZ2V0U2VydmxldENvbnRleHROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvTXVsdGlwbGVMaW5rc1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9NdWx0aXBsZUxpbmtzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGNhZmVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvTXVsdGlwbGVMaW5rc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE4MDEuIFNlZSBhbHNvIEUyRSB7QGNvZGUgTGlua1Rlc3R9LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJsaW5rcyIpCitwdWJsaWMgY2xhc3MgTXVsdGlwbGVMaW5rc1Jlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFVSSSB0ZXN0MSA9IFVSSS5jcmVhdGUodXJpSW5mby5nZXRBYnNvbHV0ZVBhdGgoKS50b1N0cmluZygpICsgInRlc3QxIik7CisgICAgICAgIFVSSSB0ZXN0MiA9IFVSSS5jcmVhdGUodXJpSW5mby5nZXRBYnNvbHV0ZVBhdGgoKS50b1N0cmluZygpICsgInRlc3QyIik7CisKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkKKyAgICAgICAgICAgICAgICAubGluaygiaHR0cDovL29yYWNsZS5jb20iLCAicGFyZW50IikKKyAgICAgICAgICAgICAgICAubGluayhuZXcgVVJJKCJodHRwOi8vamVyc2V5LmphdmEubmV0IiksICJmcmFtZXdvcmsiKQorICAgICAgICAgICAgICAgIC5saW5rcygKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmsuZnJvbVVyaSh1cmlJbmZvLnJlbGF0aXZpemUodGVzdDEpKS5yZWwoInRlc3QxIikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmsuZnJvbVVyaSh0ZXN0MikucmVsKCJ0ZXN0MiIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBMaW5rLmZyb21VcmkodXJpSW5mby5yZWxhdGl2aXplKFVSSS5jcmVhdGUoImxpbmtzL3Rlc3QzIikpKS5yZWwoInRlc3QzIikuYnVpbGQoKQorICAgICAgICAgICAgICAgICkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9TZXJ2bGV0MjVpbml0MS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvU2VydmxldDI1aW5pdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmFlYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvU2VydmxldDI1aW5pdDEuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8xOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIFNlcnZsZXQgMi41IGluaXRpYWxpemF0aW9uIHRlc3QgIzAxLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoImFwcGxpY2F0aW9uX3BhdGgiKQorcHVibGljIGNsYXNzIFNlcnZsZXQyNWluaXQxIGV4dGVuZHMgQXBwbGljYXRpb24geworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MsIE11bHRpcGxlTGlua3NSZXNvdXJjZS5jbGFzcywgQ2xpZW50VXNpbmdSZXNvdXJjZS5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmUwNDJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCisvKioKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFBhdGgoInVucmVhY2hhYmxlIikKK3B1YmxpYyBjbGFzcyBVbnJlYWNoYWJsZVJlc291cmNlIHsKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YTA3OTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMS5TZXJ2bGV0MjVpbml0MTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vc2VydmxldF9wYXRoLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvU2VydmxldDI1SW5pdDFJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL1NlcnZsZXQyNUluaXQxSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlNjk2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL1NlcnZsZXQyNUluaXQxSVRDYXNlLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzE7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogU2VydmxldCAyLjUgaW5pdGlhbGl6YXRpb24gdGVzdCAjMDEuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgU2VydmxldDI1SW5pdDFJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgU2VydmxldDI1aW5pdDEoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJzZXJ2bGV0X3BhdGgvaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkQXRXcm9uZ1BhdGgoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoKS5wYXRoKCJhcHBsaWNhdGlvbl9wYXRoL2hlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIlJlcXVlc3QgdG8gYXBwbGljYXRpb25fcGF0aC9oZWxsb3dvcmxkIHNob3VsZCBoYXZlIGZhaWxlZCwgYnV0IGRpZCBub3QuIFRoYXQgbWVhbnMgdHdvIGFwcGxpY2F0aW9ucyBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVnaXN0ZXJlZC4iLAorICAgICAgICAgICAgICAgIHIuZ2V0U3RhdHVzKCkgPj0gNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkVmlhQ2xpZW50SW5SZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoInNlcnZsZXRfcGF0aC92aWFjbGllbnQvaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbnJlYWNoYWJsZVJlc291cmNlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgic2VydmxldF9wYXRoL3VucmVhY2hhYmxlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJNYW5hZ2VkIHRvIHJlYWNoIGEgcmVzb3VyY2UgdGhhdCBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgYXBwbGljYXRpb24uIiwgci5nZXRTdGF0dXMoKSA+PSA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVucmVhY2hhYmxlUmVzb3VyY2VBdFdyb25nUGF0aCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoImFwcGxpY2F0aW9uX3BhdGgvdW5yZWFjaGFibGUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gcmVhY2ggYSByZXNvdXJjZSB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBhcHBsaWNhdGlvbi4iLCByLmdldFN0YXR1cygpID49IDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uKCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoInNlcnZsZXRfcGF0aC9oZWxsb3dvcmxkL2luamVjdGlvbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVR0cnVldGVzdFNlcnZsZXQxdGVzdFNlcnZsZXQxLyIsIHMpOworICAgIH0KKworICAgIC8vIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0xODAxCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtdWx0aXBsZUxpbmtzVGVzdCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiL3NlcnZsZXRfcGF0aC9saW5rcy8iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworCisgICAgICAgIGZpbmFsIFVSSSB0YXJnZXRVcmkgPSB0YXJnZXQuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TGluaygicGFyZW50IikuZ2V0VXJpKCksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL29yYWNsZS5jb20iKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldExpbmsoImZyYW1ld29yayIpLmdldFVyaSgpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TGluaygidGVzdDEiKS5nZXRVcmkoKSwgZXF1YWxUbyhVcmlUZW1wbGF0ZS5yZXNvbHZlKHRhcmdldFVyaSwgInRlc3QxIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRMaW5rKCJ0ZXN0MiIpLmdldFVyaSgpLCBlcXVhbFRvKFVyaVRlbXBsYXRlLnJlc29sdmUodGFyZ2V0VXJpLCAidGVzdDIiKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldExpbmsoInRlc3QzIikuZ2V0VXJpKCksIGVxdWFsVG8oVXJpVGVtcGxhdGUucmVzb2x2ZSh0YXJnZXRVcmksICJ0ZXN0MyIpKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjllZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtaW5pdC0yPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWluaXQtMjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1pbml0LTIgLSBjb25maWd1cmVkIHVzaW5nIHBhY2thZ2Ugc2Nhbm5pbmc8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9DdXN0b21GZWF0dXJlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9DdXN0b21GZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5OTc1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL0N1c3RvbUZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzIuZXh0LkV4dDFXcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMi5leHQuRXh0MldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yLmV4dC5FeHQzV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzIuZXh0LkV4dDRXcml0ZXJJbnRlcmNlcHRvcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgQ3VzdG9tRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQzV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsIDEwMDApOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDJXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgMTAwKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQxV3JpdGVySW50ZXJjZXB0b3IuSU5TVEFOQ0UsIDUwMCk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRXh0NFdyaXRlckludGVyY2VwdG9yLklOU1RBTkNFLCAxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODY3Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9leHQvRXh0MVdyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9leHQvRXh0MVdyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmOGU1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQxV3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDFXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRXh0MVdyaXRlckludGVyY2VwdG9yIElOU1RBTkNFID0gbmV3IEV4dDFXcml0ZXJJbnRlcmNlcHRvcigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWV4dDEiKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvZXh0L0V4dDJXcml0ZXJJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvZXh0L0V4dDJXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZWViZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMi5leHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBFeHQyV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0MiIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9leHQvRXh0M1dyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9leHQvRXh0M1dyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1ZjE1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQzV3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDNXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQzIik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQ0V3JpdGVySW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQ0V3JpdGVySW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTA5ODhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvZXh0L0V4dDRXcml0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzIuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0NFdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHQ0V3JpdGVySW50ZXJjZXB0b3IgSU5TVEFOQ0UgPSBuZXcgRXh0NFdyaXRlckludGVyY2VwdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0NCIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjZjNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5zY2FubmluZy5yZWN1cnNpdmU8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0Mjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTA3MWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkgKyAiLWV4dDQtZXh0Mi1leHQxLWV4dDMiLAorICAgICAgICAgICAgICAgIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTMvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzFiM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTMvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtaW5pdC0zPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWluaXQtMzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1pbml0LTMgLSBjb25maWd1cmVkIGJ5IGV4cGxpY2l0bHkgc2V0IHJlc291cmNlIGNsYXNzZXM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8zL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZjliYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8zOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0Yzk5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzMuSGVsbG9Xb3JsZFJlc291cmNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8zL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzMvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyYzRmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8zL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmVxdWFscygiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxMTlmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1pbml0LTQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtaW5pdC00PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWluaXQtNCAtIGNvbmZpZ3VyZWQgYnkgZXhwbGljaXRseSBzZXQgcmVzb3VyY2UgYW5kIHByb3ZpZGVyIGNsYXNzIG5hbWU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF80L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjdiNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF80OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgSGVsbG8gZ2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IEhlbGxvKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWxsbyB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNC9IZWxsb1dyaXRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzQvSGVsbG9Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDExM2QxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzQvSGVsbG9Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF80OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBIZWxsb1dyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbz4geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgSGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvIGhlbGxvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbyBoZWxsbywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2IxNjhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0NDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNC5IZWxsb1dvcmxkUmVzb3VyY2U7b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzQuSGVsbG9Xcml0ZXI8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisKKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQ0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNC9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF80L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNmI1ZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNC9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF80OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocy5lcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTM1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtaW5pdC01PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWluaXQtNTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1pbml0LTUgLSBmaWx0ZXIgd2l0aCBzcGVjaWZpZWQgamF4IHJzIGFwcGxpY2F0aW9uIGNsYXNzPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjAwM2QzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJmaWx0ZXJfcGF0aC9oZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9TZXJ2bGV0MjVpbml0NS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvU2VydmxldDI1aW5pdDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzJlMDcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvU2VydmxldDI1aW5pdDUuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF81OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJhcHBsaWNhdGlvbl9wYXRoIikKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0MjVpbml0NSBleHRlbmRzIEFwcGxpY2F0aW9ueworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF81L1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF81L1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGVlZTMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCisvKioKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFBhdGgoImZpbHRlcl9wYXRoL3VucmVhY2hhYmxlIikKK3B1YmxpYyBjbGFzcyBVbnJlYWNoYWJsZVJlc291cmNlIHsKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTE3MGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RTZXJ2bGV0NTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzUuU2VydmxldDI1aW5pdDU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdFNlcnZsZXQ1PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9maWx0ZXJfcGF0aC8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjE0MTJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiZmlsdGVyX3BhdGgvaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkQXRXcm9uZ1BhdGgoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoKS5wYXRoKCJhcHBsaWNhdGlvbl9wYXRoL2ZpbHRlcl9wYXRoL2hlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIlJlcXVlc3QgdG8gYXBwbGljYXRpb25fcGF0aC9oZWxsb3dvcmxkIHNob3VsZCBoYXZlIGZhaWxlZCwgYnV0IGRpZCBub3QuIFRoYXQgbWVhbnMgdHdvIGFwcGxpY2F0aW9ucyBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVnaXN0ZXJlZC4iLAorICAgICAgICAgICAgICAgIHIuZ2V0U3RhdHVzKCkgPj0gNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5yZWFjaGFibGVSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoImZpbHRlcl9wYXRoL3VucmVhY2hhYmxlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJNYW5hZ2VkIHRvIHJlYWNoIGEgcmVzb3VyY2UgdGhhdCBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgYXBwbGljYXRpb24uIiwgci5nZXRTdGF0dXMoKSA+PSA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVucmVhY2hhYmxlUmVzb3VyY2VBdFdyb25nUGF0aCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoImFwcGxpY2F0aW9uX3BhdGgvZmlsdGVyX3BhdGgvdW5yZWFjaGFibGUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gcmVhY2ggYSByZXNvdXJjZSB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBhcHBsaWNhdGlvbi4iLCByLmdldFN0YXR1cygpID49IDQwMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC02L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTg5NzU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC02L3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LWluaXQtNjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1pbml0LTY8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0yLjUtaW5pdC02IC0gZmlsdGVyIC0gY29uZmlndXJlZCB1c2luZyBwYWNrYWdlIHNjYW5uaW5nPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC02L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzYvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDVjNmUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC02L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzYvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNGU4NGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RTZXJ2bGV0NjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIucGFja2FnZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzY8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdFNlcnZsZXQ2PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC02L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzYvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNi9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTAwNjNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC02L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzYvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHMuZXF1YWxzKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC03L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFlZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC03L3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LWluaXQtNzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1pbml0LTc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0yLjUtaW5pdC03IC0gZmlsdGVyIC0gY29uZmlndXJlZCBieSBleHBsaWNpdGx5IHNldCByZXNvdXJjZSBjbGFzc2VzPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC03L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzcvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjkyNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC03L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzcvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OWQ1MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RTZXJ2bGV0NzwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNy5IZWxsb1dvcmxkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdFNlcnZsZXQ3PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC03L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzcvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWVkZjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC03L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzcvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHMuZXF1YWxzKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjkxNmNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LWluaXQtODwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1pbml0LTg8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0yLjUtaW5pdC04IC0gZmlsdGVyIC0gY29uZmlndXJlZCBieSBleHBsaWNpdGx5IHNldCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3MgbmFtZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF84L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzOTE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF84L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0Xzg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBIZWxsbyBnZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGVsbG8oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlbGxvIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF84L0hlbGxvV3JpdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfOC9IZWxsb1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGNiNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfOC9IZWxsb1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0Xzg7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBIZWxsb1dyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbz4geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgSGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvIGhlbGxvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbyBoZWxsbywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWFhNmQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0U2VydmxldDg8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzguSGVsbG9Xb3JsZFJlc291cmNlO29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF84LkhlbGxvV3JpdGVyPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RTZXJ2bGV0ODwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF84L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzMDRiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF84L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0Xzg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmVxdWFscygiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MjM4MDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1tdmMtMTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1tdmMtMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1tdmMtMSAtIGZpbHRlciAtIE1WQzwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmM8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLWpzcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3M2YzY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuanNwLkpzcE12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMS5yZXNvdXJjZS5Cb29rc3RvcmU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgcGFja2FnZXMoQm9va3N0b3JlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworCisgICAgICAgIC8vIE1WQy4KKyAgICAgICAgcmVnaXN0ZXIoSnNwTXZjRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgLy8gTG9nZ2luZy4KKyAgICAgICAgcmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9vay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDE3NTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9vay5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMS5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK3B1YmxpYyBjbGFzcyBCb29rIGV4dGVuZHMgSXRlbSB7CisKKyAgICBwdWJsaWMgQm9vaygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vayhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBhdXRob3IpIHsKKyAgICAgICAgc3VwZXIodGl0bGUsIGF1dGhvcik7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rc3RvcmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rc3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjZiN2IzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2tzdG9yZS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMS5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworCitAUGF0aCgiLyIpCitAU2luZ2xldG9uCitAVGVtcGxhdGUKK0BQcm9kdWNlcygidGV4dC9odG1sIikKK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIEJvb2tzdG9yZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEl0ZW0+IGl0ZW1zID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBJdGVtPigpOworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgQm9va3N0b3JlKCkgeworICAgICAgICBzZXROYW1lKCJDemVjaCBCb29rc3RvcmUiKTsKKyAgICAgICAgZ2V0SXRlbXMoKS5wdXQoIjEiLCBuZXcgQm9vaygiU3ZlamsiLCAiSmFyb3NsYXYgSGFzZWsiKSk7CisgICAgICAgIGdldEl0ZW1zKCkucHV0KCIyIiwgbmV3IEJvb2soIktyYWthdGl0IiwgIkthcmVsIENhcGVrIikpOworICAgIH0KKworICAgIEBQYXRoKCJpdGVtcy97aXRlbWlkfS8iKQorICAgIHB1YmxpYyBJdGVtIGdldEl0ZW0oQFBhdGhQYXJhbSgiaXRlbWlkIikgU3RyaW5nIGl0ZW1pZCkgeworICAgICAgICBJdGVtIGkgPSBnZXRJdGVtcygpLmdldChpdGVtaWQpOworICAgICAgICBpZiAoaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KCJJdGVtLCAiICsgaXRlbWlkICsgIiwgaXMgbm90IGZvdW5kIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCwgTWVkaWFUeXBlLlRFWFRfWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCisgICAgcHVibGljIEJvb2tzdG9yZSBnZXRYbWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBJdGVtPiBnZXRJdGVtcygpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW1zOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9JdGVtLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDFiNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvSXRlbS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMS5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKKworQFRlbXBsYXRlCitAUHJvZHVjZXMoInRleHQvaHRtbCIpCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK3B1YmxpYyBjbGFzcyBJdGVtIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOworICAgIHByaXZhdGUgU3RyaW5nIGF1dGhvcjsKKworICAgIHB1YmxpYyBJdGVtKCkgeworICAgIH0KKworICAgIHB1YmxpYyBJdGVtKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIGF1dGhvcikgeworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMuYXV0aG9yID0gYXV0aG9yOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhvcigpIHsKKyAgICAgICAgcmV0dXJuIGF1dGhvcjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKHtNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MLCBNZWRpYVR5cGUuVEVYVF9YTUwsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OfSkKKyAgICBwdWJsaWMgSXRlbSBnZXRYbWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSXRlbXsiCisgICAgICAgICAgICAgICAgKyAidGl0bGU9JyIgKyB0aXRsZSArICdcJycKKyAgICAgICAgICAgICAgICArICIsIGF1dGhvcj0nIiArIGF1dGhvciArICdcJycKKyAgICAgICAgICAgICAgICArICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjkyODAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzEuTXlBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMS5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8IS0tIHBhc3MgdG8gbmV4dCBmaWx0ZXIgaWYgSmVyc2V5L0FwcCByZXR1cm5zIDQwNCAtLT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZsZXQuZmlsdGVyLmZvcndhcmRPbjQwNDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzEuTXlBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2svaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNjAyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2svaW5kZXguanNwCkBAIC0wLDAgKzEsNDYgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKzwlLS0KK1RoZSB0YWdsaWIgZGlyZWN0aXZlIGJlbG93IGltcG9ydHMgdGhlIEpTVEwgbGlicmFyeS4gSWYgeW91IHVuY29tbWVudCBpdCwKK3lvdSBtdXN0IGFsc28gYWRkIHRoZSBKU1RMIGxpYnJhcnkgdG8gdGhlIHByb2plY3QuIFRoZSBBZGQgTGlicmFyeS4uLiBhY3Rpb24KK29uIExpYnJhcmllcyBub2RlIGluIFByb2plY3RzIHZpZXcgY2FuIGJlIHVzZWQgdG8gYWRkIHRoZSBKU1RMIDEuMSBsaWJyYXJ5LgorLS0lPgorPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKzwlQHRhZ2xpYiBwcmVmaXg9InJidCIgdXJpPSJ1cm46b3JnOmdsYXNzZmlzaDpqZXJzZXk6c2VydmxldDptdmMiICU+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgICAgICAgPHRpdGxlPkJvb2s8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgICAgICA8aDE+JHtpdC50aXRsZX08L2gxPgorCisgICAgICAgIEJvb2sgZnJvbSAke2l0LmF1dGhvcn0KKworICAgICAgICA8cmJ0OmluY2x1ZGUgcGFnZT0iZm9vdGVyLmpzcCIvPgorCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2tzdG9yZS9jb3VudC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlNzU0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2tzdG9yZS9jb3VudC5qc3AKQEAgLTAsMCArMSwyNyBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUB0YWdsaWIgcHJlZml4PSJmbiIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2Z1bmN0aW9ucyIgJT4KKzwlLS0KKyAgQW4gZXhhbXBsZSBvZiBhbm90aGVyIHNpZGUgSlNQLgorLS0lPgorPGh0bWw+CisgIDxib2R5PgorICAgIyBvZiBpdGVtczogJHtmbjpsZW5ndGgoaXQuaXRlbXMpfSAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2tzdG9yZS9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkYjIwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2tzdG9yZS9pbmRleC5qc3AKQEAgLTAsMCArMSw1NiBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorCis8JUB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIlPiAKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgorICAgICAgICAgIEBpbXBvcnQgdXJsKCA8Yzp1cmwgdmFsdWU9Ii9jc3Mvc3R5bGUuY3NzIi8+ICk7CisgICAgICAgIDwvc3R5bGU+CisgICAgICAgIDx0aXRsZT5SRVNUIEJvb2tzdG9yZSBTYW1wbGU8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgIDxoMT4ke2l0Lm5hbWV9PC9oMT4KKyAgICAKKyAgICA8aDI+SXRlbSBMaXN0PC9oMj4KKworICAgIDx1bD4KKyAgICAgICAgPGM6Zm9yRWFjaCB2YXI9ImkiIGl0ZW1zPSIke2l0Lml0ZW1zfSI+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaXRlbXMvJHtpLmtleX0vIj4ke2kudmFsdWUudGl0bGV9PC9hPgorICAgICAgICA8L2M6Zm9yRWFjaD4KKyAgICA8L3VsPgorICAgIAorICAgIDxoMj5PdGhlcnM8L2gyPgorICAgIDxwPgorICAgICAgPGEgaHJlZj0iY291bnQiPmNvdW50IGludmVudG9yeTwvYT4KKyAgICA8cD4KKyAgICAgIDxhIGhyZWY9InRpbWUiPmdldCB0aGUgc3lzdGVtIHRpbWU8L2E+CisgICAgPHA+CisgICAgICA8YSBocmVmPSJqc3AvaGVscC5qc3AiPnJlZ3VsYXIgcmVzb3VyY2VzPC9hPgorICAgIDwvcD4gICAgCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlL3RpbWUuanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlL3RpbWUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyN2UyMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AKQEAgLTAsMCArMSwyNCBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgorPGh0bWw+CisgIDxib2R5PgorICAgIEN1cnJlbnQgc3lzdGVtIHRpbWUgaXMgJHtpdC5zeXN0ZW1UaW1lfQorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9JdGVtL2Zvb3Rlci5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9JdGVtL2Zvb3Rlci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmZjcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcApAQCAtMCwwICsxLDI0IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzxwPgorPGEgaHJlZj0iLi4vLi4vIj5CYWNrPC9hPgorPGhyPgorPGRpdiBhbGlnbj0icmlnaHQiPgorICAgIENvbW1vbiBmb290ZXIgKHRpdGxlICR7aXQudGl0bGV9KQorPC9kaXY+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvQm9va3N0b3JlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvQm9va3N0b3JlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1MWI5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9Cb29rc3RvcmVJVENhc2UuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18xLnJlc291cmNlLkJvb2tzdG9yZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBCb29rc3RvcmVJVENhc2UgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBOT1RFOiBIdHRwVXJsQ29ubmVjdG9yIHNlbmRzIHNldmVyYWwgYWNjZXB0ZWQgdHlwZXMgYnkgZGVmYXVsdCB3aGVuIG5vdCBleHBsaWNpdGx5IHNldCBieSB0aGUgY2FsbGVyLgorICAgICAgICAvLyBJbiBzdWNoIGNhc2UsIHRoZSAuYWNjZXB0KCJ0ZXh0L2h0bWwiKSBjYWxsIGlzIG5vdCBuZWNlc3NhcnkuIEhvd2V2ZXIsIG90aGVyIGNvbm5lY3RvcnMgYWN0IGluIGEgZGlmZmVyZW50IHdheSBhbmQKKyAgICAgICAgLy8gdGhpcyBsZWFkcyBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHdoZW4gc2VsZWN0aW5nIHRoZSBNZXNzYWdlQm9keVdyaXRlci4gTGVhdmluZyB0aGUgZGVmaW5pdGlvbiBleHBsaWNpdCBmb3IgYnJvYWRlcgorICAgICAgICAvLyBjb21wYXRpYmlsaXR5LgorICAgICAgICBhc3NlcnRCb29rc3RvcmVIdG1sUmVzcG9uc2UodGFyZ2V0KCkucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJvb2tzdG9yZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChCb29rc3RvcmUuY2xhc3MpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIHJldHVybmVkIGEgYm9va3N0b3JlISIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib29rc3RvcmUgbmFtZSIsICJDemVjaCBCb29rc3RvcmUiLCByZXNwb25zZS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUNvbnRlbnRUeXBlQW5kQ29udGVudExlbmd0aFZhbHVlSW5YbWxSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRTdGF0dXNDb250ZW50VHlwZUFuZExlbmd0aCh0YXJnZXQoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoKSk7CisgICAgICAgIGFzc2VydFN0YXR1c0NvbnRlbnRUeXBlQW5kTGVuZ3RoKHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoInRleHQvaHRtbCIsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLCAiYXBwbGljYXRpb24veG1sO3E9MC45IiwgIiovKjtxPTAuOCIpLmdldCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U3RhdHVzQ29udGVudFR5cGVBbmRMZW5ndGgoUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSByZXR1cm5lZCBhIDIwMCByZXNwb25zZSEiLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGNvbnRhaW4gYSBDb250ZW50LVR5cGUgaGVhZGVyISIsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5jb250YWluc0tleShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBhIHNpbmdsZSBDb250ZW50LVR5cGUgaGVhZGVyISIsIDEsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXQoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgY29udGFpbiBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciEiLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBhIHNpbmdsZSBDb250ZW50LUxlbmd0aCBoZWFkZXIhIiwKKyAgICAgICAgICAgICAgICAxLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0KEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sVXNpbmdXZWJLaXRBY2NlcHRIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgIiovKjtxPTAuOCIpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEJvb2tzdG9yZUh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Qm9va3N0b3JlSHRtbFJlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgeworICAgICAgICBhc3NlcnRIdG1sUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKHJlc3BvbnNlLCAiQm9va3N0b3JlIik7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICJJdGVtIExpc3QiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvSXRlbUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL0l0ZW1JVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQ5MTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL0l0ZW1JVENhc2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMS5yZXNvdXJjZS5Cb29rOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworcHVibGljIGNsYXNzIEl0ZW1JVENhc2UgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBOT1RFOiBIdHRwVXJsQ29ubmVjdG9yIHNlbmRzIHNldmVyYWwgYWNjZXB0ZWQgdHlwZXMgYnkgZGVmYXVsdCB3aGVuIG5vdCBleHBsaWNpdGx5IHNldCBieSB0aGUgY2FsbGVyLgorICAgICAgICAvLyBJbiBzdWNoIGNhc2UsIHRoZSAuYWNjZXB0KCJ0ZXh0L2h0bWwiKSBjYWxsIGlzIG5vdCBuZWNlc3NhcnkuIEhvd2V2ZXIsIG90aGVyIGNvbm5lY3RvcnMgYWN0IGluIGEgZGlmZmVyZW50IHdheSBhbmQKKyAgICAgICAgLy8gdGhpcyBsZWFkcyBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHdoZW4gc2VsZWN0aW5nIHRoZSBNZXNzYWdlQm9keVdyaXRlci4gTGVhdmluZyB0aGUgZGVmaW5pdGlvbiBleHBsaWNpdCBmb3IgYnJvYWRlcgorICAgICAgICAvLyBjb21wYXRpYmlsaXR5LgorICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9IVE1MKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc1htbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdGVtIFhNTCBpczogIiArIHRleHQpOworCisgICAgICAgIGZpbmFsIEJvb2sgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KEJvb2suY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBpdGVtISIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpdGVtIHRpdGxlIiwgIlN2ZWprIiwgcmVzcG9uc2UuZ2V0VGl0bGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0h0bWxVc2luZ1dlYktpdEFjY2VwdEhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gaXRlbTFyZXNvdXJjZSgpLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgIiovKjtxPTAuOCIpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEl0ZW1IdG1sUmVzcG9uc2UocmVzcG9uc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEl0ZW1IdG1sUmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICI8dGl0bGU+Qm9vazwvdGl0bGU+Iik7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICI8aDE+U3Zlams8L2gxPiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBXZWJUYXJnZXQgaXRlbTFyZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldCgpLnBhdGgoIi9pdGVtcy8xIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvVGVzdFN1cHBvcnQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9UZXN0U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTk1OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvVGVzdFN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgdGVzdCBjYXNlcyB3aGljaCBib290cyB1cCBhIEdsYXNzRmlzaCBzZXJ2ZXIgZm9yIGluIGNvbnRhaW5lciB0ZXN0aW5nIG9mIFJFU1RmdWwgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KKyAqIEBhdXRob3IgTmFyZXNoCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0U3VwcG9ydCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRIdG1sUmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoIk5vIHRleHQgcmV0dXJuZWQhIiwgcmVzcG9uc2UpOworCisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICI8aHRtbD4iKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjwvaHRtbD4iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKFN0cmluZyByZXNwb25zZSwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gIiArIHRleHQgKyAiIGJ1dCB3YXM6ICIgKyByZXNwb25zZSwgcmVzcG9uc2UuY29udGFpbnModGV4dCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1tdmMtMjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1tdmMtMjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1tdmMtMiAtIGZpbHRlciAtIE1WQyAtIGplcnNleS5jb25maWcuc2VydmxldC5qc3AuZGlzYWJsZUpzcFRlbXBsYXRlUHJvY2Vzc29yPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12YzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtanNwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmNzA2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuSnNwTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yLnJlc291cmNlLkJvb2tzdG9yZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgLy8gUmVzb3VyY2VzLgorICAgICAgICBwYWNrYWdlcyhCb29rc3RvcmUuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgLy8gTVZDLgorICAgICAgICByZWdpc3RlcihKc3BNdmNGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICAvLyBMb2dnaW5nLgorICAgICAgICByZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2suamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2NGU4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yLnJlc291cmNlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIEJvb2sgZXh0ZW5kcyBJdGVtIHsKKworICAgIHB1YmxpYyBCb29rKCkgeworICAgIH0KKworICAgIHB1YmxpYyBCb29rKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIGF1dGhvcikgeworICAgICAgICBzdXBlcih0aXRsZSwgYXV0aG9yKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2tzdG9yZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2tzdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjA4MTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CisKK0BQYXRoKCIvIikKK0BTaW5nbGV0b24KK0BUZW1wbGF0ZQorQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgQm9va3N0b3JlIHsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSXRlbT4gaXRlbXMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIEl0ZW0+KCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBCb29rc3RvcmUoKSB7CisgICAgICAgIHNldE5hbWUoIkN6ZWNoIEJvb2tzdG9yZSIpOworICAgICAgICBnZXRJdGVtcygpLnB1dCgiMSIsIG5ldyBCb29rKCJTdmVqayIsICJKYXJvc2xhdiBIYXNlayIpKTsKKyAgICAgICAgZ2V0SXRlbXMoKS5wdXQoIjIiLCBuZXcgQm9vaygiS3Jha2F0aXQiLCAiS2FyZWwgQ2FwZWsiKSk7CisgICAgfQorCisgICAgQFBhdGgoIml0ZW1zL3tpdGVtaWR9LyIpCisgICAgcHVibGljIEl0ZW0gZ2V0SXRlbShAUGF0aFBhcmFtKCJpdGVtaWQiKSBTdHJpbmcgaXRlbWlkKSB7CisgICAgICAgIEl0ZW0gaSA9IGdldEl0ZW1zKCkuZ2V0KGl0ZW1pZCk7CisgICAgICAgIGlmIChpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoIkl0ZW0sICIgKyBpdGVtaWQgKyAiLCBpcyBub3QgZm91bmQiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKHtNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MLCBNZWRpYVR5cGUuVEVYVF9YTUwsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OfSkKKyAgICBwdWJsaWMgQm9va3N0b3JlIGdldFhtbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1hcDxTdHJpbmcsIEl0ZW0+IGdldEl0ZW1zKCkgeworICAgICAgICByZXR1cm4gaXRlbXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0l0ZW0uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9JdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlZjA2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9JdGVtLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworCitAVGVtcGxhdGUKK0BQcm9kdWNlcygidGV4dC9odG1sIikKK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIEl0ZW0geworCisgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yOworCisgICAgcHVibGljIEl0ZW0oKSB7CisgICAgfQorCisgICAgcHVibGljIEl0ZW0oZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgYXV0aG9yKSB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICAgICAgdGhpcy5hdXRob3IgPSBhdXRob3I7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yKCkgeworICAgICAgICByZXR1cm4gYXV0aG9yOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwsIE1lZGlhVHlwZS5URVhUX1hNTCwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT059KQorICAgIHB1YmxpYyBJdGVtIGdldFhtbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJJdGVteyIKKyAgICAgICAgICAgICAgICArICJ0aXRsZT0nIiArIHRpdGxlICsgJ1wnJworICAgICAgICAgICAgICAgICsgIiwgYXV0aG9yPSciICsgYXV0aG9yICsgJ1wnJworICAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTA1YmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMi5NeUFwcGxpY2F0aW9uPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yLk15QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubXZjLnRlbXBsYXRlQmFzZVBhdGguanNwPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDwhLS0gcGFzcyB0byBuZXh0IGZpbHRlciBpZiBKZXJzZXkvQXBwIHJldHVybnMgNDA0IC0tPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuZm9yd2FyZE9uNDA0PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzIuTXlBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2svaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNjAyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2svaW5kZXguanNwCkBAIC0wLDAgKzEsNDYgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKzwlLS0KK1RoZSB0YWdsaWIgZGlyZWN0aXZlIGJlbG93IGltcG9ydHMgdGhlIEpTVEwgbGlicmFyeS4gSWYgeW91IHVuY29tbWVudCBpdCwKK3lvdSBtdXN0IGFsc28gYWRkIHRoZSBKU1RMIGxpYnJhcnkgdG8gdGhlIHByb2plY3QuIFRoZSBBZGQgTGlicmFyeS4uLiBhY3Rpb24KK29uIExpYnJhcmllcyBub2RlIGluIFByb2plY3RzIHZpZXcgY2FuIGJlIHVzZWQgdG8gYWRkIHRoZSBKU1RMIDEuMSBsaWJyYXJ5LgorLS0lPgorPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKzwlQHRhZ2xpYiBwcmVmaXg9InJidCIgdXJpPSJ1cm46b3JnOmdsYXNzZmlzaDpqZXJzZXk6c2VydmxldDptdmMiICU+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgICAgICAgPHRpdGxlPkJvb2s8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgICAgICA8aDE+JHtpdC50aXRsZX08L2gxPgorCisgICAgICAgIEJvb2sgZnJvbSAke2l0LmF1dGhvcn0KKworICAgICAgICA8cmJ0OmluY2x1ZGUgcGFnZT0iZm9vdGVyLmpzcCIvPgorCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2tzdG9yZS9jb3VudC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlNzU0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2tzdG9yZS9jb3VudC5qc3AKQEAgLTAsMCArMSwyNyBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUB0YWdsaWIgcHJlZml4PSJmbiIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2Z1bmN0aW9ucyIgJT4KKzwlLS0KKyAgQW4gZXhhbXBsZSBvZiBhbm90aGVyIHNpZGUgSlNQLgorLS0lPgorPGh0bWw+CisgIDxib2R5PgorICAgIyBvZiBpdGVtczogJHtmbjpsZW5ndGgoaXQuaXRlbXMpfSAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2tzdG9yZS9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkYjIwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2tzdG9yZS9pbmRleC5qc3AKQEAgLTAsMCArMSw1NiBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorCis8JUB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIlPiAKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgorICAgICAgICAgIEBpbXBvcnQgdXJsKCA8Yzp1cmwgdmFsdWU9Ii9jc3Mvc3R5bGUuY3NzIi8+ICk7CisgICAgICAgIDwvc3R5bGU+CisgICAgICAgIDx0aXRsZT5SRVNUIEJvb2tzdG9yZSBTYW1wbGU8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgIDxoMT4ke2l0Lm5hbWV9PC9oMT4KKyAgICAKKyAgICA8aDI+SXRlbSBMaXN0PC9oMj4KKworICAgIDx1bD4KKyAgICAgICAgPGM6Zm9yRWFjaCB2YXI9ImkiIGl0ZW1zPSIke2l0Lml0ZW1zfSI+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaXRlbXMvJHtpLmtleX0vIj4ke2kudmFsdWUudGl0bGV9PC9hPgorICAgICAgICA8L2M6Zm9yRWFjaD4KKyAgICA8L3VsPgorICAgIAorICAgIDxoMj5PdGhlcnM8L2gyPgorICAgIDxwPgorICAgICAgPGEgaHJlZj0iY291bnQiPmNvdW50IGludmVudG9yeTwvYT4KKyAgICA8cD4KKyAgICAgIDxhIGhyZWY9InRpbWUiPmdldCB0aGUgc3lzdGVtIHRpbWU8L2E+CisgICAgPHA+CisgICAgICA8YSBocmVmPSJqc3AvaGVscC5qc3AiPnJlZ3VsYXIgcmVzb3VyY2VzPC9hPgorICAgIDwvcD4gICAgCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlL3RpbWUuanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlL3RpbWUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyN2UyMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AKQEAgLTAsMCArMSwyNCBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgorPGh0bWw+CisgIDxib2R5PgorICAgIEN1cnJlbnQgc3lzdGVtIHRpbWUgaXMgJHtpdC5zeXN0ZW1UaW1lfQorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9JdGVtL2Zvb3Rlci5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9JdGVtL2Zvb3Rlci5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmZjcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcApAQCAtMCwwICsxLDI0IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzxwPgorPGEgaHJlZj0iLi4vLi4vIj5CYWNrPC9hPgorPGhyPgorPGRpdiBhbGlnbj0icmlnaHQiPgorICAgIENvbW1vbiBmb290ZXIgKHRpdGxlICR7aXQudGl0bGV9KQorPC9kaXY+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvQm9va3N0b3JlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvQm9va3N0b3JlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyMDk3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9Cb29rc3RvcmVJVENhc2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMi5yZXNvdXJjZS5Cb29rc3RvcmU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworcHVibGljIGNsYXNzIEJvb2tzdG9yZUlUQ2FzZSBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQm9va3N0b3JlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KEJvb2tzdG9yZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0Qm9va3N0b3JlWG1sUmVzcG9uc2UocmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sVXNpbmdXZWJLaXRBY2NlcHRIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sO3E9MC45IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC44IikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Qm9va3N0b3JlWG1sUmVzcG9uc2UoZmluYWwgQm9va3N0b3JlIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIHJldHVybmVkIGEgYm9va3N0b3JlISIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib29rc3RvcmUgbmFtZSIsICJDemVjaCBCb29rc3RvcmUiLCByZXNwb25zZS5nZXROYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9JdGVtSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvSXRlbUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTc5M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvSXRlbUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzIucmVzb3VyY2UuQm9vazsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitwdWJsaWMgY2xhc3MgSXRlbUlUQ2FzZSBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRleHQgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSXRlbSBYTUwgaXM6ICIgKyB0ZXh0KTsKKworICAgICAgICBmaW5hbCBCb29rIHJlc3BvbnNlID0gaXRlbTFyZXNvdXJjZSgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChCb29rLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0SXRlbVhtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbFVzaW5nV2ViS2l0QWNjZXB0SGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KAorICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWw7cT0wLjkiLAorICAgICAgICAgICAgICAgICIqLyo7cT0wLjgiKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SXRlbVhtbFJlc3BvbnNlKGZpbmFsIEJvb2sgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gaXRlbSEiLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaXRlbSB0aXRsZSIsICJTdmVqayIsIHJlc3BvbnNlLmdldFRpdGxlKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBXZWJUYXJnZXQgaXRlbTFyZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldCgpLnBhdGgoIi9pdGVtcy8xIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL1Rlc3RTdXBwb3J0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvVGVzdFN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWQyMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL1Rlc3RTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgdGVzdCBjYXNlcyB3aGljaCBib290cyB1cCBhIEdsYXNzRmlzaCBzZXJ2ZXIgZm9yIGluIGNvbnRhaW5lciB0ZXN0aW5nIG9mIFJFU1RmdWwgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KKyAqIEBhdXRob3IgTmFyZXNoCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0U3VwcG9ydCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjJiMmJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvcG9tLnhtbApAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtbXZjLTM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtbXZjLTM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0yLjUtbXZjLTMgLSBmaWx0ZXIgLSBNVkMgLSBqZXJzZXkuY29uZmlnLnNlcnZsZXQuSnNwVGVtcGxhdGVzQmFzZVBhdGg8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1qc3A8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OThiNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmpzcC5Kc3BNdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzMucmVzb3VyY2UuQm9va3N0b3JlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBSZXNvdXJjZXMuCisgICAgICAgIHBhY2thZ2VzKEJvb2tzdG9yZS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICAvLyBNVkMuCisgICAgICAgIHJlZ2lzdGVyKEpzcE12Y0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIC8vIExvZ2dpbmcuCisgICAgICAgIHJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDlhOGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2suamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzMucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgQm9vayBleHRlbmRzIEl0ZW0geworCisgICAgcHVibGljIEJvb2soKSB7CisgICAgfQorCisgICAgcHVibGljIEJvb2soZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgYXV0aG9yKSB7CisgICAgICAgIHN1cGVyKHRpdGxlLCBhdXRob3IpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9va3N0b3JlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9va3N0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyODg4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzMucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKKworQFBhdGgoIi8iKQorQFNpbmdsZXRvbgorQFRlbXBsYXRlCitAUHJvZHVjZXMoInRleHQvaHRtbCIpCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK3B1YmxpYyBjbGFzcyBCb29rc3RvcmUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJdGVtPiBpdGVtcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgSXRlbT4oKTsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIEJvb2tzdG9yZSgpIHsKKyAgICAgICAgc2V0TmFtZSgiQ3plY2ggQm9va3N0b3JlIik7CisgICAgICAgIGdldEl0ZW1zKCkucHV0KCIxIiwgbmV3IEJvb2soIlN2ZWprIiwgIkphcm9zbGF2IEhhXHUwMTYxZWsiKSk7CisgICAgICAgIGdldEl0ZW1zKCkucHV0KCIyIiwgbmV3IEJvb2soIktyYWthdGl0IiwgIkthcmVsIENhcGVrIikpOworICAgIH0KKworICAgIEBQYXRoKCJpdGVtcy97aXRlbWlkfS8iKQorICAgIHB1YmxpYyBJdGVtIGdldEl0ZW0oQFBhdGhQYXJhbSgiaXRlbWlkIikgU3RyaW5nIGl0ZW1pZCkgeworICAgICAgICBJdGVtIGkgPSBnZXRJdGVtcygpLmdldChpdGVtaWQpOworICAgICAgICBpZiAoaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KCJJdGVtLCAiICsgaXRlbWlkICsgIiwgaXMgbm90IGZvdW5kIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCwgTWVkaWFUeXBlLlRFWFRfWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCisgICAgcHVibGljIEJvb2tzdG9yZSBnZXRYbWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBJdGVtPiBnZXRJdGVtcygpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW1zOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9JdGVtLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWI2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvSXRlbS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMy5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CisKK0BUZW1wbGF0ZQorQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgSXRlbSB7CisKKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKyAgICBwcml2YXRlIFN0cmluZyBhdXRob3I7CisKKyAgICBwdWJsaWMgSXRlbSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlbShmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBhdXRob3IpIHsKKyAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOworICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gdGl0bGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRob3IoKSB7CisgICAgICAgIHJldHVybiBhdXRob3I7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCwgTWVkaWFUeXBlLlRFWFRfWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCisgICAgcHVibGljIEl0ZW0gZ2V0WG1sKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInV0ZiIpCisgICAgcHVibGljIFZpZXdhYmxlIGdldEl0ZW1VdGY4KCkgeworICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJpbmRleC51dGY4LmpzcCIsIHRoaXMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaXNvIikKKyAgICBwdWJsaWMgVmlld2FibGUgZ2V0SXRlbUlzbzg4NTkyKCkgeworICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJpbmRleC5pc284ODU5Mi5qc3AiLCB0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkl0ZW17IgorICAgICAgICAgICAgICAgICsgInRpdGxlPSciICsgdGl0bGUgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAiLCBhdXRob3I9JyIgKyBhdXRob3IgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjNTUwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18zLk15QXBwbGljYXRpb248L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzMuTXlBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5tdmMudGVtcGxhdGVCYXNlUGF0aC5qc3A8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+L2pzcC88L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDwhLS0gcGFzcyB0byBuZXh0IGZpbHRlciBpZiBKZXJzZXkvQXBwIHJldHVybnMgNDA0IC0tPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuZm9yd2FyZE9uNDA0PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMy5NeUFwcGxpY2F0aW9uPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2svaW5kZXguaXNvODg1OTIuanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2svaW5kZXguaXNvODg1OTIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjQzYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay9pbmRleC5pc284ODU5Mi5qc3AKQEAgLTAsMCArMSw0NSBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJJU08tODg1OS0yIiU+Cis8JS0tCitUaGUgdGFnbGliIGRpcmVjdGl2ZSBiZWxvdyBpbXBvcnRzIHRoZSBKU1RMIGxpYnJhcnkuIElmIHlvdSB1bmNvbW1lbnQgaXQsCit5b3UgbXVzdCBhbHNvIGFkZCB0aGUgSlNUTCBsaWJyYXJ5IHRvIHRoZSBwcm9qZWN0LiBUaGUgQWRkIExpYnJhcnkuLi4gYWN0aW9uCitvbiBMaWJyYXJpZXMgbm9kZSBpbiBQcm9qZWN0cyB2aWV3IGNhbiBiZSB1c2VkIHRvIGFkZCB0aGUgSlNUTCAxLjEgbGlicmFyeS4KKy0tJT4KKzwlQHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgcHJlZml4PSJjIiU+Cis8JUB0YWdsaWIgcHJlZml4PSJyYnQiIHVyaT0idXJuOm9yZzpnbGFzc2Zpc2g6amVyc2V5OnNlcnZsZXQ6bXZjIiAlPgorCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CisKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8dGl0bGU+Qm9vazwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorCisgICAgICAgIDxoMT4ke2l0LnRpdGxlfTwvaDE+CisKKyAgICAgICAgQm9vayBmcm9tICR7aXQuYXV0aG9yfQorCisgICAgICAgIDxyYnQ6aW5jbHVkZSBwYWdlPSJmb290ZXIuanNwIi8+CisKKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNjAyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rL2luZGV4LmpzcApAQCAtMCwwICsxLDQ2IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IlVURi04IiU+Cis8JS0tCitUaGUgdGFnbGliIGRpcmVjdGl2ZSBiZWxvdyBpbXBvcnRzIHRoZSBKU1RMIGxpYnJhcnkuIElmIHlvdSB1bmNvbW1lbnQgaXQsCit5b3UgbXVzdCBhbHNvIGFkZCB0aGUgSlNUTCBsaWJyYXJ5IHRvIHRoZSBwcm9qZWN0LiBUaGUgQWRkIExpYnJhcnkuLi4gYWN0aW9uCitvbiBMaWJyYXJpZXMgbm9kZSBpbiBQcm9qZWN0cyB2aWV3IGNhbiBiZSB1c2VkIHRvIGFkZCB0aGUgSlNUTCAxLjEgbGlicmFyeS4KKy0tJT4KKzwlQHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgcHJlZml4PSJjIiU+Cis8JUB0YWdsaWIgcHJlZml4PSJyYnQiIHVyaT0idXJuOm9yZzpnbGFzc2Zpc2g6amVyc2V5OnNlcnZsZXQ6bXZjIiAlPgorCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CisKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CisgICAgICAgIDx0aXRsZT5Cb29rPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisKKyAgICAgICAgPGgxPiR7aXQudGl0bGV9PC9oMT4KKworICAgICAgICBCb29rIGZyb20gJHtpdC5hdXRob3J9CisKKyAgICAgICAgPHJidDppbmNsdWRlIHBhZ2U9ImZvb3Rlci5qc3AiLz4KKworICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rL2luZGV4LnV0ZjguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2svaW5kZXgudXRmOC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQxMGM2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rL2luZGV4LnV0ZjguanNwCkBAIC0wLDAgKzEsNDUgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKzwlLS0KK1RoZSB0YWdsaWIgZGlyZWN0aXZlIGJlbG93IGltcG9ydHMgdGhlIEpTVEwgbGlicmFyeS4gSWYgeW91IHVuY29tbWVudCBpdCwKK3lvdSBtdXN0IGFsc28gYWRkIHRoZSBKU1RMIGxpYnJhcnkgdG8gdGhlIHByb2plY3QuIFRoZSBBZGQgTGlicmFyeS4uLiBhY3Rpb24KK29uIExpYnJhcmllcyBub2RlIGluIFByb2plY3RzIHZpZXcgY2FuIGJlIHVzZWQgdG8gYWRkIHRoZSBKU1RMIDEuMSBsaWJyYXJ5LgorLS0lPgorPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKzwlQHRhZ2xpYiBwcmVmaXg9InJidCIgdXJpPSJ1cm46b3JnOmdsYXNzZmlzaDpqZXJzZXk6c2VydmxldDptdmMiICU+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Cb29rPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisKKyAgICAgICAgPGgxPiR7aXQudGl0bGV9PC9oMT4KKworICAgICAgICBCb29rIGZyb20gJHtpdC5hdXRob3J9CisKKyAgICAgICAgPHJidDppbmNsdWRlIHBhZ2U9ImZvb3Rlci5qc3AiLz4KKworICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUvY291bnQuanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS9jb3VudC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlNzU0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUvY291bnQuanNwCkBAIC0wLDAgKzEsMjcgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAdGFnbGliIHByZWZpeD0iZm4iIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9mdW5jdGlvbnMiICU+Cis8JS0tCisgIEFuIGV4YW1wbGUgb2YgYW5vdGhlciBzaWRlIEpTUC4KKy0tJT4KKzxodG1sPgorICA8Ym9keT4KKyAgICMgb2YgaXRlbXM6ICR7Zm46bGVuZ3RoKGl0Lml0ZW1zKX0gCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3OTZlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUvaW5kZXguanNwCkBAIC0wLDAgKzEsNTYgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKworPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgorICAgICAgICAgIEBpbXBvcnQgdXJsKCA8Yzp1cmwgdmFsdWU9Ii9jc3Mvc3R5bGUuY3NzIi8+ICk7CisgICAgICAgIDwvc3R5bGU+CisgICAgICAgIDx0aXRsZT5SRVNUIEJvb2tzdG9yZSBTYW1wbGU8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgIDxoMT4ke2l0Lm5hbWV9PC9oMT4KKworICAgIDxoMj5JdGVtIExpc3Q8L2gyPgorCisgICAgPHVsPgorICAgICAgICA8Yzpmb3JFYWNoIHZhcj0iaSIgaXRlbXM9IiR7aXQuaXRlbXN9Ij4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJpdGVtcy8ke2kua2V5fS8iPiR7aS52YWx1ZS50aXRsZX08L2E+CisgICAgICAgIDwvYzpmb3JFYWNoPgorICAgIDwvdWw+CisKKyAgICA8aDI+T3RoZXJzPC9oMj4KKyAgICA8cD4KKyAgICAgIDxhIGhyZWY9ImNvdW50Ij5jb3VudCBpbnZlbnRvcnk8L2E+CisgICAgPHA+CisgICAgICA8YSBocmVmPSJ0aW1lIj5nZXQgdGhlIHN5c3RlbSB0aW1lPC9hPgorICAgIDxwPgorICAgICAgPGEgaHJlZj0ianNwL2hlbHAuanNwIj5yZWd1bGFyIHJlc291cmNlczwvYT4KKyAgICA8L3A+CisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS90aW1lLmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3ZTIyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AKQEAgLTAsMCArMSwyNCBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgorPGh0bWw+CisgIDxib2R5PgorICAgIEN1cnJlbnQgc3lzdGVtIHRpbWUgaXMgJHtpdC5zeXN0ZW1UaW1lfQorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvSXRlbS9mb290ZXIuanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZmNzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcApAQCAtMCwwICsxLDI0IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzxwPgorPGEgaHJlZj0iLi4vLi4vIj5CYWNrPC9hPgorPGhyPgorPGRpdiBhbGlnbj0icmlnaHQiPgorICAgIENvbW1vbiBmb290ZXIgKHRpdGxlICR7aXQudGl0bGV9KQorPC9kaXY+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvQm9va3N0b3JlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvQm9va3N0b3JlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmNTdlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9Cb29rc3RvcmVJVENhc2UuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzMucmVzb3VyY2UuQm9va3N0b3JlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworcHVibGljIGNsYXNzIEJvb2tzdG9yZUlUQ2FzZSBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5PVEU6IEh0dHBVcmxDb25uZWN0b3Igc2VuZHMgc2V2ZXJhbCBhY2NlcHRlZCB0eXBlcyBieSBkZWZhdWx0IHdoZW4gbm90IGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSBjYWxsZXIuCisgICAgICAgIC8vIEluIHN1Y2ggY2FzZSwgdGhlIC5hY2NlcHQoInRleHQvaHRtbCIpIGNhbGwgaXMgbm90IG5lY2Vzc2FyeS4gSG93ZXZlciwgb3RoZXIgY29ubmVjdG9ycyBhY3QgaW4gYSBkaWZmZXJlbnQgd2F5IGFuZAorICAgICAgICAvLyB0aGlzIGxlYWRzIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiBzZWxlY3RpbmcgdGhlIE1lc3NhZ2VCb2R5V3JpdGVyLiBMZWF2aW5nIHRoZSBkZWZpbml0aW9uIGV4cGxpY2l0IGZvciBicm9hZGVyCisgICAgICAgIC8vIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGFzc2VydEJvb2tzdG9yZUh0bWxSZXNwb25zZSh0YXJnZXQoKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX0hUTUwpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJvb2tzdG9yZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChCb29rc3RvcmUuY2xhc3MpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIHJldHVybmVkIGEgYm9va3N0b3JlISIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib29rc3RvcmUgbmFtZSIsICJDemVjaCBCb29rc3RvcmUiLCByZXNwb25zZS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sVXNpbmdXZWJLaXRBY2NlcHRIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgIiovKjtxPTAuOCIpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEJvb2tzdG9yZUh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Qm9va3N0b3JlSHRtbFJlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgeworICAgICAgICBhc3NlcnRIdG1sUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKHJlc3BvbnNlLCAiQm9va3N0b3JlIik7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICJJdGVtIExpc3QiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvSXRlbUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL0l0ZW1JVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2MzZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL0l0ZW1JVENhc2UuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18zOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMy5yZXNvdXJjZS5Cb29rOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworcHVibGljIGNsYXNzIEl0ZW1JVENhc2UgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBOT1RFOiBIdHRwVXJsQ29ubmVjdG9yIHNlbmRzIHNldmVyYWwgYWNjZXB0ZWQgdHlwZXMgYnkgZGVmYXVsdCB3aGVuIG5vdCBleHBsaWNpdGx5IHNldCBieSB0aGUgY2FsbGVyLgorICAgICAgICAvLyBJbiBzdWNoIGNhc2UsIHRoZSAuYWNjZXB0KCJ0ZXh0L2h0bWwiKSBjYWxsIGlzIG5vdCBuZWNlc3NhcnkuIEhvd2V2ZXIsIG90aGVyIGNvbm5lY3RvcnMgYWN0IGluIGEgZGlmZmVyZW50IHdheSBhbmQKKyAgICAgICAgLy8gdGhpcyBsZWFkcyBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHdoZW4gc2VsZWN0aW5nIHRoZSBNZXNzYWdlQm9keVdyaXRlci4gTGVhdmluZyB0aGUgZGVmaW5pdGlvbiBleHBsaWNpdCBmb3IgYnJvYWRlcgorICAgICAgICAvLyBjb21wYXRpYmlsaXR5LgorICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9IVE1MKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0h0bWxVdGY4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gaXRlbTFyZXNvdXJjZSgpLnBhdGgoInV0ZiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGh0bWwgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShodG1sKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhodG1sLCAiSGFcdTAxNjFlayIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sSXNvODg1OTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucGF0aCgiaXNvIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgaHRtbFV0ZjggPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShodG1sVXRmOCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJSZXNwb25zZSBzaG91bGRuJ3QgY29udGFpbiBIYVx1MDE2MWVrIGJ1dCB3YXM6ICIgKyBodG1sVXRmOCwgaHRtbFV0ZjguY29udGFpbnMoIkhhXHUwMTYxZWsiKSk7CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gcmVzcG9uc2UucmVhZEVudGl0eShieXRlW10uY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgaHRtbElzbyA9IG5ldyBTdHJpbmcoYnl0ZXMsICJJU08tODg1OS0yIik7CisKKyAgICAgICAgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShodG1sSXNvKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlJlc3BvbnNlIHNob3VsZG4ndCBjb250YWluIEhhXHUwMTYxZWsgYnV0IHdhczogIiArIGh0bWxJc28sIGh0bWxJc28uY29udGFpbnMoIkhhXHUwMTYxZWsiKSk7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMoaHRtbElzbywgbmV3IFN0cmluZygiSGFcdTAxNjFlayIuZ2V0Qnl0ZXMoKSwgIklTTy04ODU5LTIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc1htbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdGVtIFhNTCBpczogIiArIHRleHQpOworCisgICAgICAgIGZpbmFsIEJvb2sgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KEJvb2suY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBpdGVtISIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpdGVtIHRpdGxlIiwgIlN2ZWprIiwgcmVzcG9uc2UuZ2V0VGl0bGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0h0bWxVc2luZ1dlYktpdEFjY2VwdEhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gaXRlbTFyZXNvdXJjZSgpLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgIiovKjtxPTAuOCIpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEl0ZW1IdG1sUmVzcG9uc2UocmVzcG9uc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEl0ZW1IdG1sUmVzcG9uc2UoZmluYWwgU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICI8dGl0bGU+Qm9vazwvdGl0bGU+Iik7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICI8aDE+U3Zlams8L2gxPiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBXZWJUYXJnZXQgaXRlbTFyZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldCgpLnBhdGgoIi9pdGVtcy8xIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL1Rlc3RTdXBwb3J0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvVGVzdFN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTEyMWVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL1Rlc3RTdXBwb3J0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18zOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgdGVzdCBjYXNlcyB3aGljaCBib290cyB1cCBhIEdsYXNzRmlzaCBzZXJ2ZXIgZm9yIGluIGNvbnRhaW5lciB0ZXN0aW5nIG9mIFJFU1RmdWwgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KKyAqIEBhdXRob3IgTmFyZXNoCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0U3VwcG9ydCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRIdG1sUmVzcG9uc2UoZmluYWwgU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoIk5vIHRleHQgcmV0dXJuZWQhIiwgcmVzcG9uc2UpOworCisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICI8aHRtbD4iKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjwvaHRtbD4iKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKGZpbmFsIFN0cmluZyByZXNwb25zZSwgZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gIiArIHRleHQgKyAiIGJ1dCB3YXM6ICIgKyByZXNwb25zZSwgcmVzcG9uc2UuY29udGFpbnModGV4dCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlkZTg5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1yZWxvYWQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtcmVsb2FkPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LXJlbG9hZCAtIHJlbG9hZCByZXNvdXJjZSB0cmlnZ2VycyBhcHBsaWNhdGlvbiByZWxvYWQ8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvQW5vdGhlclJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvQW5vdGhlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllMjhlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9Bbm90aGVyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfY29uZmlnX3JlbG9hZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJhbm90aGVyIikKK3B1YmxpYyBjbGFzcyBBbm90aGVyUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiQW5vdGhlciByZXNvdXJjZSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9jb25maWdfcmVsb2FkL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9jb25maWdfcmVsb2FkL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZGNiNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9jb25maWdfcmVsb2FkL1JlbG9hZENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvUmVsb2FkQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWVlMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9jb25maWdfcmVsb2FkL1JlbG9hZENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CisKKy8qKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBSZWxvYWRDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyIGNvbnRhaW5lcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cChmaW5hbCBDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIFJlbG9hZENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLnNldENvbnRhaW5lcihjb250YWluZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udGFpbmVyKGZpbmFsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgUmVsb2FkQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9jb25maWdfcmVsb2FkL1JlbG9hZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvUmVsb2FkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmMxYzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9jb25maWdfcmVsb2FkL1JlbG9hZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgicmVsb2FkIikKK3B1YmxpYyBjbGFzcyBSZWxvYWRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlbG9hZENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmdldENvbnRhaW5lcigpLnJlbG9hZCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxvYWRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2FkQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpCisgICAgICAgICAgICApOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIlJlbG9hZCByZXNvdXJjZSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGEwZjljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkplcnNleVJlbG9hZFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9jb25maWdfcmVsb2FkLlJlbG9hZFJlc291cmNlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC5IZWxsb1dvcmxkUmVzb3VyY2UKKyAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQuUmVsb2FkUmVzb3VyY2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9jb25maWdfcmVsb2FkLlJlbG9hZENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KZXJzZXlSZWxvYWRTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvUmVsb2FkVGVzdElULmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvUmVsb2FkVGVzdElULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyMjYxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9SZWxvYWRUZXN0SVQuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfY29uZmlnX3JlbG9hZDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJlbG9hZFRlc3RJVCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhbm90aGVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZWxvYWQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFub3RoZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NTk0OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvcG9tLnhtbApAQCAtMCwwICsxLDY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWFzeW5jPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1hc3luYzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtYXN5bmMgLSBjb25maWd1cmVkIHZpYSBqYXgtcnMgYXBwbGljYXRpb24gYW5ub3RhdGVkIHdpdGggQGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jU2VydmxldFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk2MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jU2VydmxldFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2FzeW5jOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiYXN5bmMiKQorcHVibGljIGNsYXNzIEFzeW5jU2VydmxldFJlc291cmNlIHsKKyAgICAvKioKKyAgICAgKiBIZWxsbyB3b3JsZCBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTExPX0FTWU5DX1dPUkxEID0gIkhlbGxvIEFzeW5jIFdvcmxkISI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOQ0VMRUQgPSAiQ2FuY2VsZWQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQmxvY2tpbmdRdWV1ZTxDYW5jZWxlZFJlcXVlc3Q+IGNhbmNlbGluZ1F1ZXVlID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxDYW5jZWxlZFJlcXVlc3Q+KDUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FuY2VsZWRSZXF1ZXN0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlOworCisgICAgICAgIHByaXZhdGUgQ2FuY2VsZWRSZXF1ZXN0KFN0cmluZyBpZCwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgICAgICB0aGlzLmFzeW5jUmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhc3luYyAiSGVsbG8gV29ybGQiIG1lc3NhZ2UuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHZvaWQgZ2V0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhcikgeworICAgICAgICBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICBhci5yZXN1bWUoSEVMTE9fQVNZTkNfV09STEQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNhbmNlbGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgcmVxdWVzdCBpZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluIGNhc2Ugb2Ygbm90IGJlaW5nIGFibGUgdG8gcHV0IHRoZSByZXF1ZXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbiBpbnRlcm5hbCBxdWV1ZSBmb3IgY2FuY2VsaW5nLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgiY2FuY2VsZWQiKQorICAgIHB1YmxpYyB2b2lkIGdldENhbmNlbGVkKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhciwgQFF1ZXJ5UGFyYW0oImlkIikgZmluYWwgU3RyaW5nIGlkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjYW5jZWxpbmdRdWV1ZS5wdXQobmV3IENhbmNlbGVkUmVxdWVzdChpZCwgYXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYSByZXF1ZXN0IHRoYXQgaXMgb24gdG9wIG9mIHRoZSBjYW5jZWxpbmcgcXVldWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGFib3V0IHN1Y2Nlc3NmdWwgcmVxdWVzdCBjYW5jZWxpbmcuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIG5vdCBiZWluZyBhYmxlIHRvIHRha2UgYSBjYW5jZWxsZWQgcmVxdWVzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhbiBpbnRlcm5hbCBjYW5jZWxpbmcgcXVldWUuCisgICAgICovCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIEBQYXRoKCJjYW5jZWxlZCIpCisgICAgcHVibGljIFN0cmluZyBjYW5jZWwoU3RyaW5nIHJlcXVlc3RJZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2FuY2VsZWRSZXF1ZXN0IGNhbmNlbGVkUmVxdWVzdCA9IGNhbmNlbGluZ1F1ZXVlLnRha2UoKTsKKyAgICAgICAgY2FuY2VsZWRSZXF1ZXN0LmFzeW5jUmVzcG9uc2UuY2FuY2VsKCk7CisKKyAgICAgICAgcmV0dXJuIENBTkNFTEVEICsgIiAiICsgY2FuY2VsZWRSZXF1ZXN0LmlkICsgIiBieSBQT1NUICIgKyByZXF1ZXN0SWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNUaW1lb3V0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1RpbWVvdXRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzAwMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNUaW1lb3V0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5UaW1lb3V0SGFuZGxlcjsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSBmb3IgdGVzdGluZyB7QGxpbmsgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2V9IHRpbWVvdXRzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgidGltZW91dCIpCitwdWJsaWMgY2xhc3MgQXN5bmNUaW1lb3V0UmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmxvY2tpbmdRdWV1ZTxBc3luY1Jlc3BvbnNlPiBxdWV1ZSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4oMSk7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInN1c3BlbmQiKQorICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgcXVldWUuYWRkKGFzeW5jUmVzcG9uc2UpOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoInRpbWVvdXQiKQorICAgIHB1YmxpYyB2b2lkIHNldFRpbWVPdXQoZmluYWwgSW50ZWdlciBtaWxsaXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSA9IHF1ZXVlLnRha2UoKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIHRpbWVvdXQxID0gYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0KG1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0SGFuZGxlcihuZXcgVGltZW91dEhhbmRsZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRpbWVvdXQyID0gYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0KG1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKCJ0aW1lb3V0MT0iICsgdGltZW91dDEgKyAiX3RpbWVvdXQyPSIgKyB0aW1lb3V0MiArICJfaGFuZGxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvU2VydmxldDNBc3luYy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL1NlcnZsZXQzQXN5bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzg3YTFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL1NlcnZsZXQzQXN5bmMuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0M0FzeW5jIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGhhc2hTZXQuYWRkKEFzeW5jU2VydmxldFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgaGFzaFNldC5hZGQoQXN5bmNUaW1lb3V0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gaGFzaFNldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1NlcnZsZXRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZGZiOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNTZXJ2bGV0UmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBc3luY1NlcnZsZXRSZXNvdXJjZUlUQ2FzZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzcG9uc2VSZWNvcmQgeworICAgICAgICBmaW5hbCBpbnQgc3RhdHVzOworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgICBwcml2YXRlIFJlc3BvbnNlUmVjb3JkKGludCBzdGF0dXMsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXMgKyAiIDogXCIiICsgbWVzc2FnZSArICdcIic7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGFzeW5jaHJvbm91cyBzZXJ2bGV0LWRlcGxveWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB3YWl0aW5nIGZvciBhbGwgcmVxdWVzdHMgdG8gY29tcGxldGUgd2FzIGludGVycnVwdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jU2VydmxldCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZVRhcmdldCA9IHRhcmdldCgiYXN5bmMiKTsKKyAgICAgICAgcmVzb3VyY2VUYXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZXNwb25zZSA9IEFzeW5jU2VydmxldFJlc291cmNlLkhFTExPX0FTWU5DX1dPUkxEOworCisgICAgICAgIGZpbmFsIGludCBNQVhfTUVTU0FHRVMgPSA1MDsKKyAgICAgICAgZmluYWwgaW50IExBVENIX1dBSVRfVElNRU9VVCA9IDEwICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpOworICAgICAgICBmaW5hbCBib29sZWFuIGRlYnVnTW9kZSA9IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIHNlcXVlbnRpYWxHZXQgPSBmYWxzZTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHNlcXVlbnRpYWxHZXRMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImFzeW5jLXJlc291cmNlLXRlc3QtJWQiKQorICAgICAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgZmluYWwgTWFwPEludGVnZXIsIFJlc3BvbnNlUmVjb3JkPiBnZXRSZXNwb25zZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SW50ZWdlciwgUmVzcG9uc2VSZWNvcmQ+KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZ2V0UmVxdWVzdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1BWF9NRVNTQUdFUyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdElkID0gaTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbixDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgfHwgc2VxdWVudGlhbEdldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2VxdWVudGlhbEdldExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzb3VyY2VUYXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlcy5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVzcG9uc2VSZWNvcmQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICBpZiAoZGVidWdNb2RlKSB7CisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdExhdGNoLmF3YWl0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgZm9yIGFsbCBHRVQgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIHRpbWVkIG91dC4iLCBnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoTEFUQ0hfV0FJVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBSZXNwb25zZVJlY29yZD4gZ2V0UmVzcG9uc2VFbnRyeSA6IGdldFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoIkdFVCByZXNwb25zZSBmb3IgbWVzc2FnZSAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGdldFJlc3BvbnNlRW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGdldFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgTE9HR0VSLmluZm8obWVzc2FnZUJ1aWxkZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9NRVNTQUdFUywgZ2V0UmVzcG9uc2VzLnNpemUoKSk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIFJlc3BvbnNlUmVjb3JkPiBlbnRyeSA6IGdldFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIEdFVCByZXNwb25zZSBzdGF0dXMgZm9yIHJlcXVlc3QgIiArIGVudHJ5LmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAyMDAsIGVudHJ5LmdldFZhbHVlKCkuc3RhdHVzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgR0VUIHJlc3BvbnNlIG1lc3NhZ2UgZm9yIHJlcXVlc3QgIiArIGVudHJ5LmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFJlc3BvbnNlLCBlbnRyeS5nZXRWYWx1ZSgpLm1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjYW5jZWxpbmcgb2YgYW4gYXN5bmMgcmVxdWVzdCB0byBhIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluIGNhc2UgdGhlIHdhaXRpbmcgZm9yIGFsbCByZXF1ZXN0cyB0byBjb21wbGV0ZSB3YXMgaW50ZXJydXB0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNSZXF1ZXN0Q2FuY2VsaW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gdGFyZ2V0KCJhc3luYy9jYW5jZWxlZCIpOworICAgICAgICByZXNvdXJjZVRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgaW50IE1BWF9NRVNTQUdFUyA9IDEwOworICAgICAgICBmaW5hbCBpbnQgTEFUQ0hfV0FJVF9USU1FT1VUID0gMTAgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVidWdNb2RlID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VxdWVudGlhbEdldCA9IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIHNlcXVlbnRpYWxQb3N0ID0gZmFsc2U7CisgICAgICAgIGZpbmFsIE9iamVjdCBzZXF1ZW50aWFsR2V0TG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHNlcXVlbnRpYWxQb3N0TG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJhc3luYy1jYW5jZWxlZC1yZXNvdXJjZS10ZXN0LSVkIikKKyAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHBvc3RSZXNwb25zZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworICAgICAgICBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBnZXRSZXNwb25zZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHBvc3RSZXF1ZXN0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTUFYX01FU1NBR0VTKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZ2V0UmVxdWVzdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1BWF9NRVNTQUdFUyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdElkID0gaTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbixDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgfHwgc2VxdWVudGlhbEdldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2VxdWVudGlhbEdldExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHJlc291cmNlVGFyZ2V0LnF1ZXJ5UGFyYW0oImlkIiwgcmVxdWVzdElkKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VzLnB1dChyZXF1ZXN0SWQsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBleC5nZXRSZXNwb25zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlcy5wdXQocmVxdWVzdElkLCByZXNwb25zZS5nZXRTdGF0dXMoKSArICI6ICIgKyByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbixDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgfHwgc2VxdWVudGlhbFBvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcXVlbnRpYWxQb3N0TG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgcG9zdCgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVzb3VyY2VUYXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIiIgKyByZXF1ZXN0SWQpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZXNwb25zZXMucHV0KHJlcXVlc3RJZCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSkgeworICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0TGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyBmb3IgYWxsIFBPU1QgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIHRpbWVkIG91dC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlcXVlc3RMYXRjaC5hd2FpdChMQVRDSF9XQUlUX1RJTUVPVVQsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIGZvciBhbGwgR0VUIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIiwgZ2V0UmVxdWVzdExhdGNoLmF3YWl0KExBVENIX1dBSVRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2VCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBwb3N0UmVzcG9uc2VFbnRyeSA6IHBvc3RSZXNwb25zZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgbWVzc2FnZUJ1aWxkZXIuYXBwZW5kKCJQT1NUIHJlc3BvbnNlIGZvciBtZXNzYWdlICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocG9zdFJlc3BvbnNlRW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHBvc3RSZXNwb25zZUVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoJ1xuJyk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIFN0cmluZz4gZ2V0UmVzcG9uc2VFbnRyeSA6IGdldFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoIkdFVCByZXNwb25zZSBmb3IgbWVzc2FnZSAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGdldFJlc3BvbnNlRW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGdldFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIExPR0dFUi5pbmZvKG1lc3NhZ2VCdWlsZGVyLnRvU3RyaW5nKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfTUVTU0FHRVMsIHBvc3RSZXNwb25zZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBwb3N0UmVzcG9uc2VFbnRyeSA6IHBvc3RSZXNwb25zZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBQT1NUIG5vdGlmaWNhdGlvbiByZXNwb25zZSBmb3IgbWVzc2FnZSAiICsgcG9zdFJlc3BvbnNlRW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgIHBvc3RSZXNwb25zZUVudHJ5LmdldFZhbHVlKCkuc3RhcnRzV2l0aChBc3luY1NlcnZsZXRSZXNvdXJjZS5DQU5DRUxFRCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9NRVNTQUdFUywgZ2V0UmVzcG9uc2VzLnNpemUoKSk7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248SW50ZWdlcj4gZ2V0UmVzcG9uc2VLZXlzID0gZ2V0UmVzcG9uc2VzLmtleVNldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9NRVNTQUdFUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJEZXRlY3RlZCBhIEdFVCBtZXNzYWdlIHJlc3BvbnNlIGxvc3M6ICIgKyBpLCBnZXRSZXNwb25zZUtleXMuY29udGFpbnMoaSkpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdldFJlc3BvbnNlRW50cnkgPSBnZXRSZXNwb25zZXMuZ2V0KGkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBjYW5jZWxlZCBHRVQgcmVzcG9uc2Ugc3RhdHVzIGZvciByZXF1ZXN0ICIgKyBpLAorICAgICAgICAgICAgICAgICAgICBnZXRSZXNwb25zZUVudHJ5LnN0YXJ0c1dpdGgoIjUwMzogIikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jVGltZW91dFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNUaW1lb3V0UmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmZiNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jVGltZW91dFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UgZm9yIHRlc3Rpbmcge0BsaW5rIGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlfSB0aW1lb3V0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFzeW5jVGltZW91dFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZVRhcmdldCA9IHRhcmdldCgidGltZW91dCIpOworICAgICAgICByZXNvdXJjZVRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSByZXNvdXJjZVRhcmdldC5wYXRoKCJzdXNwZW5kIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisKKyAgICAgICAgLy8gU2V0IHRpbWVvdXQuCisgICAgICAgIGFzc2VydFRoYXQocmVzb3VyY2VUYXJnZXQucGF0aCgidGltZW91dCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCI1MDAiKSkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjA0KSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgaXQuCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VGdXR1cmUuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJ0aW1lb3V0MT10cnVlX3RpbWVvdXQyPXRydWVfaGFuZGxlZCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2FhNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vcG9tLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWNodW5rZWQtaW88L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWNodW5rZWQtaW88L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLWNodW5rZWQtaW88L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vQXBwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19jaHVua2VkX2lvL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTVjNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19jaHVua2VkX2lvL0FwcC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2NodW5rZWRfaW87CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIENodW5rZWQgSS9PIHRlc3QgSkFYLVJTIGFwcGxpY2F0aW9uIGNsYXNzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoInJlc291cmNlcyIpCitwdWJsaWMgY2xhc3MgQXBwIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgLyoqCisgICAgICogQ2h1bmtlZCBJL08gdGVzdCBKQVgtUlMgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIEFwcCgpIHsKKyAgICAgICAgc3VwZXIoVGVzdFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICByZWdpc3RlcihjcmVhdGVNb3h5SnNvblJlc29sdmVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBNT1h5IEpTT04gY29uZmlnIGNvbnRleHQgcmVzb2x2ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldyBNT1h5IEpTT04gY29uZmlnIGNvbnRleHQgcmVzb2x2ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250ZXh0UmVzb2x2ZXI8TW94eUpzb25Db25maWc+IGNyZWF0ZU1veHlKc29uUmVzb2x2ZXIoKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZXNwYWNlUHJlZml4TWFwcGVyID0gbmV3IEhhc2hNYXA8PigxKTsKKyAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwcGVyLnB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7CisKKyAgICAgICAgcmV0dXJuIG5ldyBNb3h5SnNvbkNvbmZpZygpCisgICAgICAgICAgICAgICAgLnNldE5hbWVzcGFjZVByZWZpeE1hcHBlcihuYW1lc3BhY2VQcmVmaXhNYXBwZXIpCisgICAgICAgICAgICAgICAgLnNldE5hbWVzcGFjZVNlcGFyYXRvcignOicpCisgICAgICAgICAgICAgICAgLnJlc29sdmVyKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19jaHVua2VkX2lvL01lc3NhZ2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjMzMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19jaHVua2VkX2lvL01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19jaHVua2VkX2lvOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogTWVzc2FnZSBQT0pPLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIE1lc3NhZ2UgeworCisgICAgLyoqCisgICAgICogTWVzc2FnZSBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGlkOworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRhdGE7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UoKSB7CisgICAgICAgIHRoaXMuaWQgPSAtMTsKKyAgICAgICAgdGhpcy5kYXRhID0gIiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBpZCBtZXNzYWdlIGlkLgorICAgICAqIEBwYXJhbSBkYXRhIG1lc3NhZ2UgY29udGVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZShpbnQgaWQsIFN0cmluZyBkYXRhKSB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1lc3NhZ2UgZGF0YSBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgbzsKKworICAgICAgICBpZiAoaWQgIT0gbWVzc2FnZS5pZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghZGF0YS5lcXVhbHMobWVzc2FnZS5kYXRhKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IGlkOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGRhdGEuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIntcImlkXCI6IiArIGlkICsgIixcImRhdGFcIjpcIiIgKyBkYXRhICsgIlwifSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfY2h1bmtlZF9pby9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vVGVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2OWE5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vVGVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2NodW5rZWRfaW87CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi90ZXN0IikKK3B1YmxpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoVGVzdFJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgY2h1bmsgc3RyZWFtIG9mIEpTT04gZGF0YSAtIGZyb20gSlNPTiBQT0pPcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY2h1bmsgc3RyZWFtLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgQFBhdGgoImZyb20tcG9qbyIpCisgICAgcHVibGljIENodW5rZWRPdXRwdXQ8TWVzc2FnZT4gZ2V0RnJvbVBvam8oKSB7CisgICAgICAgIGZpbmFsIENodW5rZWRPdXRwdXQ8TWVzc2FnZT4gb3V0cHV0ID0gbmV3IENodW5rZWRPdXRwdXQ8PihNZXNzYWdlLmNsYXNzLCAiXHJcbiIpOworCisgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKG5ldyBNZXNzYWdlKGksICJ0ZXN0IikpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiRXJyb3Igd3JpdGluZyBjaHVuay4iLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiU2xlZXAgaW50ZXJydXB0ZWQuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJFcnJvciBjbG9zaW5nIGNodW5rZWQgb3V0cHV0LiIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY2h1bmsgc3RyZWFtIG9mIEpTT04gZGF0YSAtIGZyb20gc3RyaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBjaHVuayBzdHJlYW0uCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAUGF0aCgiZnJvbS1zdHJpbmciKQorICAgIHB1YmxpYyBDaHVua2VkT3V0cHV0PFN0cmluZz4gZ2V0RnJvbVRleHQoKSB7CisgICAgICAgIGZpbmFsIENodW5rZWRPdXRwdXQ8U3RyaW5nPiBvdXRwdXQgPSBuZXcgQ2h1bmtlZE91dHB1dDw+KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUobmV3IE1lc3NhZ2UoaSwgInRlc3QiKS50b1N0cmluZygpICsgIlxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIkVycm9yIHdyaXRpbmcgY2h1bmsuIiwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlNsZWVwIGludGVycnVwdGVkLiIsIGUpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiRXJyb3IgY2xvc2luZyBjaHVua2VkIG91dHB1dC4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5zdGFydCgpOworCisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0I2Nsb3NlKCl9IGlzIGNhbGxlZCBiZWZvcmUgbWV0aG9kIHJldHVybnMgaXQncyBlbnRpdHkuIFJlc291cmNlIHJlcHJvZHVjZXMKKyAgICAgKiBKRVJTRVktMjU1OCBpc3N1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gKGNsb3NlZCkgY2h1bmsgc3RyZWFtLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgQFBhdGgoImNsb3NlLWJlZm9yZS1yZXR1cm4iKQorICAgIHB1YmxpYyBDaHVua2VkT3V0cHV0PE1lc3NhZ2U+IGNsb3NlQmVmb3JlUmV0dXJuKCkgeworICAgICAgICBmaW5hbCBDaHVua2VkT3V0cHV0PE1lc3NhZ2U+IG91dHB1dCA9IG5ldyBDaHVua2VkT3V0cHV0PD4oTWVzc2FnZS5jbGFzcywgIlxyXG4iKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUobmV3IE1lc3NhZ2UoaSwgInRlc3QiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJFcnJvciB3cml0aW5nIGNodW5rLiIsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJTbGVlcCBpbnRlcnJ1cHRlZC4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXb3JrZXIgdGhyZWFkIGNhbiBjb250aW51ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJFcnJvciBjbG9zaW5nIGNodW5rZWQgb3V0cHV0LiIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFdhaXQgdGlsbCBuZXcgdGhyZWFkIGNsb3NlcyB0aGUgY2h1bmtlZCBvdXRwdXQuCisgICAgICAgICAgICBsYXRjaC5hd2FpdCgpOworICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNvbWJpbmF0aW9uIG9mIEFzeW5jUmVzcG9uc2UgYW5kIENodW5rZWRPdXRwdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgYXN5bmMgcmVzcG9uc2UuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAUGF0aCgiY2h1bmtlZC1hc3luYyIpCisgICAgcHVibGljIHZvaWQgY2xvc2VCZWZvcmVSZXR1cm5Bc3luYyhAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgLy8gU2V0IHRpbWVvdXQgdG8gYWJsZSB0byByZXN1bWUgYnV0IG5vdCBzZW5kIHRoZSBjaHVua3MgKHNldHRpbmcgdGhlIENodW5rZWRPdXRwdXQgc2hvdWxkIHJlbW92ZSB0aGUgdGltZW91dCkuCisgICAgICAgIHJlc3BvbnNlLnNldFRpbWVvdXQoMTUwMCwgVGltZVVuaXQuU0VDT05EUyk7CisKKyAgICAgICAgbmV3IFRocmVhZCgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2h1bmtlZE91dHB1dDxNZXNzYWdlPiBvdXRwdXQgPSBuZXcgQ2h1bmtlZE91dHB1dDw+KE1lc3NhZ2UuY2xhc3MsICJcclxuIik7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIG1ldGhvZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lLgorICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bWUob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgcmVzdW1lIHRvIGNvbXBsZXRlLgorICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisKKyAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZCgpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShuZXcgTWVzc2FnZShpLCAidGVzdCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIkVycm9yIHdyaXRpbmcgY2h1bmsuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlNsZWVwIGludGVycnVwdGVkLiIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiRXJyb3IgY2xvc2luZyBjaHVua2VkIG91dHB1dC4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfS5zdGFydCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJTbGVlcCBpbnRlcnJ1cHRlZC4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19jaHVua2VkX2lvL0NodW5rZWRJbnB1dE91dHB1dElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfY2h1bmtlZF9pby9DaHVua2VkSW5wdXRPdXRwdXRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQ1N2FmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfY2h1bmtlZF9pby9DaHVua2VkSW5wdXRPdXRwdXRJVENhc2UuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfY2h1bmtlZF9pbzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2h1bmtlZElucHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBDaHVua2VkIEkvTyBpbnRlZ3JhdGlvbiB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2h1bmtlZElucHV0T3V0cHV0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xJU1RFTkVSUyA9IDU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoQXBwLmNyZWF0ZU1veHlKc29uUmVzb2x2ZXIoKSk7CisKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VULCAxNTAwMCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDUwMDApCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQVNZTkNfVEhSRUFEUE9PTF9TSVpFLCBNQVhfTElTVEVORVJTICsgMSkKKyAgICAgICAgICAgICAgICAuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYmFzZVVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBleHRlcm5hbEZhY3RvcnlJblVzZSA9IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgaW5zdGFuY2VvZiBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworICAgICAgICByZXR1cm4gZXh0ZXJuYWxGYWN0b3J5SW5Vc2UgPyBiYXNlVXJpQnVpbGRlci5wYXRoKCJyZXNvdXJjZXMiKS5idWlsZCgpIDogYmFzZVVyaUJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJldHJpZXZpbmcgc3RyaW5nLWJhc2VkIGNodW5rZWQgc3RyZWFtIGFzIGEgc2luZ2xlIHJlc3BvbnNlIHN0cmluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZE91dHB1dFRvU2luZ2xlU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvZnJvbS1zdHJpbmciKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB2YWx1ZSBvZiBjaHVua2VkIHJlc3BvbnNlIHVubWFyc2hhbGxlZCBhcyBhIHNpbmdsZSBzdHJpbmcuIiwKKyAgICAgICAgICAgICAgICAie1wiaWRcIjowLFwiZGF0YVwiOlwidGVzdFwifVxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICArICJ7XCJpZFwiOjEsXCJkYXRhXCI6XCJ0ZXN0XCJ9XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIntcImlkXCI6MixcImRhdGFcIjpcInRlc3RcIn1cclxuIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZXRyaWV2aW5nIHN0cmluZy1iYXNlZCBjaHVua2VkIHN0cmVhbSBzZXF1ZW50aWFsbHkgYXMgaW5kaXZpZHVhbCBjaHVua3MgdXNpbmcgY2h1bmtlZCBpbnB1dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZE91dHB1dFRvQ2h1bmtJbnB1dEZyb21TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtlZElucHV0PE1lc3NhZ2U+IGlucHV0ID0gdGFyZ2V0KCkucGF0aCgidGVzdC9mcm9tLXN0cmluZyIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkKKyAgICAgICAgICAgICAgICAuZ2V0KG5ldyBHZW5lcmljVHlwZTxDaHVua2VkSW5wdXQ8TWVzc2FnZT4+KCkgeworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGludCBjb3VudGVyID0gMDsKKyAgICAgICAgTWVzc2FnZSBjaHVuazsKKyAgICAgICAgd2hpbGUgKChjaHVuayA9IGlucHV0LnJlYWQoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHZhbHVlIG9mIGNodW5rICIgKyBjb3VudGVyLCBuZXcgTWVzc2FnZShjb3VudGVyLCAidGVzdCIpLCBjaHVuayk7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVkIG9mIHJlY2VpdmVkIGNodW5rcy4iLCAzLCBjb3VudGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJldHJpZXZpbmcgUE9KTy1iYXNlZCBjaHVua2VkIHN0cmVhbSBzZXF1ZW50aWFsbHkgYXMgaW5kaXZpZHVhbCBjaHVua3MgdXNpbmcgY2h1bmtlZCBpbnB1dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZE91dHB1dFRvQ2h1bmtJbnB1dEZyb21Qb2pvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENodW5rZWRJbnB1dDxNZXNzYWdlPiBpbnB1dCA9IHRhcmdldCgpLnBhdGgoInRlc3QvZnJvbS1wb2pvIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKQorICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlPENodW5rZWRJbnB1dDxNZXNzYWdlPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBNZXNzYWdlIGNodW5rOworICAgICAgICB3aGlsZSAoKGNodW5rID0gaW5wdXQucmVhZCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdmFsdWUgb2YgY2h1bmsgIiArIGNvdW50ZXIsIG5ldyBNZXNzYWdlKGNvdW50ZXIsICJ0ZXN0IiksIGNodW5rKTsKKyAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZWQgb2YgcmVjZWl2ZWQgY2h1bmtzLiIsIDMsIGNvdW50ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29tYmluYXRpb24gb2YgQXN5bmNSZXNwb25zZSBhbmQgQ2h1bmtlZE91dHB1dC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNodW5rZWRPdXRwdXRXaXRoQXN5bmNSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua2VkSW5wdXQ8TWVzc2FnZT4gaW5wdXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2NodW5rZWQtYXN5bmMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8Q2h1bmtlZElucHV0PE1lc3NhZ2U+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgIE1lc3NhZ2UgY2h1bms7CisgICAgICAgIHdoaWxlICgoY2h1bmsgPSBpbnB1dC5yZWFkKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB2YWx1ZSBvZiBjaHVuayAiICsgY291bnRlciwgbmV3IE1lc3NhZ2UoY291bnRlciwgInRlc3QiKSwgY2h1bmspOworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlZCBvZiByZWNlaXZlZCBjaHVua3MuIiwgMywgY291bnRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI1NTguIENoZWNraW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgcHJvcGVybHkgY2xvc2VkIGV2ZW4gd2hlbiB0aGUKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQjY2xvc2UoKX0gaXMgY2FsbGVkIGJlZm9yZSB0aGUgcmVzcG9uc2UgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBydW50aW1lLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hlY2tDb25uZWN0aW9uSXNDbG9zZWRVcmxDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJ0ZXN0L2Nsb3NlLWJlZm9yZS1yZXR1cm4iKS5idWlsZCgpOworICAgICAgICBmaW5hbCBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB1cmkudG9VUkwoKS5vcGVuQ29ubmVjdGlvbigpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0Q29ubmVjdFRpbWVvdXQoMTUwMDApOworICAgICAgICBjb25uZWN0aW9uLnNldFJlYWRUaW1lb3V0KDE1MDAwKTsKKyAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCk7CisKKyAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpKTsKKworICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHZhbHVlIG9mIGNodW5rICIgKyBjb3VudGVyLCBuZXcgTWVzc2FnZShjb3VudGVyLCAidGVzdCIpLnRvU3RyaW5nKCksIGxpbmUpOworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlZCBvZiByZWNlaXZlZCBjaHVua3MuIiwgMywgY291bnRlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWZpbHRlci9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWZpbHRlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmU0MjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZmlsdGVyL3BvbS54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMy1maWx0ZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWZpbHRlcjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtZmlsdGVyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2ZpbHRlci9NeVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2ZpbHRlci9NeVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzYzNhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfZmlsdGVyL015UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19maWx0ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJteXJlc291cmNlIikKK3B1YmxpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIk9LIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZmlsdGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZmlsdGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjZjRlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPkplcnNleSBXZWIgQXBwbGljYXRpb248L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19maWx0ZXI8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vbXlhcHAvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfZmlsdGVyL015UmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfZmlsdGVyL015UmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjZhYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19maWx0ZXIvTXlSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2ZpbHRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNeVJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByZXR1cm4gcmMucGFja2FnZXMoTXlSZXNvdXJjZUlUQ2FzZS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE15UmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJteWFwcCIpLnBhdGgoIm15cmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FkbCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJteWFwcC9hcHBsaWNhdGlvbi53YWRsIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLnN0YXJ0c1dpdGgoIjw/eG1sIHZlcnNpb249XCIxLjBcIiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTM5MzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvcG9tLnhtbApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWdmLWFzeW5jPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1nZi1hc3luYzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IChHRikgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1nZi1hc3luYyAtIGNvbmZpZ3VyZWQgdmlhIGpheC1ycyBhcHBsaWNhdGlvbiBhbm5vdGF0ZWQgd2l0aCBAamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jQ2FuY2VsVGltZW91dFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjdmODU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jQ2FuY2VsVGltZW91dFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuVGltZW91dEhhbmRsZXI7CisKKy8qKgorICogQXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UgZm9yIHRlc3Rpbmcge0BsaW5rIGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlfSB0aW1lb3V0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoImNhbmNlbC10aW1lb3V0IikKK3B1YmxpYyBjbGFzcyBBc3luY0NhbmNlbFRpbWVvdXRSZXNvdXJjZSB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+W10gc3RhZ2VzID0gbmV3IEJsb2NraW5nUXVldWVbXXsKKyAgICAgICAgICAgIG5ldyBBcnJheUJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4oMSksCisgICAgICAgICAgICBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+KDEpCisgICAgfTsKKworICAgIEBHRVQKKyAgICBAUGF0aCgic3VzcGVuZCIpCisgICAgcHVibGljIHZvaWQgc3VzcGVuZChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBzdGFnZXNbMF0uYWRkKGFzeW5jUmVzcG9uc2UpOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoInRpbWVvdXQiKQorICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgU3RyaW5nIHN0YWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luYyA9IHN0YWdlc1tJbnRlZ2VyLnBhcnNlSW50KHN0YWdlKV0udGFrZSgpOworCisgICAgICAgIGFzeW5jLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChmaW5hbCBBc3luY1Jlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuY2FuY2VsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBhc3luYy5zZXRUaW1lb3V0KDIwMEwsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisKKyAgICAgICAgc3RhZ2VzW0ludGVnZXIucGFyc2VJbnQoc3RhZ2UpICsgMV0uYWRkKGFzeW5jKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNSZXN1bWVUaW1lb3V0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1Jlc3VtZVRpbWVvdXRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YWQyZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNSZXN1bWVUaW1lb3V0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5UaW1lb3V0SGFuZGxlcjsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSBmb3IgdGVzdGluZyB7QGxpbmsgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2V9IHRpbWVvdXRzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgicmVzdW1lLXRpbWVvdXQiKQorcHVibGljIGNsYXNzIEFzeW5jUmVzdW1lVGltZW91dFJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4gcXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPD4oMSk7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInN1c3BlbmQiKQorICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgcXVldWUuYWRkKGFzeW5jUmVzcG9uc2UpOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoInRpbWVvdXQiKQorICAgIHB1YmxpYyB2b2lkIHNldFRpbWVPdXQoZmluYWwgSW50ZWdlciBtaWxsaXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSA9IHF1ZXVlLnRha2UoKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIHRpbWVvdXQxID0gYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0KG1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0SGFuZGxlcihuZXcgVGltZW91dEhhbmRsZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRpbWVvdXQyID0gYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0KG1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKCJ0aW1lb3V0MT0iICsgdGltZW91dDEgKyAiX3RpbWVvdXQyPSIgKyB0aW1lb3V0MiArICJfaGFuZGxlZCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1NlcnZsZXRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jU2VydmxldFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkNDVlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1NlcnZsZXRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CisKKy8qKgorICogQXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImFzeW5jIikKK3B1YmxpYyBjbGFzcyBBc3luY1NlcnZsZXRSZXNvdXJjZSB7CisgICAgLyoqCisgICAgICogSGVsbG8gd29ybGQgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUxMT19BU1lOQ19XT1JMRCA9ICJIZWxsbyBBc3luYyBXb3JsZCEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTkNFTEVEID0gIkNhbmNlbGVkIjsKKworICAgIHByaXZhdGUgc3RhdGljIEJsb2NraW5nUXVldWU8Q2FuY2VsZWRSZXF1ZXN0PiBjYW5jZWxpbmdRdWV1ZSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8Q2FuY2VsZWRSZXF1ZXN0Pig1KTsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhbmNlbGVkUmVxdWVzdCB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkOworICAgICAgICBwcml2YXRlIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZTsKKworICAgICAgICBwcml2YXRlIENhbmNlbGVkUmVxdWVzdChmaW5hbCBTdHJpbmcgaWQsIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgdGhpcy5hc3luY1Jlc3BvbnNlID0gYXN5bmNSZXNwb25zZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXN5bmMgIkhlbGxvIFdvcmxkIiBtZXNzYWdlLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyB2b2lkIGdldChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXIpIHsKKyAgICAgICAgRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXIucmVzdW1lKEhFTExPX0FTWU5DX1dPUkxEKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjYW5jZWxlZCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGlkIHJlcXVlc3QgaWQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIG5vdCBiZWluZyBhYmxlIHRvIHB1dCB0aGUgcmVxdWVzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYW4gaW50ZXJuYWwgcXVldWUgZm9yIGNhbmNlbGluZy4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoImNhbmNlbGVkIikKKyAgICBwdWJsaWMgdm9pZCBnZXRDYW5jZWxlZChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXIsIEBRdWVyeVBhcmFtKCJpZCIpIGZpbmFsIFN0cmluZyBpZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgY2FuY2VsaW5nUXVldWUucHV0KG5ldyBDYW5jZWxlZFJlcXVlc3QoaWQsIGFyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuY2VsIGEgcmVxdWVzdCB0aGF0IGlzIG9uIHRvcCBvZiB0aGUgY2FuY2VsaW5nIHF1ZXVlLgorICAgICAqCisgICAgICogQHJldHVybiBub3RpZmljYXRpb24gbWVzc2FnZSBhYm91dCBzdWNjZXNzZnVsIHJlcXVlc3QgY2FuY2VsaW5nLgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaW4gY2FzZSBvZiBub3QgYmVpbmcgYWJsZSB0byB0YWtlIGEgY2FuY2VsbGVkIHJlcXVlc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYW4gaW50ZXJuYWwgY2FuY2VsaW5nIHF1ZXVlLgorICAgICAqLworICAgIEBQT1NUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBAUGF0aCgiY2FuY2VsZWQiKQorICAgIHB1YmxpYyBTdHJpbmcgY2FuY2VsKGZpbmFsIFN0cmluZyByZXF1ZXN0SWQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENhbmNlbGVkUmVxdWVzdCBjYW5jZWxlZFJlcXVlc3QgPSBjYW5jZWxpbmdRdWV1ZS50YWtlKCk7CisgICAgICAgIGNhbmNlbGVkUmVxdWVzdC5hc3luY1Jlc3BvbnNlLmNhbmNlbCgpOworCisgICAgICAgIHJldHVybiBDQU5DRUxFRCArICIgIiArIGNhbmNlbGVkUmVxdWVzdC5pZCArICIgYnkgUE9TVCAiICsgcmVxdWVzdElkOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL1NlcnZsZXQzQXN5bmMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9TZXJ2bGV0M0FzeW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiZTQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9TZXJ2bGV0M0FzeW5jLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU2VydmxldDNBc3luYyBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gaGFzaFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgaGFzaFNldC5hZGQoQXN5bmNTZXJ2bGV0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBoYXNoU2V0LmFkZChBc3luY1Jlc3VtZVRpbWVvdXRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGhhc2hTZXQuYWRkKEFzeW5jQ2FuY2VsVGltZW91dFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jQ2FuY2VsVGltZW91dFJlc291cmNlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jQ2FuY2VsVGltZW91dFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzUzMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5TZXJ2bGV0RGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UgZm9yIHRlc3Rpbmcge0BsaW5rIGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlfSB0aW1lb3V0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFzeW5jQ2FuY2VsVGltZW91dFJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIEFzeW5jQ2FuY2VsVGltZW91dFJlc291cmNlVGVzdCgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKG5ldyBBcHBsaWNhdGlvbigpKQorICAgICAgICAgICAgICAgIC5jb250ZXh0UGF0aCgic2VydmxldC0zLWdmLWFzeW5jIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gdGFyZ2V0KCJjYW5jZWwtdGltZW91dCIpOworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHN1c3BlbmQgPSByZXNvdXJjZVRhcmdldC5wYXRoKCJzdXNwZW5kIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gdGltZW91dCA9IHJlc291cmNlVGFyZ2V0LnBhdGgoInRpbWVvdXQiKS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KEVudGl0eS50ZXh0KDApKTsKKworICAgICAgICBhc3NlcnRUaGF0KHRpbWVvdXQuZ2V0KCkuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5OT19DT05URU5ULmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICBhc3NlcnRUaGF0KHN1c3BlbmQuZ2V0KCkuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFLmdldFN0YXR1c0NvZGUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1Jlc3VtZVRpbWVvdXRSZXNvdXJjZVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1Jlc3VtZVRpbWVvdXRSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDA5NzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jUmVzdW1lVGltZW91dFJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2FzeW5jOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuU2VydmxldERlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UgZm9yIHRlc3Rpbmcge0BsaW5rIGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlfSB0aW1lb3V0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFzeW5jUmVzdW1lVGltZW91dFJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIEFzeW5jUmVzdW1lVGltZW91dFJlc291cmNlVGVzdCgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKG5ldyBBcHBsaWNhdGlvbigpKQorICAgICAgICAgICAgICAgIC5jb250ZXh0UGF0aCgic2VydmxldC0zLWdmLWFzeW5jIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gdGFyZ2V0KCJyZXN1bWUtdGltZW91dCIpOworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gcmVzb3VyY2VUYXJnZXQucGF0aCgic3VzcGVuZCIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpOworCisgICAgICAgIC8vIFNldCB0aW1lb3V0LgorICAgICAgICBhc3NlcnRUaGF0KHJlc291cmNlVGFyZ2V0LnBhdGgoInRpbWVvdXQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiNTAwIikpLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwNCkpOworCisgICAgICAgIC8vIFdhaXQgZm9yIGl0LgorICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlRnV0dXJlLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygidGltZW91dDE9dHJ1ZV90aW1lb3V0Mj10cnVlX2hhbmRsZWQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jU2VydmxldFJlc291cmNlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jU2VydmxldFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWMxOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2FzeW5jOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5KZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuU2VydmxldERlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNTZXJ2bGV0UmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBc3luY1NlcnZsZXRSZXNvdXJjZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlc3BvbnNlUmVjb3JkIHsKKworICAgICAgICBmaW5hbCBpbnQgc3RhdHVzOworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgICBwcml2YXRlIFJlc3BvbnNlUmVjb3JkKGZpbmFsIGludCBzdGF0dXMsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXMgKyAiIDogXCIiICsgbWVzc2FnZSArICdcIic7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKG5ldyBBcHBsaWNhdGlvbigpKQorICAgICAgICAgICAgICAgIC5jb250ZXh0UGF0aCgic2VydmxldC0zLWdmLWFzeW5jIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluIGNhc2UgdGhlIHdhaXRpbmcgZm9yIGFsbCByZXF1ZXN0cyB0byBjb21wbGV0ZSB3YXMgaW50ZXJydXB0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNTZXJ2bGV0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gdGFyZ2V0KCJhc3luYyIpOworICAgICAgICByZXNvdXJjZVRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc3BvbnNlID0gQXN5bmNTZXJ2bGV0UmVzb3VyY2UuSEVMTE9fQVNZTkNfV09STEQ7CisKKyAgICAgICAgZmluYWwgaW50IE1BWF9NRVNTQUdFUyA9IDUwOworICAgICAgICBmaW5hbCBpbnQgTEFUQ0hfV0FJVF9USU1FT1VUID0gMTA7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVidWdNb2RlID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VxdWVudGlhbEdldCA9IGZhbHNlOworICAgICAgICBmaW5hbCBPYmplY3Qgc2VxdWVudGlhbEdldExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiYXN5bmMtcmVzb3VyY2UtdGVzdC0lZCIpCisgICAgICAgICAgICAgICAgLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihuZXcgSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBmaW5hbCBNYXA8SW50ZWdlciwgUmVzcG9uc2VSZWNvcmQ+IGdldFJlc3BvbnNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZ2V0UmVxdWVzdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1BWF9NRVNTQUdFUyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdElkID0gaTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbixDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgfHwgc2VxdWVudGlhbEdldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2VxdWVudGlhbEdldExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzb3VyY2VUYXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlcy5wdXQocmVxdWVzdElkLCBuZXcgUmVzcG9uc2VSZWNvcmQocmVzcG9uc2UuZ2V0U3RhdHVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSkgeworICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5hd2FpdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIGZvciBhbGwgR0VUIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5hd2FpdChMQVRDSF9XQUlUX1RJTUVPVVQgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1lc3NhZ2VCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgUmVzcG9uc2VSZWNvcmQ+IGdldFJlc3BvbnNlRW50cnkgOiBnZXRSZXNwb25zZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgbWVzc2FnZUJ1aWxkZXIuYXBwZW5kKCJHRVQgcmVzcG9uc2UgZm9yIG1lc3NhZ2UgIikuYXBwZW5kKGdldFJlc3BvbnNlRW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGdldFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgTE9HR0VSLmluZm8obWVzc2FnZUJ1aWxkZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9NRVNTQUdFUywgZ2V0UmVzcG9uc2VzLnNpemUoKSk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEludGVnZXIsIFJlc3BvbnNlUmVjb3JkPiBlbnRyeSA6IGdldFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgR0VUIHJlc3BvbnNlIHN0YXR1cyBmb3IgcmVxdWVzdCAiICsgZW50cnkuZ2V0S2V5KCksIDIwMCwgZW50cnkuZ2V0VmFsdWUoKS5zdGF0dXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIEdFVCByZXNwb25zZSBtZXNzYWdlIGZvciByZXF1ZXN0ICIgKyBlbnRyeS5nZXRLZXkoKSwgZXhwZWN0ZWRSZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKS5tZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY2FuY2VsaW5nIG9mIGFuIGFzeW5jIHJlcXVlc3QgdG8gYSBzZXJ2bGV0LWRlcGxveWVkIHJlc291cmNlLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB3YWl0aW5nIGZvciBhbGwgcmVxdWVzdHMgdG8gY29tcGxldGUgd2FzIGludGVycnVwdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUmVxdWVzdENhbmNlbGluZygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZVRhcmdldCA9IHRhcmdldCgiYXN5bmMvY2FuY2VsZWQiKTsKKyAgICAgICAgcmVzb3VyY2VUYXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGZpbmFsIGludCBNQVhfTUVTU0FHRVMgPSAxMDsKKyAgICAgICAgZmluYWwgaW50IExBVENIX1dBSVRfVElNRU9VVCA9IDEwOworICAgICAgICBmaW5hbCBib29sZWFuIGRlYnVnTW9kZSA9IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIHNlcXVlbnRpYWxHZXQgPSBmYWxzZTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZXF1ZW50aWFsUG9zdCA9IGZhbHNlOworICAgICAgICBmaW5hbCBPYmplY3Qgc2VxdWVudGlhbEdldExvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIGZpbmFsIE9iamVjdCBzZXF1ZW50aWFsUG9zdExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiYXN5bmMtY2FuY2VsZWQtcmVzb3VyY2UtdGVzdC0lZCIpCisgICAgICAgICAgICAgICAgLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihuZXcgSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBwb3N0UmVzcG9uc2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgICAgICAgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gZ2V0UmVzcG9uc2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBwb3N0UmVxdWVzdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1BWF9NRVNTQUdFUyk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGdldFJlcXVlc3RMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNQVhfTUVTU0FHRVMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9NRVNTQUdFUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IGk7CisgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24sQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdNb2RlIHx8IHNlcXVlbnRpYWxHZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcXVlbnRpYWxHZXRMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgZ2V0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSByZXNvdXJjZVRhcmdldC5xdWVyeVBhcmFtKCJpZCIsIHJlcXVlc3RJZCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlcy5wdXQocmVxdWVzdElkLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gZXguZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNwb25zZXMucHV0KHJlcXVlc3RJZCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgKyAiOiAiICsgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gUG9pbnRsZXNzQm9vbGVhbkV4cHJlc3Npb24sQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdNb2RlIHx8IHNlcXVlbnRpYWxQb3N0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzZXF1ZW50aWFsUG9zdExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHBvc3QoKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHJlc291cmNlVGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCIiICsgcmVxdWVzdElkKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UmVzcG9uc2VzLnB1dChyZXF1ZXN0SWQsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlcXVlc3RMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUpIHsKKyAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdExhdGNoLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdExhdGNoLmF3YWl0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgZm9yIGFsbCBQT1NUIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0TGF0Y2guYXdhaXQoTEFUQ0hfV0FJVF9USU1FT1VUICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyBmb3IgYWxsIEdFVCByZXF1ZXN0cyB0byBjb21wbGV0ZSBoYXMgdGltZWQgb3V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoTEFUQ0hfV0FJVF9USU1FT1VUICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtZXNzYWdlQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEludGVnZXIsIFN0cmluZz4gcG9zdFJlc3BvbnNlRW50cnkgOiBwb3N0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgiUE9TVCByZXNwb25zZSBmb3IgbWVzc2FnZSAiKS5hcHBlbmQocG9zdFJlc3BvbnNlRW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiOiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHBvc3RSZXNwb25zZUVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoJ1xuJyk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEludGVnZXIsIFN0cmluZz4gZ2V0UmVzcG9uc2VFbnRyeSA6IGdldFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoIkdFVCByZXNwb25zZSBmb3IgbWVzc2FnZSAiKS5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRWYWx1ZSgpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgTE9HR0VSLmluZm8obWVzc2FnZUJ1aWxkZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9NRVNTQUdFUywgcG9zdFJlc3BvbnNlcy5zaXplKCkpOworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IHBvc3RSZXNwb25zZUVudHJ5IDogcG9zdFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIFBPU1Qgbm90aWZpY2F0aW9uIHJlc3BvbnNlIGZvciBtZXNzYWdlICIgKyBwb3N0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgcG9zdFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKS5zdGFydHNXaXRoKEFzeW5jU2VydmxldFJlc291cmNlLkNBTkNFTEVEKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX01FU1NBR0VTLCBnZXRSZXNwb25zZXMuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxJbnRlZ2VyPiBnZXRSZXNwb25zZUtleXMgPSBnZXRSZXNwb25zZXMua2V5U2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkRldGVjdGVkIGEgR0VUIG1lc3NhZ2UgcmVzcG9uc2UgbG9zczogIiArIGksIGdldFJlc3BvbnNlS2V5cy5jb250YWlucyhpKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0UmVzcG9uc2VFbnRyeSA9IGdldFJlc3BvbnNlcy5nZXQoaSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGNhbmNlbGVkIEdFVCByZXNwb25zZSBzdGF0dXMgZm9yIHJlcXVlc3QgIiArIGksIGdldFJlc3BvbnNlRW50cnkuc3RhcnRzV2l0aCgiNTAzOiAiKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5mbGVjdG9yLTEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbmZsZWN0b3ItMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMmVjMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5mbGVjdG9yLTEvcG9tLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWluZmxlY3Rvci0xPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1pbmZsZWN0b3ItMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgU2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLWluZmxlY3Rvci0xIC0gQ2hlY2sgdGhhdCBpbmZsZWN0b3JzIGluIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlZCByZXNvdXJjZXMgYXJlCisgICAgICAgIHByb3Blcmx5IGluamVjdGVkLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luZmxlY3Rvcl8xL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbmZsZWN0b3ItMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbmZsZWN0b3JfMS9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3YTc5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbmZsZWN0b3ItMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbmZsZWN0b3JfMS9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5mbGVjdG9yXzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigicmVzb3VyY2UiKTsKKworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkQ2hpbGRSZXNvdXJjZSgiY2xhc3MiKQorICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShNeUluZmxlY3Rvci5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRDaGlsZFJlc291cmNlKCJpbnN0YW5jZSIpCisgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiR0VUIikKKyAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KG5ldyBNeUluZmxlY3RvcigpKTsKKworICAgICAgICByZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luZmxlY3Rvcl8xL015SW5mbGVjdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5mbGVjdG9yLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5mbGVjdG9yXzEvTXlJbmZsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzE1YTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luZmxlY3Rvcl8xL015SW5mbGVjdG9yLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5mbGVjdG9yXzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE15SW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4geworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXF1ZXN0UHJvdmlkZXI7CisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8SHR0cFNlcnZsZXRSZXNwb25zZT4gcmVzcG9uc2VQcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIC8vIFJlcXVlc3QgcHJvdmlkZXIgJiByZXF1ZXN0LgorICAgICAgICBpZiAocmVxdWVzdFByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJyZXF1ZXN0UHJvdmlkZXJfIik7CisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZChyZXF1ZXN0UHJvdmlkZXIuZ2V0KCkgIT0gbnVsbCA/ICJyZXF1ZXN0IiA6IG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIm51bGxfbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoJ18nKTsKKworICAgICAgICAvLyBSZXNwb25zZSBwcm92aWRlciAmIHJlc3BvbnNlLgorICAgICAgICBpZiAocmVzcG9uc2VQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgicmVzcG9uc2VQcm92aWRlcl8iKTsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHJlc3BvbnNlUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbCA/ICJyZXNwb25zZSIgOiBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJudWxsX251bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luZmxlY3Rvcl8xL0luZmxlY3RvckluamVjdGlvblRlc3RJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbmZsZWN0b3ItMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbmZsZWN0b3JfMS9JbmZsZWN0b3JJbmplY3Rpb25UZXN0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmZjM3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbmZsZWN0b3ItMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbmZsZWN0b3JfMS9JbmZsZWN0b3JJbmplY3Rpb25UZXN0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5mbGVjdG9yXzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBJbmZsZWN0b3JJbmplY3Rpb25UZXN0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3RvckNsYXNzSW5qZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0SW5mbGVjdG9ySW5qZWN0aW9uKCJjbGFzcyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3Rvckluc3RhbmNlSW5qZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0SW5mbGVjdG9ySW5qZWN0aW9uKCJpbnN0YW5jZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdEluZmxlY3RvckluamVjdGlvbihmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UiKS5wYXRoKHBhdGgpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVxdWVzdFByb3ZpZGVyX3JlcXVlc3RfcmVzcG9uc2VQcm92aWRlcl9yZXNwb25zZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYTFkMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0xL3BvbS54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMy1pbml0LTE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWluaXQtMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtaW5pdC0xIC0gY29uZmlndXJlZCB2aWEgamF4LXJzIGFwcGxpY2F0aW9uIGFubm90YXRlZCB3aXRoIEBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0ZDU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMS9TZXJ2bGV0M2luaXQxLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMS9TZXJ2bGV0M2luaXQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiN2M4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL1NlcnZsZXQzaW5pdDEuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFNlcnZsZXQzaW5pdDEgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBoYXNoU2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjUxMjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgidW5yZWFjaGFibGUiKQorcHVibGljIGNsYXNzIFVucmVhY2hhYmxlUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJlZGJmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCk7CisgICAgICAgIHQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBSZXNwb25zZSByID0gdC5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCEiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5yZWFjaGFibGVSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoInVucmVhY2hhYmxlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1hbmFnZWQgdG8gcmVhY2ggYSByZXNvdXJjZSB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBhcHBsaWNhdGlvbi4iLCA0MDQsIHIuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM3ZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtaW5pdC0yPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1pbml0LTI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1pbml0LTIgLSBjb25maWd1cmVkIHZpYSBqYXgtcnMgYXBwbGljYXRpb24gYW5ub3RhdGVkIHdpdGggQGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aAorICAgICAgICBhbmQgcHJvdmlkZXJzIGFubm90YXRlZCB3aXRoIEBqYXZheC53cy5ycy5leHQuUHJvdmlkZXIuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj40LjEwPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL0N1c3RvbUZlYXR1cmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL0N1c3RvbUZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzZjNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvQ3VzdG9tRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzIuZXh0LkV4dDFXcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8yLmV4dC5FeHQyV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMi5leHQuRXh0M1dyaXRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzIuZXh0LkV4dDRXcml0ZXJJbnRlcmNlcHRvcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgQ3VzdG9tRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQzV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsIDEwMDApOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDJXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgMTAwKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQxV3JpdGVySW50ZXJjZXB0b3IuSU5TVEFOQ0UsIDUwMCk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRXh0NFdyaXRlckludGVyY2VwdG9yLklOU1RBTkNFLCAxKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2IzNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8yOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL1NlcnZsZXQzaW5pdDIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL1NlcnZsZXQzaW5pdDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTEyNTRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvU2VydmxldDNpbml0Mi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMjsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFNlcnZsZXQzaW5pdDIgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgU2VydmxldDNpbml0MigpIHsKKyAgICAgICAgcGFja2FnZXMoZmFsc2UsIFNlcnZsZXQzaW5pdDIuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvZXh0L0V4dDFXcml0ZXJJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvZXh0L0V4dDFXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTRiMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0MVdyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8yLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDFXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRXh0MVdyaXRlckludGVyY2VwdG9yIElOU1RBTkNFID0gbmV3IEV4dDFXcml0ZXJJbnRlcmNlcHRvcigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWV4dDEiKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvZXh0L0V4dDJXcml0ZXJJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvZXh0L0V4dDJXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzlhMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8yLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDJXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQyIik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL2V4dC9FeHQzV3JpdGVySW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL2V4dC9FeHQzV3JpdGVySW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDJiMWJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvZXh0L0V4dDNXcml0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMi5leHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBFeHQzV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0MyIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0NFdyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0NFdyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdiYjczNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL2V4dC9FeHQ0V3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzIuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0NFdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHQ0V3JpdGVySW50ZXJjZXB0b3IgSU5TVEFOQ0UgPSBuZXcgRXh0NFdyaXRlckludGVyY2VwdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0NCIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZmJkYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIS1leHQ0LWV4dDItZXh0MS1leHQzIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZWE0NjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3BvbS54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMy1pbml0LTM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWluaXQtMzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtaW5pdC0zIC0gYm90aCBBcHBsaWNhdGlvbi5nZXRDbGFzc2VzIGFuZCBBcHBsaWNhdGlvbi5nZXRTaW5nbGV0b25zIHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMy9FbXB0eUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMy9FbXB0eUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmMzc4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL0VtcHR5QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRW1wdHlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL3Jlc291cmNlL1Jlc291cmNlT25lLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMy9yZXNvdXJjZS9SZXNvdXJjZU9uZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMWUzOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMy9yZXNvdXJjZS9SZXNvdXJjZU9uZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMy5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgib25lIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZU9uZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBSZXNvdXJjZU9uZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzMvcmVzb3VyY2UvUmVzb3VyY2VUd28uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL3Jlc291cmNlL1Jlc291cmNlVHdvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjZTI0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL3Jlc291cmNlL1Jlc291cmNlVHdvLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8zLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJ0d28iKQorcHVibGljIGNsYXNzIFJlc291cmNlVHdvIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlVHdvLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlZDUxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8zLkVtcHR5QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8zLkVtcHR5QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL0VtcHR5QXBwbGljYXRpb25UZXN0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMy9FbXB0eUFwcGxpY2F0aW9uVGVzdElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjI1NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMy9FbXB0eUFwcGxpY2F0aW9uVGVzdElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8zLnJlc291cmNlLlJlc291cmNlT25lOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzMucmVzb3VyY2UuUmVzb3VyY2VUd287CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eUFwcGxpY2F0aW9uVGVzdElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgib25lIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlT25lLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVR3bygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgidHdvIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlVHdvLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwNjY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvcG9tLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWluaXQtNDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtaW5pdC00PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBTZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtaW5pdC00IC0gYm90aCBBcHBsaWNhdGlvbi5nZXRDbGFzc2VzIGFuZCBBcHBsaWNhdGlvbi5nZXRTaW5nbGV0b25zIHJldHVybiBhbiBlbXB0eQorICAgICAgICBjb2xsZWN0aW9uLCBAQXBwbGljYXRpb25QYXRoIHByZXNlbnQKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF80L0VtcHR5QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF80L0VtcHR5QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTIwNDJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvRW1wdHlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBFbXB0eUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvcmVzb3VyY2UvUmVzb3VyY2VPbmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF80L3Jlc291cmNlL1Jlc291cmNlT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzZTUwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF80L3Jlc291cmNlL1Jlc291cmNlT25lLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF80LnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJvbmUiKQorcHVibGljIGNsYXNzIFJlc291cmNlT25lIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlT25lLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNC9yZXNvdXJjZS9SZXNvdXJjZVR3by5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvcmVzb3VyY2UvUmVzb3VyY2VUd28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU5ZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvcmVzb3VyY2UvUmVzb3VyY2VUd28uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzQucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoInR3byIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VUd28geworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gUmVzb3VyY2VUd28uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF80L0VtcHR5QXBwbGljYXRpb25UZXN0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNC9FbXB0eUFwcGxpY2F0aW9uVGVzdElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2IyYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNC9FbXB0eUFwcGxpY2F0aW9uVGVzdElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF80LnJlc291cmNlLlJlc291cmNlT25lOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzQucmVzb3VyY2UuUmVzb3VyY2VUd287CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eUFwcGxpY2F0aW9uVGVzdElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgib25lIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlT25lLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVR3bygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgidHdvIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlVHdvLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2YWFjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvcG9tLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWluaXQtNTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtaW5pdC01PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1pbml0LTUgLSBubyBBcHBsaWNhdGlvbiBzdWJjbGFzcyBpcyBwcmVzZW50OworICAgICAgICBkeW5hbWljYWxseSBhZGQgYSBzZXJ2bGV0IGFuZCBzZXQgaXRzIG5hbWUgdG8gamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF81L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDgwOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgSGVsbG8gZ2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IEhlbGxvKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWxsbyB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNS9IZWxsb1dyaXRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzUvSGVsbG9Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzA1NzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzUvSGVsbG9Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBIZWxsb1dyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbz4geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgSGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvIGhlbGxvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbyBoZWxsbywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMGNiM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF81L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzUvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxNDM3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF81L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocy5lcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5Yzg3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvcG9tLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWluaXQtNjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtaW5pdC02PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1pbml0LTUgLSBBcHBsaWNhdGlvbiBzdWJjbGFzcyBpcyBwcmVzZW50OworICAgICAgICBzZXJ2bGV0LW1hcHBpbmcgaW4gd2ViLnhtbDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNi9FbXB0eUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNi9FbXB0eUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwZjFjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L0VtcHR5QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRW1wdHlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L3Jlc291cmNlL1Jlc291cmNlT25lLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNi9yZXNvdXJjZS9SZXNvdXJjZU9uZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZGE4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNi9yZXNvdXJjZS9SZXNvdXJjZU9uZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNi5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgib25lIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZU9uZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBSZXNvdXJjZU9uZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzYvcmVzb3VyY2UvUmVzb3VyY2VUd28uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L3Jlc291cmNlL1Jlc291cmNlVHdvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0ZTI3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L3Jlc291cmNlL1Jlc291cmNlVHdvLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF82LnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJ0d28iKQorcHVibGljIGNsYXNzIFJlc291cmNlVHdvIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlVHdvLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViZjE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNi5FbXB0eUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF82LkVtcHR5QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L0VtcHR5QXBwbGljYXRpb25JVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L0VtcHR5QXBwbGljYXRpb25JVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVkOGJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzYvRW1wdHlBcHBsaWNhdGlvbklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF82LnJlc291cmNlLlJlc291cmNlT25lOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzYucmVzb3VyY2UuUmVzb3VyY2VUd287CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRW1wdHlBcHBsaWNhdGlvbklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgib25lIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoUmVzb3VyY2VPbmUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VUd28oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInR3byIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKFJlc291cmNlVHdvLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg2OWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNy9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtaW5pdC03PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1pbml0LTc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLWluaXQtNyAtIG5vIEFwcGxpY2F0aW9uIHN1YmNsYXNzIGlzIHByZXNlbnQ7CisgICAgICAgIGR5bmFtaWNhbGx5IGFkZCBhIHNlcnZsZXQgYW5kIHNldCBpdHMgbmFtZSB0byBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworICAgICAgICBzZXJ2bGV0LW1hcHBpbmcgaW4gd2ViLnhtbDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF83L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWFmOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgSGVsbG8gZ2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IEhlbGxvKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWxsbyB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNy9IZWxsb1dyaXRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzcvSGVsbG9Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTk4OThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzcvSGVsbG9Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgSGVsbG9Xcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgSGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvIGhlbGxvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbyBoZWxsbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKS5nZXRCeXRlcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3ZjQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF83L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjM2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHMuZXF1YWxzKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGZjZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3BvbS54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMy1pbml0LTg8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWluaXQtODwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtaW5pdC04IC0gbW9yZSBqYXgtcnMgYXBwbGljYXRpb25zCisgICAgICAgIChhbm5vdGF0ZWQgd2l0aCBAamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoIGFuZC9vciBjb25maWd1cmVkIGluIHdlYi54bWwpLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGQxUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGQxUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjA0MTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDFSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfODsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkMSIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDFSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCAxISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTFiZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkMlJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQyIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkMlJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkIDIhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkM1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkM1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwYWU2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGQzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZDMiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGQzUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQgMyEiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGQ0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGQ0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjkzNmExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfODsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkNCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCA0ISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDEuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyYzcxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHAxLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRoZSBhcHBsaWNhdGlvbiBpcyBmdWxseSBjb25maWd1cmVkIGluIHtAY29kZSB3ZWIueG1sfSAoe0Bjb2RlIHNlcnZsZXR9IGFzIHdlbGwgYXMge0Bjb2RlIHNlcnZsZXQtbWFwcGluZ30pLgorICogSXQgbWVhbnMge0Bjb2RlIEFwcGxpY2F0aW9uUGF0aC52YWx1ZX0gKHtAY29kZSAvYXBwMWFubn0pIGlzIG92ZXJyaWRkZW4gdXNpbmcgYSB7QGNvZGUgc2VydmxldC1tYXBwaW5nfSBlbGVtZW50LgorICogVGhlIGFwcGxpY2F0aW9uIGFsc28gZXhwbGljaXRseSByZWdpc3RlciBKQVgtUlMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL2FwcDFhbm4iKQorcHVibGljIGNsYXNzIFNlcnZsZXQzSW5pdDhBcHAxIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dvcmxkMVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHAyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhNmVjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHAyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRoZSBhcHBsaWNhdGlvbiBpcyBwYXJ0aWFsbHkgY29uZmlndXJlZCBpbiB7QGNvZGUgd2ViLnhtbH0gKGp1c3Qge0Bjb2RlIHNlcnZsZXR9IGVsZW1lbnQpLgorICogSXQgbWVhbnMge0Bjb2RlIEFwcGxpY2F0aW9uUGF0aC52YWx1ZX0gKHtAY29kZSAvYXBwMmFubn0pIGlzIHVzZWQgYXMgYmFzZSBzZXJ2bGV0IFVSSS4KKyAqIFRoZSBhcHBsaWNhdGlvbiBhbHNvIGV4cGxpY2l0bHkgcmVnaXN0ZXIgSkFYLVJTIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9hcHAyYW5uIikKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0M0luaXQ4QXBwMiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gaGFzaFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgaGFzaFNldC5hZGQoSGVsbG9Xb3JsZDJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBoYXNoU2V0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHAzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxNjNlMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHAzLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRoZSBhcHBsaWNhdGlvbiBpcyBub3QgY29uZmlndXJlZCBpbiB7QGNvZGUgd2ViLnhtbH0uCisgKiBJdCBtZWFucyB7QGNvZGUgQXBwbGljYXRpb25QYXRoLnZhbHVlfSAoe0Bjb2RlIC9hcHAzYW5ufSkgaXMgdXNlZCBhcyBiYXNlIHNlcnZsZXQgVVJJLgorICogVGhlIGFwcGxpY2F0aW9uIGFsc28gZXhwbGljaXRseSByZWdpc3RlciBKQVgtUlMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL2FwcDNhbm4iKQorcHVibGljIGNsYXNzIFNlcnZsZXQzSW5pdDhBcHAzIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dvcmxkM1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9TZXJ2bGV0M0luaXQ4QXBwNC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTM2NjdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDQuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUaGUgYXBwbGljYXRpb24gaXMgZnVsbHkgY29uZmlndXJlZCBpbiB7QGNvZGUgd2ViLnhtbH0gKHtAY29kZSBzZXJ2bGV0fSBhcyB3ZWxsIGFzIHtAY29kZSBzZXJ2bGV0LW1hcHBpbmd9KS4KKyAqIEFuZCB0aGVyZSBpcyBubyB7QGNvZGUgQXBwbGljYXRpb25QYXRofSBhbm5vdGF0aW9uIG9uIHRoZSBjbGFzcy4KKyAqIFRoZSBhcHBsaWNhdGlvbiBhbHNvIGV4cGxpY2l0bHkgcmVnaXN0ZXIgSkFYLVJTIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2bGV0M0luaXQ4QXBwNCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gaGFzaFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgaGFzaFNldC5hZGQoSGVsbG9Xb3JsZDRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBoYXNoU2V0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHA1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmMmVhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHA1LmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUaGUgYXBwbGljYXRpb24gaXMgZnVsbHkgY29uZmlndXJlZCBpbiB7QGNvZGUgd2ViLnhtbH0gKHtAY29kZSBzZXJ2bGV0fSBhcyB3ZWxsIGFzIHtAY29kZSBzZXJ2bGV0LW1hcHBpbmd9KS4KKyAqIEFuZCB0aGVyZSBpcyBubyB7QGNvZGUgQXBwbGljYXRpb25QYXRofSBhbm5vdGF0aW9uIG9uIHRoZSBjbGFzcy4KKyAqIFRoZSBhcHBsaWNhdGlvbiBkb2VzIE5PVCBleHBsaWNpdGx5IHJlZ2lzdGVyIGFueSBKQVgtUlMgcmVzb3VyY2UuIEFsbCBhdmFpbGFibGUgcmVzb3VyY2VzIGFyZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNlcnZsZXQzSW5pdDhBcHA1IGV4dGVuZHMgQXBwbGljYXRpb24geworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9VbnJlYWNoYWJsZVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9VbnJlYWNoYWJsZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmOTcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJ1bnJlYWNoYWJsZSIpCitwdWJsaWMgY2xhc3MgVW5yZWFjaGFibGVSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBVbnJlYWNoYWJsZSEiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzNhNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIiB2ZXJzaW9uPSIzLjAiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzguU2VydmxldDNJbml0OEFwcDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzguU2VydmxldDNJbml0OEFwcDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9hcHAxLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfOC5TZXJ2bGV0M0luaXQ4QXBwMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfOC5TZXJ2bGV0M0luaXQ4QXBwNDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfOC5TZXJ2bGV0M0luaXQ4QXBwNDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FwcDQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84LlNlcnZsZXQzSW5pdDhBcHA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84LlNlcnZsZXQzSW5pdDhBcHA1PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYXBwNS8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1NTY4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfODsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgcmVhY2hhYmxlIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXBwUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNvdXJjZVBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaGVsbG9OYW1lOworCisgICAgcHVibGljIEhlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZShTdHJpbmcgYXBwUGF0aCwgU3RyaW5nIHJlc291cmNlUGF0aCwgU3RyaW5nIGhlbGxvTmFtZSkgeworICAgICAgICB0aGlzLmFwcFBhdGggPSBhcHBQYXRoOworICAgICAgICB0aGlzLnJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aDsKKyAgICAgICAgdGhpcy5oZWxsb05hbWUgPSBoZWxsb05hbWU7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIntpbmRleH06IHswfS97MX0gXCJ7Mn1cIiIpCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiL2FwcDEiLCAiaGVsbG93b3JsZDEiLCAiV29ybGQgMSJ9LCAvL2FwcDEgLSBvdmVycmlkZGVuIHVzaW5nIGEgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgaW4gdGhlIHdlYi54bWwKKyAgICAgICAgICAgICAgICB7Ii9hcHAyYW5uIiwgImhlbGxvd29ybGQyIiwgIldvcmxkIDIifSwgLy9hcHAyYW5uIC0gbm8gc2VydmxldC1tYXBwaW5nIGluIHRoZSB3ZWIueG1sLCB1c2VkIEFwcGxpY2F0aW9uUGF0aC52YWx1ZQorICAgICAgICAgICAgICAgIHsiL2FwcDNhbm4iLCAiaGVsbG93b3JsZDMiLCAiV29ybGQgMyJ9LCAvL2FwcDNhbm4gLSBubyBzZXJ2bGV0IGluIHRoZSB3ZWIueG1sLCB1c2VkIEFwcGxpY2F0aW9uUGF0aC52YWx1ZQorICAgICAgICAgICAgICAgIHsiL2FwcDQiLCAiaGVsbG93b3JsZDQiLCAiV29ybGQgNCJ9LCAvL2FwcDQgLSBmdWxseSBjb25maWd1cmVkIGluIHdlYi54bWwKKyAgICAgICAgICAgICAgICAvL2FwcDUgLSAgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBvZiBhbGwgcmVzb3VyY2VzLCBubyBleHBsaWNpdCBjbGFzc2VzL3NpbmdsZXRvbnMgcHJvdmlkZWQgYnkgU2VydmxldDNJbml0OEFwcDUKKyAgICAgICAgICAgICAgICB7Ii9hcHA1IiwgImhlbGxvd29ybGQxIiwgIldvcmxkIDEifSwKKyAgICAgICAgICAgICAgICB7Ii9hcHA1IiwgImhlbGxvd29ybGQyIiwgIldvcmxkIDIifSwKKyAgICAgICAgICAgICAgICB7Ii9hcHA1IiwgImhlbGxvd29ybGQzIiwgIldvcmxkIDMifSwKKyAgICAgICAgICAgICAgICB7Ii9hcHA1IiwgImhlbGxvd29ybGQ0IiwgIldvcmxkIDQifSwKKyAgICAgICAgICAgICAgICB7Ii9hcHA1IiwgInVucmVhY2hhYmxlIiwgIlVucmVhY2hhYmxlIn0sCisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoYXBwUGF0aCk7CisgICAgICAgIHQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBSZXNwb25zZSByID0gdC5wYXRoKHJlc291cmNlUGF0aCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyAiICsgaGVsbG9OYW1lICsgIiEiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkUmVzb3VyY2VVbnJlYWNoYWJsZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlVW5yZWFjaGFibGVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTQ2ODdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlVW5yZWFjaGFibGVJVENhc2UuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IHVucmVhY2hhYmxlIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZVVucmVhY2hhYmxlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhcHBQYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aDsKKworICAgIHB1YmxpYyBIZWxsb1dvcmxkUmVzb3VyY2VVbnJlYWNoYWJsZUlUQ2FzZShTdHJpbmcgYXBwUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlUGF0aCkgeworICAgICAgICB0aGlzLmFwcFBhdGggPSBhcHBQYXRoOworICAgICAgICB0aGlzLnJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aDsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogezB9L3sxfSIpCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiL2FwcDEiLCAidW5yZWFjaGFibGUifSwgLy91bnJlYWNoYWJsZSAtIG5vIGV4cGxpY2l0bHkgbWVudGlvbmVkIHJlc291cmNlCisgICAgICAgICAgICAgICAgeyIvYXBwMWFubiIsICJoZWxsb3dvcmxkMSJ9LCAvL2FwcDFhbm4gLSBvdmVycmlkZGVuIHVzaW5nIGEgc2VydmxldC1tYXBwaW5nIGVsZW1lbnQgaW4gdGhlIHdlYi54bWwKKyAgICAgICAgICAgICAgICB7Ii9hcHAyYW5uIiwgInVucmVhY2hhYmxlIn0sIC8vdW5yZWFjaGFibGUgLSBubyBleHBsaWNpdGx5IG1lbnRpb25lZCByZXNvdXJjZQorICAgICAgICAgICAgICAgIHsiL2FwcDNhbm4iLCAidW5yZWFjaGFibGUifSwgLy91bnJlYWNoYWJsZSAtIG5vIGV4cGxpY2l0bHkgbWVudGlvbmVkIHJlc291cmNlCisgICAgICAgICAgICAgICAgeyIvYXBwNCIsICJ1bnJlYWNoYWJsZSJ9LCAvL3VucmVhY2hhYmxlIC0gbm8gZXhwbGljaXRseSBtZW50aW9uZWQgcmVzb3VyY2UKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5yZWFjaGFibGVSZXNvdXJjZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoYXBwUGF0aCk7CisgICAgICAgIHQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBSZXNwb25zZSByID0gdC5wYXRoKHJlc291cmNlUGF0aCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDE3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtaW5pdC1wcm92aWRlcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtaW5pdC1wcm92aWRlcjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtaW5pdC1wcm92aWRlciAtIFNlcnZsZXRDb250YWluZXJQcm92aWRlckZhY3RvcnksIFNlcnZsZXRDb250YWluZXJQcm92aWRlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmxldC1wb3J0YWJpbGl0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODlhNTBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5VTUJFUl9PRl9BUFBMSUNBVElPTlMgPSA1OworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIEhlbGxvIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIZWxsbyhjcmVhdGVOYW1lKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY3JlYXRlTmFtZSgpOworCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlbGxvIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgSGVsbG8oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb24xLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0FwcGxpY2F0aW9uMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTZiNDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0FwcGxpY2F0aW9uMS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbjEgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGhhc2hTZXQgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgaGFzaFNldC5hZGQoSGVsbG9Xb3JsZDFSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV3JpdGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0FwcGxpY2F0aW9uMi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BcHBsaWNhdGlvbjIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWYxNjgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BcHBsaWNhdGlvbjIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb24yIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV29ybGQyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dyaXRlci5jbGFzcyk7CisgICAgICAgIHJldHVybiBoYXNoU2V0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BcHBsaWNhdGlvbjMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb24zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5MzJjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb24zLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uMyBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gaGFzaFNldCA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dvcmxkM1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgaGFzaFNldC5hZGQoSGVsbG9Xcml0ZXIuY2xhc3MpOworICAgICAgICByZXR1cm4gaGFzaFNldDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb240LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0FwcGxpY2F0aW9uNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTc2N2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0FwcGxpY2F0aW9uNC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9hcHBsaWNhdGlvbjQvKiIpCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb240IGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV29ybGQ0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dyaXRlci5jbGFzcyk7CisgICAgICAgIHJldHVybiBoYXNoU2V0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQxUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmZkMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZDEiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGQxUmVzb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiV29ybGQgIzEiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgic2VydmxldHMiKQorICAgIHB1YmxpYyBpbnQgZ2V0U2VydmxldHNDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuZ2V0U2VydmxldE5hbWVzKCkuc2l6ZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgic2VydmxldHMve25hbWV9IikKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZXJ2bGV0TmFtZShAUGF0aFBhcmFtKCJuYW1lIikgU3RyaW5nIHNlcnZsZXROYW1lKSB7CisgICAgICAgIHJldHVybiBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLmdldFNlcnZsZXROYW1lcygpLmNvbnRhaW5zKHNlcnZsZXROYW1lKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImltbXV0YWJsZVNlcnZsZXROYW1lcyIpCisgICAgcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGVTZXJ2bGV0TmFtZXMoKSB7CisgICAgICAgIHJldHVybiBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLmlzSW1tdXRhYmxlU2VydmxldE5hbWVzKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQyUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5Y2M1NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZDIiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGQyUmVzb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiV29ybGQgIzIiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkM1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjUxMGUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkM1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkMyIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDNSZXNvdXJjZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJXb3JsZCAjMyI7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjb250YWluZXJzIikKKyAgICBwdWJsaWMgaW50IGdldENvbnRhaW5lcnNDb3VudCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBUZXN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuZ2V0U3RhcnR1cENvdW50KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGIyZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZDQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGQ0UmVzb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiV29ybGQgIzQiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkNVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ1UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgzNTBhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkNVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZDUiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGQ1UmVzb3VyY2UgZXh0ZW5kcyBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiV29ybGQgIzUiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZmlsdGVyIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlcigpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJGSUxURVIiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xcml0ZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjA2MWNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEhlbGxvV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8QWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8+IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8gaGVsbG8sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8gaGVsbG8sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gU3RyaW5nLmZvcm1hdCgiSGVsbG8gJXMhIiwgaGVsbG8uZ2V0TmFtZSgpKTsKKyAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHZhbHVlLmdldEJ5dGVzKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL1Rlc3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9UZXN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGExYjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9UZXN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKKworLyoqCisgKiBUaGlzIGlzIGp1c3QgdGVzdCBwdXJwb3NlIGltcGxlbWVudGF0aW9uIG9mIEplcnNleSBTUEkge0BsaW5rIENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyfS4KKyAqIFRoZSBsaXN0ZW5lciBjbGFzcyBpcyByZWdpc3RlcmVkIGluIHtAbGluayBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyfSB0byB7QGxpbmsgUmVzb3VyY2VDb25maWd9LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgaW1wbGVtZW50cyBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc3RhcnR1cENvdW50ID0gMDsKKworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlLk5VTUJFUl9PRl9BUFBMSUNBVElPTlMpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydHVwKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgIHN0YXJ0dXBDb3VudCsrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVsb2FkKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNodXRkb3duKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTdGFydHVwQ291bnQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBsYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgcmV0dXJuIHN0YXJ0dXBDb3VudDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvVGVzdEZpbHRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9UZXN0RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwOTNjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvVGVzdEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioKKyAqIFRoaXMgaXMganVzdCB0ZXN0IHB1cnBvc2Uge0BsaW5rIEZpbHRlciBzZXJ2bGV0IGZpbHRlcn0gaW1wbGVtZW50YXRpb24gdG8gZGVtb25zdHJhdGUgaG93IHRvIHJlZ2lzdGVyIGZpbHRlciBmb3IgYW55IEplcnNleQorICogU2VydmxldC4KKyAqIFRoZSBmaWx0ZXIgY2xhc3MgaXMgYWRkZWQgaW4ge0BsaW5rIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBpZiAoKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcXVlc3QpLmdldFJlcXVlc3RVUkkoKS5zdGFydHNXaXRoKCIvYXBwbGljYXRpb241IikpIHsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKCJGSUxURVIiLCBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLlRFU1RfRklMVEVSKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvVGVzdFNlcnZsZXRDb250YWluZXJQcm92aWRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9UZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlMWE1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvVGVzdFNlcnZsZXRDb250YWluZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguc2VydmxldC5EaXNwYXRjaGVyVHlwZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBpcyBqdXN0IHRlc3QgcHVycG9zZSBpbXBsZW1lbnRhdGlvbiBvZiBKZXJzZXkgaW50ZXJuYWwgU1BJIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyIGltcGxlbWVudHMgU2VydmxldENvbnRhaW5lclByb3ZpZGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRklMVEVSID0gIlRlc3RGaWx0ZXIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gU0VSVkxFVF9OQU1FUzsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGltbXV0YWJsZVNlcnZsZXROYW1lcyA9IGZhbHNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlSW5pdChmaW5hbCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGNsYXNzZXMuYWRkKEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwb3N0SW5pdChmaW5hbCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzLCBmaW5hbCBTZXQ8U3RyaW5nPiBzZXJ2bGV0TmFtZXMpCisgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2bGV0TmFtZXMuYWRkKCJURVNUIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLnNldEltbXV0YWJsZVNlcnZsZXROYW1lcyh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVnaXN0ZXIoZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIGZpbmFsIFNldDxTdHJpbmc+IHNlcnZsZXROYW1lcykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLnNldFNlcnZsZXROYW1lcyhzZXJ2bGV0TmFtZXMpOworCisgICAgICAgIHNlcnZsZXRDb250ZXh0LmFkZEZpbHRlcihURVNUX0ZJTFRFUiwgVGVzdEZpbHRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuYWRkTWFwcGluZ0ZvclNlcnZsZXROYW1lcyhFbnVtU2V0LmFsbE9mKERpc3BhdGNoZXJUeXBlLmNsYXNzKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3NlcnZsZXROYW1lcy5zaXplKCldKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghcmVzb3VyY2VDb25maWcuaXNSZWdpc3RlcmVkKFRlc3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcykpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFRlc3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldFNlcnZsZXROYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIFNFUlZMRVRfTkFNRVM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW1tdXRhYmxlU2VydmxldE5hbWVzKCkgeworICAgICAgICByZXR1cm4gaW1tdXRhYmxlU2VydmxldE5hbWVzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0U2VydmxldE5hbWVzKGZpbmFsIFNldDxTdHJpbmc+IHNlcnZsZXROYW1lcykgeworICAgICAgICBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLlNFUlZMRVRfTkFNRVMgPSBzZXJ2bGV0TmFtZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEltbXV0YWJsZVNlcnZsZXROYW1lcyhmaW5hbCBib29sZWFuIGltbXV0YWJsZVNlcnZsZXROYW1lcykgeworICAgICAgICBUZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLmltbXV0YWJsZVNlcnZsZXROYW1lcyA9IGltbXV0YWJsZVNlcnZsZXROYW1lczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlNlcnZsZXRDb250YWluZXJQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGZlZGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlNlcnZsZXRDb250YWluZXJQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci5UZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExZjllYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXIuQXBwbGljYXRpb24xPC9zZXJ2bGV0LW5hbWU+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmFwcGxpY2F0aW9uMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXIuQXBwbGljYXRpb24yPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+YXBwbGljYXRpb24zPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQucG9ydGFiaWxpdHkuUG9ydGFibGVTZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleTIjamF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXIuQXBwbGljYXRpb24zPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXIuSGVsbG9Xb3JsZDVSZXNvdXJjZSwKKyAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci5IZWxsb1dyaXRlcgorICAgICAgICAgICAgPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyLkFwcGxpY2F0aW9uMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FwcGxpY2F0aW9uMS8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmFwcGxpY2F0aW9uMjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FwcGxpY2F0aW9uMi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmFwcGxpY2F0aW9uMzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FwcGxpY2F0aW9uMy8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9hcHBsaWNhdGlvbjUvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0Fic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWMxODMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKKworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhnZXRSZXNvdXJjZUNsYXNzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5OVU1CRVJfT0ZfQVBQTElDQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGFjdHVhbCA9IHRhcmdldCgiYXBwbGljYXRpb24iICsgZ2V0SW5kZXgoKSkucGF0aCgiaGVsbG93b3JsZCIgKyBpKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gZ2V0SW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCAjIiArIGdldEluZGV4KCkgKyAiISIsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoImk6ICIgKyBpICsgIiB8IFsiICsgYWN0dWFsICsgIl0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmIChpICE9IGdldEluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDQsIGV4LmdldFJlc3BvbnNlKCkuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCIhISEgaTogIiArIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDbGFzczw/PiBnZXRSZXNvdXJjZUNsYXNzKCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldEluZGV4KCk7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDFSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMVJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5OTM5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDFSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDFSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlVGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZ2V0UmVzb3VyY2VDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIEhlbGxvV29ybGQxUmVzb3VyY2UuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJlZFNlcnZsZXROYW1lcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJhcHBsaWNhdGlvbiIgKyBnZXRJbmRleCgpKS5wYXRoKCJoZWxsb3dvcmxkIiArIGdldEluZGV4KCkpLnBhdGgoInNlcnZsZXRzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuTlVNQkVSX09GX0FQUExJQ0FUSU9OUywgKGludCkgdGFyZ2V0LnJlcXVlc3QoKS5nZXQoSW50ZWdlci5UWVBFKSk7CisKKyAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhdGgoIntuYW1lfSIpOworICAgICAgICB0ZXN0UmVnaXN0ZXJlZFNlcnZsZXROYW1lcyh0YXJnZXQsICJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci5BcHBsaWNhdGlvbjEiKTsKKyAgICAgICAgdGVzdFJlZ2lzdGVyZWRTZXJ2bGV0TmFtZXModGFyZ2V0LCAiYXBwbGljYXRpb24yIik7CisgICAgICAgIHRlc3RSZWdpc3RlcmVkU2VydmxldE5hbWVzKHRhcmdldCwgImFwcGxpY2F0aW9uMyIpOworICAgICAgICB0ZXN0UmVnaXN0ZXJlZFNlcnZsZXROYW1lcyh0YXJnZXQsICJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci5BcHBsaWNhdGlvbjQiKTsKKyAgICAgICAgdGVzdFJlZ2lzdGVyZWRTZXJ2bGV0TmFtZXModGFyZ2V0LCAiamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVnaXN0ZXJlZFNlcnZsZXROYW1lcyhXZWJUYXJnZXQgdGFyZ2V0LCBTdHJpbmcgc2VydmxldE5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0YXJnZXQucmVzb2x2ZVRlbXBsYXRlKCJuYW1lIiwgc2VydmxldE5hbWUpLnJlcXVlc3QoKS5nZXQoQm9vbGVhbi5UWVBFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1tdXRhYmxlU2VydmxldE5hbWVzKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJhcHBsaWNhdGlvbiIgKyBnZXRJbmRleCgpKS5wYXRoKCJoZWxsb3dvcmxkIiArIGdldEluZGV4KCkpLnBhdGgoImltbXV0YWJsZVNlcnZsZXROYW1lcyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0YXJnZXQucmVxdWVzdCgpLmdldChCb29sZWFuLlRZUEUpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDJSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMlJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM4YWM1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDJSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGQyUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZVRlc3QgeworCisgICAgcHJvdGVjdGVkIENsYXNzPD8+IGdldFJlc291cmNlQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBIZWxsb1dvcmxkMlJlc291cmNlLmNsYXNzOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkM1Jlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQzUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE2ZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkM1Jlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkM1Jlc291cmNlSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2VUZXN0IHsKKworICAgIHByb3RlY3RlZCBDbGFzczw/PiBnZXRSZXNvdXJjZUNsYXNzKCkgeworICAgICAgICByZXR1cm4gSGVsbG9Xb3JsZDNSZXNvdXJjZS5jbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydHVwQ29udGFpbmVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJhcHBsaWNhdGlvbiIgKyBnZXRJbmRleCgpKS5wYXRoKCJoZWxsb3dvcmxkIiArIGdldEluZGV4KCkpLnBhdGgoImNvbnRhaW5lcnMiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5OVU1CRVJfT0ZfQVBQTElDQVRJT05TLCAoaW50KSB0YXJnZXQucmVxdWVzdCgpLmdldChJbnRlZ2VyLlRZUEUpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkNFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzOWUyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlVGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZ2V0UmVzb3VyY2VDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIEhlbGxvV29ybGQ0UmVzb3VyY2UuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImFwcGxpY2F0aW9uIiArIGdldEluZGV4KCkpLnBhdGgoImhlbGxvd29ybGQiICsgZ2V0SW5kZXgoKSkucGF0aCgiZmlsdGVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkNVJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ1UmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRhZTdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkNVJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGQ1UmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZVRlc3QgeworCisgICAgcHJvdGVjdGVkIENsYXNzPD8+IGdldFJlc291cmNlQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBIZWxsb1dvcmxkNVJlc291cmNlLmNsYXNzOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiA1OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBhY3R1YWwgPSB0YXJnZXQoImFwcGxpY2F0aW9uIiArIGdldEluZGV4KCkpLnBhdGgoImhlbGxvd29ybGQiICsgZ2V0SW5kZXgoKSkucGF0aCgiZmlsdGVyIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuVEVTVF9GSUxURVIsIGFjdHVhbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhNWNlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvcG9tLnhtbApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLXBhcmFtczwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtcGFyYW1zPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1wYXJhbXM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19wYXJhbXMvQ3VzdG9tQ29udGV4dExpc3RlbmVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3BhcmFtcy9DdXN0b21Db250ZXh0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE1NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19wYXJhbXMvQ3VzdG9tQ29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfcGFyYW1zOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmFubm90YXRpb24uV2ViTGlzdGVuZXI7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFdlYkxpc3RlbmVyCitwdWJsaWMgY2xhc3MgQ3VzdG9tQ29udGV4dExpc3RlbmVyIGltcGxlbWVudHMgU2VydmxldENvbnRleHRMaXN0ZW5lciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0SW5pdGlhbGl6ZWQoU2VydmxldENvbnRleHRFdmVudCBzZXJ2bGV0Q29udGV4dEV2ZW50KSB7CisgICAgICAgIHNlcnZsZXRDb250ZXh0RXZlbnQuZ2V0U2VydmxldENvbnRleHQoKS5zZXRBdHRyaWJ1dGUoIm15Q29udGV4dFBhcmFtIiwgIm15VmFsdWUiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RGVzdHJveWVkKFNlcnZsZXRDb250ZXh0RXZlbnQgc2VydmxldENvbnRleHRFdmVudCkgeworCisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3BhcmFtcy9QYXJhbVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3BhcmFtcy9QYXJhbVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllZjdhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfcGFyYW1zL1BhcmFtUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19wYXJhbXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJwYXJhbXMiKQorcHVibGljIGNsYXNzIFBhcmFtUmVzb3VyY2UgeworCisgICAgQENvbnRleHQKKyAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBRdWVyeVBhcmFtKCJwYXJhbS1uYW1lIikgU3RyaW5nIHBhcmFtTmFtZSkgeworICAgICAgICByZXR1cm4gYXBwbGljYXRpb24uZ2V0UHJvcGVydGllcygpLmdldChwYXJhbU5hbWUpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTE4YTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19wYXJhbXMuUGFyYW1SZXNvdXJjZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5teUluaXRQYXJhbTwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5teVZhbHVlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfcGFyYW1zL1BhcmFtc1Rlc3RJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfcGFyYW1zL1BhcmFtc1Rlc3RJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGM0MTUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19wYXJhbXMvUGFyYW1zVGVzdElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX3BhcmFtczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGFyYW1zVGVzdElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8vIHNlZSB3ZWIueG1sCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdFBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoKS5wYXRoKCJwYXJhbXMiKS5xdWVyeVBhcmFtKCJwYXJhbS1uYW1lIiwgIm15SW5pdFBhcmFtIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteVZhbHVlIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8vIHNlZSBDdXN0b21Db250ZXh0TGlzdGVuZXIuamF2YQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgicGFyYW1zIikucXVlcnlQYXJhbSgicGFyYW0tbmFtZSIsICJteUNvbnRleHRQYXJhbSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibXlWYWx1ZSIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtc3NlLTEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWE0MDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtc3NlLTEvcG9tLnhtbApAQCAtMCwwICsxLDEwOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMy1zc2UtMTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtc3NlLTE8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLXNzZS0xPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwhLS1wbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4wPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgorICAgICAgICAgICAgICAgICAgICA8c3RvcFBvcnQ+OTk5OTwvc3RvcFBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDxzdG9wS2V5PlNUT1A8L3N0b3BLZXk+CisgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHdlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPC93ZWJBcHA+CisgICAgICAgICAgICAgICAgICAgIDx3YXI+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0ud2FyPC93YXI+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmpldHR5LnBvcnQ8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0fTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnN0YXJ0LWpldHR5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuLXdhcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGFlbW9uPnRydWU8L2RhZW1vbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c3RvcC1qZXR0eTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cG9zdC1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zdG9wPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4tLT4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtc3NlLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfc3NlXzEvSXRlbVN0b3JlQXBwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtc3NlLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfc3NlXzEvSXRlbVN0b3JlQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzNzAyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19zc2VfMS9JdGVtU3RvcmVBcHAuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19zc2VfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBTU0UgaXRlbSBzdG9yZSBKQVgtUlMgYXBwbGljYXRpb24gY2xhc3MuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgicmVzb3VyY2VzIikKK3B1YmxpYyBjbGFzcyBJdGVtU3RvcmVBcHAgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBTU0UgSXRlbSBTdG9yZSBFeGFtcGxlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlbVN0b3JlQXBwKCkgeworICAgICAgICBzdXBlcihJdGVtU3RvcmVSZXNvdXJjZS5jbGFzcywgU3NlRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXNzZS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3NzZV8xL0l0ZW1TdG9yZVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtc3NlLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfc3NlXzEvSXRlbVN0b3JlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmJiMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXNzZS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3NzZV8xL0l0ZW1TdG9yZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX3NzZV8xOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5TZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRPdXRwdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLk91dGJvdW5kRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUJyb2FkY2FzdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworCisvKioKKyAqIEEgcmVzb3VyY2UgZm9yIHN0b3JpbmcgbmFtZWQgaXRlbXMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIml0ZW1zIikKK3B1YmxpYyBjbGFzcyBJdGVtU3RvcmVSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSXRlbVN0b3JlUmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgc3RvcmVMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaW5rZWRMaXN0PFN0cmluZz4gaXRlbVN0b3JlID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyID0gbmV3IFNzZUJyb2FkY2FzdGVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBsb25nIHJlY29ubmVjdERlbGF5ID0gMDsKKworICAgIC8qKgorICAgICAqIExpc3QgYWxsIHN0b3JlZCBpdGVtcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBhbGwgc3RvcmVkIGl0ZW1zLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBsaXN0SXRlbXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gaXRlbVN0b3JlLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdG9yZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgJiBwcm9jZXNzIGNvbW1hbmRzIHNlbnQgYnkgdGhlIHRlc3QgY2xpZW50IHRoYXQgY29udHJvbCB0aGUgaW50ZXJuYWwgcmVzb3VyY2Ugc3RhdGUuCisgICAgICoKKyAgICAgKiBGb2xsb3dpbmcgaXMgdGhlIGxpc3Qgb2YgcmVjb2duaXplZCBjb21tYW5kczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxiPmRpc2Nvbm5lY3Q8L2I+IC0gZGlzY29ubmVjdCBhbGwgcmVnaXN0ZXJlZCBldmVudCBzdHJlYW1zLjwvbGk+CisgICAgICogPGxpPjxiPnJlY29ubmVjdCBub3c8L2I+IC0gZW5hYmxlIGNsaWVudCByZWNvbm5lY3RpbmcuPC9saT4KKyAgICAgKiA8bGk+PGI+cmVjb25uZWN0ICZsdDtzZWNvbmRzJmd0OzwvYj4gLSBkaXNhYmxlIGNsaWVudCByZWNvbm5lY3RpbmcuCisgICAgICogUmVjb25uZWN0aW5nIGNsaWVudHMgd2lsbCByZWNlaXZlIGEgSFRUUCA1MDMgcmVzcG9uc2Ugd2l0aAorICAgICAqIHtAdmFsdWUgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVycyNSRVRSWV9BRlRFUn0gc2V0IHRvIHRoZSBhbW91bnQgb2YKKyAgICAgKiBtaWxsaXNlY29uZHMgc3BlY2lmaWVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kIGNvbW1hbmQgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAqIEByZXR1cm4gbWVzc2FnZSBhYm91dCBwcm9jZXNzaW5nIHJlc3VsdC4KKyAgICAgKiBAdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24gaW4gY2FzZSB0aGUgY29tbWFuZCBpcyBub3QgcmVjb2duaXplZCBvciBub3Qgc3BlY2lmaWVkLgorICAgICAqLworICAgIEBQT1NUCisgICAgQFBhdGgoImNvbW1hbmRzIikKKyAgICBwdWJsaWMgU3RyaW5nIHByb2Nlc3NDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwgfHwgY29tbWFuZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJObyBjb21tYW5kIHNwZWNpZmllZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgiZGlzY29ubmVjdCIuZXF1YWxzKGNvbW1hbmQpKSB7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5jbG9zZUFsbCgpOworICAgICAgICAgICAgcmV0dXJuICJEaXNjb25uZWN0ZWQuIjsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmxlbmd0aCgpID4gInJlY29ubmVjdCAiLmxlbmd0aCgpICYmIGNvbW1hbmQuc3RhcnRzV2l0aCgicmVjb25uZWN0ICIpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2hlbiA9IGNvbW1hbmQuc3Vic3RyaW5nKCJyZWNvbm5lY3QgIi5sZW5ndGgoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlY29ubmVjdERlbGF5ID0gIm5vdyIuZXF1YWxzKHdoZW4pID8gMCA6IExvbmcucGFyc2VMb25nKHdoZW4pOworICAgICAgICAgICAgICAgIHJldHVybiAiUmVjb25uZWN0IHN0cmF0ZWd5IHVwZGF0ZWQ6ICIgKyB3aGVuOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJDb21tYW5kIG5vdCByZWNvZ25pemVkOiAnIiArIGNvbW1hbmQgKyAiJyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3Qgb3IgcmUtY29ubmVjdCB0byBTU0UgZXZlbnQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGxhc3RFdmVudElkIFZhbHVlIG9mIGN1c3RvbSBTU0UgSFRUUCA8dHQ+e0B2YWx1ZSBTc2VGZWF0dXJlI0xBU1RfRVZFTlRfSURfSEVBREVSfTwvdHQ+IGhlYWRlci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8ge0Bjb2RlIC0xfSBpZiBub3Qgc2V0LgorICAgICAqIEByZXR1cm4gbmV3IFNTRSBldmVudCBvdXRwdXQgc3RyZWFtIHJlcHJlc2VudGluZyB0aGUgKHJlLSllc3RhYmxpc2hlZCBTU0UgY2xpZW50IGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIGluIGNhc2UgcmVwbGF5aW5nIG1pc3NlZCBldmVudHMgdG8gdGhlIHJlY29ubmVjdGVkIG91dHB1dCBzdHJlYW0gZmFpbHMuCisgICAgICogQHRocm93cyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24gIGluIGNhc2UgdGhlIHJlY29ubmVjdCBkZWxheSBpcyBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoImV2ZW50cyIpCisgICAgQFByb2R1Y2VzKFNzZUZlYXR1cmUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgIHB1YmxpYyBFdmVudE91dHB1dCBpdGVtRXZlbnRzKAorICAgICAgICAgICAgQEhlYWRlclBhcmFtKFNzZUZlYXR1cmUuTEFTVF9FVkVOVF9JRF9IRUFERVIpIEBEZWZhdWx0VmFsdWUoIi0xIikgaW50IGxhc3RFdmVudElkKSB7CisgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IGV2ZW50T3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisKKyAgICAgICAgaWYgKGxhc3RFdmVudElkID49IDApIHsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJSZWNlaXZlZCBsYXN0IGV2ZW50IGlkIDoiICsgbGFzdEV2ZW50SWQpOworCisgICAgICAgICAgICAvLyBkZWNpZGUgdGhlIHJlY29ubmVjdCBoYW5kbGluZyBzdHJhdGVneSBiYXNlZCBvbiBjdXJyZW50IHJlY29ubmVjdCBkZWxheSB2YWx1ZS4KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZGVsYXkgPSByZWNvbm5lY3REZWxheTsKKyAgICAgICAgICAgIGlmIChkZWxheSA+IDApIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTm9uLXplcm8gcmVjb25uZWN0IGRlbGF5IFsiICsgZGVsYXkgKyAiXSAtIHJlc3BvbmRpbmcgd2l0aCBIVFRQIDUwMy4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKGRlbGF5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlplcm8gcmVjb25uZWN0IGRlbGF5IC0gcmVjb25uZWN0aW5nLiIpOworICAgICAgICAgICAgICAgIHJlcGxheU1pc3NlZEV2ZW50cyhsYXN0RXZlbnRJZCwgZXZlbnRPdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFicm9hZGNhc3Rlci5hZGQoZXZlbnRPdXRwdXQpKSB7CisgICAgICAgICAgICBMT0dHRVIuc2V2ZXJlKCIhISEgVW5hYmxlIHRvIGFkZCBuZXcgZXZlbnQgb3V0cHV0IHRvIHRoZSBicm9hZGNhc3RlciAhISEiKTsKKyAgICAgICAgICAgIC8vIGxldCdzIHRyeSB0byBmb3JjZSBhIDVzIGRlbGF5ZWQgY2xpZW50IHJlY29ubmVjdCBhdHRlbXB0CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKDVMKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBldmVudE91dHB1dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwbGF5TWlzc2VkRXZlbnRzKGZpbmFsIGludCBsYXN0RXZlbnRJZCwgZmluYWwgRXZlbnRPdXRwdXQgZXZlbnRPdXRwdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFVucmVjZWl2ZWQgPSBsYXN0RXZlbnRJZCArIDE7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWlzc2luZ0NvdW50ID0gaXRlbVN0b3JlLnNpemUoKSAtIGZpcnN0VW5yZWNlaXZlZDsKKyAgICAgICAgICAgIGlmIChtaXNzaW5nQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlJlcGxheWluZyBldmVudHMgLSBzdGFydGluZyB3aXRoIGlkICIgKyBmaXJzdFVucmVjZWl2ZWQpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ID0gaXRlbVN0b3JlLnN1Ykxpc3QoZmlyc3RVbnJlY2VpdmVkLCBpdGVtU3RvcmUuc2l6ZSgpKS5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50T3V0cHV0LndyaXRlKGNyZWF0ZUl0ZW1FdmVudChpdC5uZXh0SW5kZXgoKSArIGZpcnN0VW5yZWNlaXZlZCwgaXQubmV4dCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTm8gZXZlbnRzIHRvIHJlcGxheS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCJFcnJvciByZXBsYXlpbmcgbWlzc2VkIGV2ZW50cyIsIGV4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG5ldyBpdGVtIHRvIHRoZSBpdGVtIHN0b3JlLgorICAgICAqCisgICAgICogSW52b2tpbmcgdGhpcyBtZXRob2Qgd2lsbCBmaXJlIDIgbmV3IFNTRSBldmVudHMgLSAxc3QgYWJvdXQgbmV3bHkgYWRkZWQgaXRlbSBhbmQgMm5kIGFib3V0IHRoZSBuZXcgaXRlbSBzdG9yZSBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgaXRlbSBuYW1lLgorICAgICAqLworICAgIEBQT1NUCisgICAgcHVibGljIHZvaWQgYWRkSXRlbShARm9ybVBhcmFtKCJuYW1lIikgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZmluYWwgaW50IGV2ZW50SWQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZUxvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICAgICAgZXZlbnRJZCA9IGl0ZW1TdG9yZS5zaXplKCk7CisgICAgICAgICAgICBpdGVtU3RvcmUuYWRkKG5hbWUpOworICAgICAgICAgICAgLy8gQnJvYWRjYXN0aW5nIGFuIHVuLW5hbWVkIGV2ZW50IHdpdGggdGhlIG5hbWUgb2YgdGhlIG5ld2x5IGFkZGVkIGl0ZW0gaW4gZGF0YQorICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KGNyZWF0ZUl0ZW1FdmVudChldmVudElkLCBuYW1lKSk7CisgICAgICAgICAgICAvLyBCcm9hZGNhc3RpbmcgYSBuYW1lZCAic2l6ZSIgZXZlbnQgd2l0aCB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBpdGVtcyBjb2xsZWN0aW9uIGluIGRhdGEKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkubmFtZSgic2l6ZSIpLmRhdGEoSW50ZWdlci5jbGFzcywgZXZlbnRJZCArIDEpLmJ1aWxkKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3RvcmVMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBPdXRib3VuZEV2ZW50IGNyZWF0ZUl0ZW1FdmVudChmaW5hbCBpbnQgZXZlbnRJZCwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihJdGVtU3RvcmVSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpLmluZm8oIkNyZWF0aW5nIGV2ZW50IGlkIFsiICsgZXZlbnRJZCArICJdIG5hbWUgWyIgKyBuYW1lICsgIl0iKTsKKyAgICAgICAgcmV0dXJuIG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5pZCgiIiArIGV2ZW50SWQpLmRhdGEoU3RyaW5nLmNsYXNzLCBuYW1lKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19zc2VfMS9JdGVtU3RvcmVSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXNzZS0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3NzZV8xL0l0ZW1TdG9yZVJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiZGQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19zc2VfMS9JdGVtU3RvcmVSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19zc2VfMTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRTb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkluYm91bmRFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmRlc2NyaWJlZEFzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaGFzSXRlbXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBJdGVtIHN0b3JlIHRlc3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQElnbm9yZQorcHVibGljIGNsYXNzIEl0ZW1TdG9yZVJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihJdGVtU3RvcmVSZXNvdXJjZUlUQ2FzZS5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTElTVEVORVJTID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lURU1TID0gMTA7CisKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlbVN0b3JlQXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5DT05ORUNUX1RJTUVPVVQsIDE1MDAwKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCwgMjAwMCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUsIE1BWF9MSVNURU5FUlMgKyAxKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBiYXNlVXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpOworICAgICAgICBmaW5hbCBib29sZWFuIGV4dGVybmFsRmFjdG9yeUluVXNlID0gZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSBpbnN0YW5jZW9mIEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CisgICAgICAgIHJldHVybiBleHRlcm5hbEZhY3RvcnlJblVzZSA/IGJhc2VVcmlCdWlsZGVyLnBhdGgoInJlc291cmNlcyIpLmJ1aWxkKCkgOiBiYXNlVXJpQnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGl0ZW0gYWRkaXRpb24sIGFkZGl0aW9uIGV2ZW50IGJyb2FkY2FzdGluZyBhbmQgaXRlbSByZXRyaWV2YWwgZnJvbSB7QGxpbmsgSXRlbVN0b3JlUmVzb3VyY2V9LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVtc1N0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBpdGVtcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAiZm9vIiwKKyAgICAgICAgICAgICAgICAiYmFyIiwKKyAgICAgICAgICAgICAgICAiYmF6IikpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgaXRlbXNUYXJnZXQgPSB0YXJnZXQoIml0ZW1zIik7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKGl0ZW1zLnNpemUoKSAqIE1BWF9MSVNURU5FUlMgKiAyKTsgLy8gY291bnRkb3duIG9uIGFsbCBldmVudHMKKyAgICAgICAgZmluYWwgTGlzdDxRdWV1ZTxJbnRlZ2VyPj4gaW5kZXhRdWV1ZXMgPSBuZXcgQXJyYXlMaXN0PFF1ZXVlPEludGVnZXI+PihNQVhfTElTVEVORVJTKTsKKyAgICAgICAgZmluYWwgRXZlbnRTb3VyY2VbXSBzb3VyY2VzID0gbmV3IEV2ZW50U291cmNlW01BWF9MSVNURU5FUlNdOworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHNpemVFdmVudHNDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0xJU1RFTkVSUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBpOworICAgICAgICAgICAgZmluYWwgRXZlbnRTb3VyY2UgZXMgPSBFdmVudFNvdXJjZS50YXJnZXQoaXRlbXNUYXJnZXQucGF0aCgiZXZlbnRzIikpCisgICAgICAgICAgICAgICAgICAgIC5uYW1lZCgiU09VUkNFICIgKyBpZCkuYnVpbGQoKTsKKyAgICAgICAgICAgIHNvdXJjZXNbaWRdID0gZXM7CisKKyAgICAgICAgICAgIGZpbmFsIFF1ZXVlPEludGVnZXI+IGluZGV4ZXMgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPEludGVnZXI+KCk7CisgICAgICAgICAgICBpbmRleFF1ZXVlcy5hZGQoaW5kZXhlcyk7CisKKyAgICAgICAgICAgIGVzLnJlZ2lzdGVyKG5ldyBFdmVudExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNYWdpY051bWJlciIpCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChJbmJvdW5kRXZlbnQgaW5ib3VuZEV2ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5ib3VuZEV2ZW50LmdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSBpbmJvdW5kRXZlbnQucmVhZERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiWy1pLV0gU09VUkNFICIgKyBpZCArICI6IFJlY2VpdmVkIGV2ZW50IGlkPSIgKyBpbmJvdW5kRXZlbnQuZ2V0SWQoKSArICIgZGF0YT0iICsgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5hZGQoaXRlbXMuaW5kZXhPZihkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzaXplIi5lcXVhbHMoaW5ib3VuZEV2ZW50LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplRXZlbnRzQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiWy14LV0gU09VUkNFICIgKyBpZCArICI6IEVycm9yIGdldHRpbmcgZXZlbnQgZGF0YS4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVzLmFkZCgtOTk5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Blbihzb3VyY2VzKTsKKworICAgICAgICAgICAgZm9yIChTdHJpbmcgaXRlbSA6IGl0ZW1zKSB7CisgICAgICAgICAgICAgICAgcG9zdEl0ZW0oaXRlbXNUYXJnZXQsIGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIHRvIHJlY2VpdmUgYWxsIGV2ZW50cyBoYXMgdGltZWQgb3V0LiIsCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KCgxMDAwICsgTUFYX0xJU1RFTkVSUyAqIEV2ZW50U291cmNlLlJFQ09OTkVDVF9ERUZBVUxUKSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKworICAgICAgICAgICAgLy8gbmVlZCB0byBmb3JjZSBkaXNjb25uZWN0IG9uIHNlcnZlciBpbiBvcmRlciBmb3IgRXZlbnRTb3VyY2UuY2xvc2UoLi4uKSB0byBzdWNjZWVkIHdpdGggSHR0cFVybENvbm5lY3Rpb24KKyAgICAgICAgICAgIHNlbmRDb21tYW5kKGl0ZW1zVGFyZ2V0LCAiZGlzY29ubmVjdCIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2Uoc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcG9zdGVkSXRlbXMgPSBpdGVtc1RhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZvciAoU3RyaW5nIGl0ZW0gOiBpdGVtcykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSXRlbSAnIiArIGl0ZW0gKyAiJyBub3Qgc3RvcmVkIG9uIHNlcnZlci4iLCBwb3N0ZWRJdGVtcy5jb250YWlucyhpdGVtKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcXVldWVJZCA9IDA7CisgICAgICAgIGZvciAoUXVldWU8SW50ZWdlcj4gaW5kZXhlcyA6IGluZGV4UXVldWVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXZlbnQgZm9yICciICsgaXRlbXMuZ2V0KGkpICsgIicgbm90IHJlY2VpdmVkIGluIHF1ZXVlICIgKyBxdWV1ZUlkLCBpbmRleGVzLmNvbnRhaW5zKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTm90IHJlY2VpdmVkIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZXZlbnRzIGluIHF1ZXVlICIgKyBxdWV1ZUlkLCBpdGVtcy5zaXplKCksIGluZGV4ZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHF1ZXVlSWQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIHJlY2VpdmVkICdzaXplJyBldmVudHMgZG9lcyBub3QgbWF0Y2guIiwgaXRlbXMuc2l6ZSgpICogTUFYX0xJU1RFTkVSUywgc2l6ZUV2ZW50c0NvdW50LmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSB7QGxpbmsgRXZlbnRTb3VyY2V9IHJlY29ubmVjdCBmZWF0dXJlLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFdmVudFNvdXJjZVJlY29ubmVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgaXRlbXNUYXJnZXQgPSB0YXJnZXQoIml0ZW1zIik7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1BWF9JVEVNUyAqIE1BWF9MSVNURU5FUlMgKiAyKTsgLy8gY291bnRkb3duIG9ubHkgb24gbmV3IGl0ZW0gZXZlbnRzCisgICAgICAgIGZpbmFsIExpc3Q8UXVldWU8U3RyaW5nPj4gcmVjZWl2ZWRRdWV1ZXMgPSBuZXcgQXJyYXlMaXN0PFF1ZXVlPFN0cmluZz4+KE1BWF9MSVNURU5FUlMpOworICAgICAgICBmaW5hbCBFdmVudFNvdXJjZVtdIHNvdXJjZXMgPSBuZXcgRXZlbnRTb3VyY2VbTUFYX0xJU1RFTkVSU107CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTElTVEVORVJTOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IGk7CisgICAgICAgICAgICBmaW5hbCBFdmVudFNvdXJjZSBlcyA9IEV2ZW50U291cmNlLnRhcmdldChpdGVtc1RhcmdldC5wYXRoKCJldmVudHMiKSkubmFtZWQoIlNPVVJDRSAiICsgaWQpLmJ1aWxkKCk7CisgICAgICAgICAgICBzb3VyY2VzW2lkXSA9IGVzOworCisgICAgICAgICAgICBmaW5hbCBRdWV1ZTxTdHJpbmc+IHJlY2VpdmVkID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTxTdHJpbmc+KCk7CisgICAgICAgICAgICByZWNlaXZlZFF1ZXVlcy5hZGQocmVjZWl2ZWQpOworCisgICAgICAgICAgICBlcy5yZWdpc3RlcihuZXcgRXZlbnRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmJvdW5kRXZlbnQuZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9IGluYm91bmRFdmVudC5yZWFkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJbLWktXSBTT1VSQ0UgIiArIGlkICsgIjogUmVjZWl2ZWQgZXZlbnQgaWQ9IiArIGluYm91bmRFdmVudC5nZXRJZCgpICsgIiBkYXRhPSIgKyBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZC5hZGQoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiWy14LV0gU09VUkNFICIgKyBpZCArICI6IEVycm9yIGdldHRpbmcgZXZlbnQgZGF0YS4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZC5hZGQoIltkYXRhIHByb2Nlc3NpbmcgZXJyb3JdIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBvc3RlZEl0ZW1zID0gbmV3IFN0cmluZ1tNQVhfSVRFTVMgKiAyXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wZW4oc291cmNlcyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lURU1TOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaXRlbSA9IFN0cmluZy5mb3JtYXQoInJvdW5kLTEtJTAyZCIsIGkpOworICAgICAgICAgICAgICAgIHBvc3RJdGVtKGl0ZW1zVGFyZ2V0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWRJdGVtc1tpXSA9IGl0ZW07CisgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQoaXRlbXNUYXJnZXQsICJkaXNjb25uZWN0Iik7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCByZWNvbm5lY3REZWxheSA9IDE7CisgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgInJlY29ubmVjdCAiICsgcmVjb25uZWN0RGVsYXkpOworICAgICAgICAgICAgc2VuZENvbW1hbmQoaXRlbXNUYXJnZXQsICJkaXNjb25uZWN0Iik7CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChyZWNvbm5lY3REZWxheSAqIDEwMDApOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JVEVNUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGl0ZW0gPSBTdHJpbmcuZm9ybWF0KCJyb3VuZC0yLSUwMmQiLCBpKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWRJdGVtc1tpICsgTUFYX0lURU1TXSA9IGl0ZW07CisgICAgICAgICAgICAgICAgcG9zdEl0ZW0oaXRlbXNUYXJnZXQsIGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgInJlY29ubmVjdCBub3ciKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyB0byByZWNlaXZlIGFsbCBldmVudHMgaGFzIHRpbWVkIG91dC4iLAorICAgICAgICAgICAgICAgICAgICBsYXRjaC5hd2FpdCgoMSArIE1BWF9MSVNURU5FUlMgKiAoTUFYX0lURU1TICsgMSkgKiByZWNvbm5lY3REZWxheSkgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAgICAgLy8gbmVlZCB0byBmb3JjZSBkaXNjb25uZWN0IG9uIHNlcnZlciBpbiBvcmRlciBmb3IgRXZlbnRTb3VyY2UuY2xvc2UoLi4uKSB0byBzdWNjZWVkIHdpdGggSHR0cFVybENvbm5lY3Rpb24KKyAgICAgICAgICAgIHNlbmRDb21tYW5kKGl0ZW1zVGFyZ2V0LCAiZGlzY29ubmVjdCIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2Uoc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgc3RvcmVkSXRlbXMgPSBpdGVtc1RhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZvciAoU3RyaW5nIGl0ZW0gOiBwb3N0ZWRJdGVtcykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiUG9zdGVkIGl0ZW0gJyIgKyBpdGVtICsgIicgc3RvcmVkIG9uIHNlcnZlciIsIHN0b3JlZEl0ZW1zLCBjb250YWluc1N0cmluZyhpdGVtKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc291cmNlSWQgPSAwOworICAgICAgICBmb3IgKFF1ZXVlPFN0cmluZz4gcXVldWUgOiByZWNlaXZlZFF1ZXVlcykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiUmVjZWl2ZWQgZXZlbnRzIGluIHNvdXJjZSAiICsgc291cmNlSWQsIHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmliZWRBcygiQ29sbGVjdGlvbiBjb250YWluaW5nICUwIiwgaGFzSXRlbXMocG9zdGVkSXRlbXMpLCBBcnJheXMuYXNMaXN0KHBvc3RlZEl0ZW1zKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJTaXplIG9mIHJlY2VpdmVkIHF1ZXVlIGZvciBzb3VyY2UgIiArIHNvdXJjZUlkLCBxdWV1ZS5zaXplKCksIGVxdWFsVG8ocG9zdGVkSXRlbXMubGVuZ3RoKSk7CisgICAgICAgICAgICBzb3VyY2VJZCsrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3N0SXRlbShmaW5hbCBXZWJUYXJnZXQgaXRlbXNUYXJnZXQsIGZpbmFsIFN0cmluZyBpdGVtKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gaXRlbXNUYXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmZvcm0obmV3IEZvcm0oIm5hbWUiLCBpdGVtKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBvc3RpbmcgbmV3IGl0ZW0gaGFzIGZhaWxlZC4iLCAyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIlstaS1dIFBPU1RlZCBpdGVtOiAnIiArIGl0ZW0gKyAiJyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgb3BlbihmaW5hbCBFdmVudFNvdXJjZVtdIHNvdXJjZXMpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKEV2ZW50U291cmNlIHNvdXJjZSA6IHNvdXJjZXMpIHsKKyAgICAgICAgICAgIHNvdXJjZS5vcGVuKCk7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiWy0tPl0gU09VUkNFICIgKyBpKysgKyAiIG9wZW5lZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2UoZmluYWwgRXZlbnRTb3VyY2VbXSBzb3VyY2VzKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChFdmVudFNvdXJjZSBzb3VyY2UgOiBzb3VyY2VzKSB7CisgICAgICAgICAgICBpZiAoc291cmNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyB0byBjbG9zZSBhIHNvdXJjZSBoYXMgdGltZWQgb3V0LiIsIHNvdXJjZS5jbG9zZSgxLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisvLyAgICAgICAgICAgICAgICAgICAgc291cmNlLmNsb3NlKDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiWzwtLV0gU09VUkNFICIgKyBpKysgKyAiIGNsb3NlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZENvbW1hbmQoZmluYWwgV2ViVGFyZ2V0IGl0ZW1zVGFyZ2V0LCBmaW5hbCBTdHJpbmcgY29tbWFuZCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGl0ZW1zVGFyZ2V0LnBhdGgoImNvbW1hbmRzIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoY29tbWFuZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiciICsgY29tbWFuZCArICInIGNvbW1hbmQgaGFzIGZhaWxlZC4iLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIlstIS1dIENPTU1BTkQgJyIgKyBjb21tYW5kICsgIicgaGFzIGJlZW4gcHJvY2Vzc2VkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3NTYxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9wb20ueG1sCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBwZXItYmluZGluZy0yPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBSZXF1ZXN0IHdyYXBwZXIgYmluZGluZyAyIC0gU2VydmxldENvbnRhaW5lclByb3ZpZGVyRmFjdG9yeSwgU2VydmxldENvbnRhaW5lclByb3ZpZGVyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2bGV0LXBvcnRhYmlsaXR5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIvSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIvSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlM2Y0NjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9KYXhSc0FwcGxpY2F0aW9uQXV0b2RldGVjdGVkLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUZXN0IGFwcGxpY2F0aW9uLiBUaGlzIG9uZSBnZXRzIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJhdXRvZGV0ZWN0ZWQiKQorcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChSZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBhZGQoUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRTaW5nbGV0b25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIvUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIvUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzcwYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKKy8qKgorICogVGVzdCByZXNvdXJjZSB0aGF0IGdldHMgaW5qZWN0ZWQgd2l0aCB0aGUgYWN0dWFsIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IGFuZAorICoge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IGluc3RhbmNlLCBzbyB0aGF0IHdlIGNvdWxkIHRlc3RpZnkgY3VzdG9tIGltcGxlbWVudGF0aW9ucworICogaGFzIGJlZW4gdXNlZCB0aGVyZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKworICAgIEBDb250ZXh0CisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAQ29udGV4dAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3RUeXBlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNhbiBhY2Nlc3MgdW5kZXJseWluZyByZXF1ZXN0IGZyb20gYW5vdGhlciB0aHJlYWQKKyAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8U3RyaW5nPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikgcmVxdWVzdCkuZ2V0UmVxdWVzdCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KS5nZXQoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlc3BvbnNlVHlwZSIpCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVR5cGUoKSB7CisKKyAgICAgICAgcmV0dXJuICgoSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpIHJlc3BvbnNlKS5nZXRSZXNwb25zZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyL1JlcXVlc3RSZXNwb25zZUluamVjdGVkU2luZ2xldG9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyL1JlcXVlc3RSZXNwb25zZUluamVjdGVkU2luZ2xldG9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE2ZjdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIvUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRTaW5nbGV0b25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIHRoYXQgZ2V0cyBpbmplY3RlZCB3aXRoIHRoZSBhY3R1YWwge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gYW5kCisgKiB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gaW5zdGFuY2UsIHNvIHRoYXQgd2UgY291bGQgdGVzdGlmeSBjdXN0b20gaW1wbGVtZW50YXRpb25zCisgKiBoYXMgYmVlbiB1c2VkIHRoZXJlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvc2luZ2xldG9uIikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFNpbmdsZXRvblJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAQ29udGV4dAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3RUeXBlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RUeXBlKCkgeworCisgICAgICAgIHJldHVybiAoKEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIpIHJlcXVlc3QpLmdldFJlcXVlc3QoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3QvcGFyYW0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdEF0dHIoKSB7CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJxIik7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXNwb25zZVR5cGUiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VUeXBlKCkgeworCisgICAgICAgIHJldHVybiAoKEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKSByZXNwb25zZSkuZ2V0UmVzcG9uc2UoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9SZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyL1JlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTBhNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9SZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDgzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkFzeW5jQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkRpc3BhdGNoZXJUeXBlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkNvb2tpZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLlBhcnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkRlbGF5ZWRIazJJbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSW1tZWRpYXRlSGsySW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlJlZmVyZW5jaW5nRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlJlcXVlc3RTY29wZWRJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5Ob09wU2VydmxldENvbnRhaW5lclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlJlcXVlc3RDb250ZXh0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRGVzY3JpcHRvclR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkRlc2NyaXB0b3JWaXNpYmlsaXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5QZXJMb29rdXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VIYW5kbGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5UeXBlTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuQWJzdHJhY3RBY3RpdmVEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5TZXJ2aWNlTG9jYXRvclV0aWxpdGllczsKKworaW1wb3J0IG9yZy5qdm5ldC5oazIuaW50ZXJuYWwuU2VydmljZUhhbmRsZUltcGw7CisKKy8qKgorICogU2VydmxldCBjb250YWluZXIgcHJvdmlkZXIgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgU2VydmxldCByZXF1ZXN0L3Jlc3BvbnNlLgorICogVGhlIHJlcXVlc3Qgd3JhcHBlciBjb250YWlucyBhIGRpcmVjdCByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgY29udGFpbmVyIHJlcXVlc3QKKyAqIGluIGNhc2UgaXQgZ2V0cyBpbmplY3RlZCBpbnRvIGEgcmVxdWVzdCBzY29wZWQgY29tcG9uZW50LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIgZXh0ZW5kcyBOb09wU2VydmxldENvbnRhaW5lclByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgVHlwZSBSRVFVRVNUX1RZUEUgPSAobmV3IFR5cGVMaXRlcmFsPFJlZjxIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyPj4oKSB7CisgICAgfSkuZ2V0VHlwZSgpOworICAgIHByaXZhdGUgZmluYWwgVHlwZSBSRVNQT05TRV9UWVBFID0gKG5ldyBUeXBlTGl0ZXJhbDxSZWY8SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI+PigpIHsKKyAgICB9KS5nZXRUeXBlKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NyaXB0b3JQcm92aWRlciBpbXBsZW1lbnRzIENvbXBvbmVudFByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRTZXJ2aWNlTG9jYXRvcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgICAgIFNlcnZpY2VMb2NhdG9yVXRpbGl0aWVzLmFkZE9uZURlc2NyaXB0b3IobG9jYXRvciwgbmV3IEh0dHBTZXJ2bGV0UmVxdWVzdERlc2NyaXB0b3IobG9jYXRvcikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJpbmQoQ2xhc3M8Pz4gY29tcG9uZW50LCBTZXQ8Q2xhc3M8Pz4+IHByb3ZpZGVyQ29udHJhY3RzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZG9uZSgpIHsKKyAgICAgICAgICAgIC8vIG5vcAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3Mgc3RhbmRhcmQgd3JhcHBlciBzbyB0aGF0IHdlIG1ha2UgMTAwICUgc3VyZSB3ZSBhcmUgZ2V0dGluZyB0aGUgcmlnaHQgdHlwZS4KKyAgICAgKiBJdCBpcyBhbHNvIGZpbmFsLCBpLmUuIG5vdCBwcm94aWFibGUsIHdoaWNoIHdlIHdvcmthcm91bmQgYnkgdXNpbmcgY3VzdG9tIGh0dHAgc2VydmxldCByZXF1ZXN0IGltcGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXF1ZXN0V3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgeworCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0V3JhcHBlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgc3VwZXIocmVxdWVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzcyBzdGFuZGFyZCB3cmFwcGVyIHNvIHRoYXQgd2UgbWFrZSAxMDAgJSBzdXJlIHdlIGFyZSBnZXR0aW5nIHRoZSByaWdodCB0eXBlLgorICAgICAqIEl0IGlzIGFsc28gZmluYWwsIGkuZS4gbm90IHByb3hpYWJsZSwgd2hpY2ggd2Ugd29ya2Fyb3VuZCBieSB1c2luZyBjdXN0b20gaHR0cCBzZXJ2bGV0IHJlc3BvbnNlIGltcGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNwb25zZVdyYXBwZXIgZXh0ZW5kcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB7CisKKyAgICAgICAgcHVibGljIFJlc3BvbnNlV3JhcHBlcihIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICBzdXBlcihyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kc1NlcnZsZXRSZXF1ZXN0UmVzcG9uc2UoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlciBnZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyIGdldChmaW5hbCBSZXF1ZXN0Q29udGV4dFByb3ZpZGVyIGNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RTY29wZWRJbml0aWFsaXplcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTG9jYXRvciBsb2NhdG9yID0gZ2V0U2VydmljZUxvY2F0b3IoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLjxSZWY8SHR0cFNlcnZsZXRSZXF1ZXN0Pj5nZXRTZXJ2aWNlKFJFUVVFU1RfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldChmaW5hbFdyYXAoY29udGV4dC5nZXRIdHRwU2VydmxldFJlcXVlc3QoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRvci48UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2U+PmdldFNlcnZpY2UoUkVTUE9OU0VfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldChmaW5hbFdyYXAoY29udGV4dC5nZXRIdHRwU2VydmxldFJlc3BvbnNlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKworICAgICAgICAgICAgYmluZEZhY3RvcnkoSHR0cFNlcnZsZXRSZXF1ZXN0UmVmZXJlbmNpbmdGYWN0b3J5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlci5jbGFzcykuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgIGJpbmRGYWN0b3J5KFJlZmVyZW5jaW5nRmFjdG9yeS48SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcj5yZWZlcmVuY2VGYWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8UmVmPEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgfSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgIGJpbmRGYWN0b3J5KEh0dHBTZXJ2bGV0UmVzcG9uc2VGYWN0b3J5LmNsYXNzKS50byhIdHRwU2VydmxldFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICAgICAgYmluZEZhY3RvcnkoSHR0cFNlcnZsZXRSZXNwb25zZVJlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyLmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgYmluZEZhY3RvcnkoUmVmZXJlbmNpbmdGYWN0b3J5LjxIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcj5yZWZlcmVuY2VGYWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPj4oKSB7CisgICAgICAgICAgICAgICAgICAgIH0pLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIdHRwU2VydmxldFJlcXVlc3REZXNjcmlwdG9yIGV4dGVuZHMgQWJzdHJhY3RBY3RpdmVEZXNjcmlwdG9yPEh0dHBTZXJ2bGV0UmVxdWVzdD4geworCisgICAgICAgIHN0YXRpYyBTZXQ8VHlwZT4gYWR2ZXJ0aXNlZENvbnRyYWN0cyA9IG5ldyBIYXNoU2V0PFR5cGU+KCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3I7CisgICAgICAgIHZvbGF0aWxlIGphdmF4LmluamVjdC5Qcm92aWRlcjxSZWY8SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcj4+IHJlcXVlc3Q7CisKKyAgICAgICAgcHVibGljIEh0dHBTZXJ2bGV0UmVxdWVzdERlc2NyaXB0b3IoZmluYWwgU2VydmljZUxvY2F0b3IgbG9jYXRvcikgeworICAgICAgICAgICAgc3VwZXIoYWR2ZXJ0aXNlZENvbnRyYWN0cywKKyAgICAgICAgICAgICAgICAgICAgUGVyTG9va3VwLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgSGFzaFNldDxBbm5vdGF0aW9uPigpLAorICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yVHlwZS5DTEFTUywgRGVzY3JpcHRvclZpc2liaWxpdHkuTE9DQUwsCisgICAgICAgICAgICAgICAgICAgIDAsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBIdHRwU2VydmxldFJlcXVlc3QuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFR5cGUgZ2V0SW1wbGVtZW50YXRpb25UeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEltcGxlbWVudGF0aW9uQ2xhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBIdHRwU2VydmxldFJlcXVlc3QuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBIdHRwU2VydmxldFJlcXVlc3QgY3JlYXRlKFNlcnZpY2VIYW5kbGU8Pz4gc2VydmljZUhhbmRsZSkgeworICAgICAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBsb2NhdG9yLmdldFNlcnZpY2UobmV3IFR5cGVMaXRlcmFsPFByb3ZpZGVyPFJlZjxIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyPj4+KCkgeworICAgICAgICAgICAgICAgIH0uZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbGVhbiBkaXJlY3QgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHNlcnZpY2VIYW5kbGUgaW5zdGFuY2VvZiBTZXJ2aWNlSGFuZGxlSW1wbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZpY2VIYW5kbGVJbXBsIHNlcnZpY2VIYW5kbGVJbXBsID0gKFNlcnZpY2VIYW5kbGVJbXBsKSBzZXJ2aWNlSGFuZGxlOworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZUFubm90YXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZUhhbmRsZUltcGwuZ2V0T3JpZ2luYWxSZXF1ZXN0KCkuZ2V0SW5qZWN0ZWVEZXNjcmlwdG9yKCkuZ2V0U2NvcGVBbm5vdGF0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc2NvcGVBbm5vdGF0aW9uID09IFJlcXVlc3RTY29wZWQuY2xhc3MgfHwgc2NvcGVBbm5vdGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgcmV0dXJuICFkaXJlY3QgPyBuZXcgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihuZXcgTXlIdHRwU2VydmxldFJlcXVlc3RJbXBsKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCBnZXRIdHRwU2VydmxldFJlcXVlc3QoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmdldCgpLmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU2VydmxldFJlcXVlc3QgZ2V0UmVxdWVzdCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0KCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIDogbmV3IEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIocmVxdWVzdC5nZXQoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIdHRwU2VydmxldFJlc3BvbnNlRmFjdG9yeSBpbXBsZW1lbnRzIFN1cHBsaWVyPEh0dHBTZXJ2bGV0UmVzcG9uc2U+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBqYXZheC5pbmplY3QuUHJvdmlkZXI8UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPj4gcmVzcG9uc2U7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZUZhY3RvcnkoamF2YXguaW5qZWN0LlByb3ZpZGVyPFJlZjxIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcj4+IHJlc3BvbnNlKSB7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFBlckxvb2t1cAorICAgICAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyKG5ldyBIdHRwU2VydmxldFJlc3BvbnNlKCkgeworCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5nZXQoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb29raWUoQ29va2llIGNvb2tpZSkgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuYWRkQ29va2llKGNvb2tpZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNIZWFkZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5jb250YWluc0hlYWRlcihzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVSTChTdHJpbmcgcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmVuY29kZVVSTChzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VVJMKFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZW5jb2RlUmVkaXJlY3RVUkwocyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVVcmwocyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBlbmNvZGVSZWRpcmVjdFVybChTdHJpbmcgcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmVuY29kZVJlZGlyZWN0VXJsKHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRFcnJvcihpbnQgaSwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZW5kRXJyb3IoaSwgcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuc2VuZEVycm9yKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRSZWRpcmVjdChTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNlbmRSZWRpcmVjdChzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRlSGVhZGVyKFN0cmluZyBzLCBsb25nIGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldERhdGVIZWFkZXIocywgbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkRGF0ZUhlYWRlcihTdHJpbmcgcywgbG9uZyBsKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5hZGREYXRlSGVhZGVyKHMsIGwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgaCwgU3RyaW5nIHYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldEhlYWRlcihoLCB2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEhlYWRlck5hbWVzKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRIZWFkZXJzKFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZ2V0SGVhZGVycyhzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldEhlYWRlcihzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIGgsIFN0cmluZyB2KSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5hZGRIZWFkZXIoaCwgdik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW50SGVhZGVyKFN0cmluZyBzLCBpbnQgaSkgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuc2V0SW50SGVhZGVyKHMsIGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEludEhlYWRlcihTdHJpbmcgcywgaW50IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZEludEhlYWRlcihzLCBpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldFN0YXR1cyhpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5nZXRTdGF0dXMoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IGksIFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRTdGF0dXMoaSwgcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGFyYWN0ZXJFbmNvZGluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5nZXRDaGFyYWN0ZXJFbmNvZGluZygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZ2V0Q29udGVudFR5cGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBQcmludFdyaXRlciBnZXRXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldFdyaXRlcigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRDaGFyYWN0ZXJFbmNvZGluZyhzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRDb250ZW50TGVuZ3RoKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlKFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRDb250ZW50VHlwZShzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRCdWZmZXJTaXplKGludCBpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRCdWZmZXJTaXplKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyU2l6ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5nZXRCdWZmZXJTaXplKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldEJ1ZmZlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnJlc2V0QnVmZmVyKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb21taXR0ZWQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuaXNDb21taXR0ZWQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TG9jYWxlKExvY2FsZSBsb2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldExvY2FsZShsb2NhbGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldExvY2FsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTZXJ2bGV0UmVzcG9uc2UgZ2V0UmVzcG9uc2UoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5nZXQoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YURvYyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSHR0cFNlcnZsZXRSZXF1ZXN0UmVmZXJlbmNpbmdGYWN0b3J5IGV4dGVuZHMgUmVmZXJlbmNpbmdGYWN0b3J5PEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI+IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBIdHRwU2VydmxldFJlcXVlc3RSZWZlcmVuY2luZ0ZhY3RvcnkoCisgICAgICAgICAgICAgICAgZmluYWwgamF2YXguaW5qZWN0LlByb3ZpZGVyPFJlZjxIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyPj4gcmVmZXJlbmNlRmFjdG9yeSkgeworCisgICAgICAgICAgICBzdXBlcihyZWZlcmVuY2VGYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhRG9jIikKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIdHRwU2VydmxldFJlc3BvbnNlUmVmZXJlbmNpbmdGYWN0b3J5IGV4dGVuZHMgUmVmZXJlbmNpbmdGYWN0b3J5PEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPiB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZVJlZmVyZW5jaW5nRmFjdG9yeSgKKyAgICAgICAgICAgICAgICBmaW5hbCBqYXZheC5pbmplY3QuUHJvdmlkZXI8UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPj4gcmVmZXJlbmNlRmFjdG9yeSkgeworCisgICAgICAgICAgICBzdXBlcihyZWZlcmVuY2VGYWN0b3J5KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG5ldyBCaW5kZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgZmluYWxXcmFwKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdFdyYXBwZXIocmVxdWVzdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIGZpbmFsV3JhcChmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2VXcmFwcGVyKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBNeUh0dHBTZXJ2bGV0UmVxdWVzdEltcGwgaW1wbGVtZW50cyBIdHRwU2VydmxldFJlcXVlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEF1dGhUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuYXV0aGVudGljYXRlKHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FzeW5jU3VwcG9ydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzQXN5bmNTdXBwb3J0ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FzeW5jU3RhcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5pc0FzeW5jU3RhcnRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBc3luY0NvbnRleHQgc3RhcnRBc3luYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLnN0YXJ0QXN5bmMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXN5bmNDb250ZXh0IHN0YXJ0QXN5bmMoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5zdGFydEFzeW5jKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IEh0dHBTZXJ2bGV0UmVxdWVzdCBnZXRIdHRwU2VydmxldFJlcXVlc3QoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvb2tpZVtdIGdldENvb2tpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0Q29va2llcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldERhdGVIZWFkZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXREYXRlSGVhZGVyKHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQYXJ0IGdldFBhcnQoU3RyaW5nIHMpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UGFydChzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxQYXJ0PiBnZXRQYXJ0cygpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UGFydHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlcihTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEhlYWRlcihzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVycyhTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEhlYWRlcnMocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEhlYWRlck5hbWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRJbnRIZWFkZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRJbnRIZWFkZXIocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0TWV0aG9kKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoSW5mbygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRQYXRoSW5mbygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFRyYW5zbGF0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UGF0aFRyYW5zbGF0ZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldENvbnRleHRQYXRoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRRdWVyeVN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlVXNlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRSZW1vdGVVc2VyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuaXNVc2VySW5Sb2xlKHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdGVkU2Vzc2lvbklkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VVJJKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFJlcXVlc3RVUkwoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdFVSTCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldFBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSHR0cFNlc3Npb24gZ2V0U2Vzc2lvbihib29sZWFuIGIpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRTZXNzaW9uKGIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFNlc3Npb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZFZhbGlkKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tQ29va2llKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVSTCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VcmwoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEF0dHJpYnV0ZShzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0QXR0cmlidXRlTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIHMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLnNldENoYXJhY3RlckVuY29kaW5nKHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRDb250ZW50VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXJ2bGV0SW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXIocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFBhcmFtZXRlclZhbHVlcyhzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwIGdldFBhcmFtZXRlck1hcCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRQYXJhbWV0ZXJNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3RvY29sKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFByb3RvY29sKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0U2NoZW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFNlcnZlck5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFNlcnZlclBvcnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0U2VydmVyUG9ydCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWZmZXJlZFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlYWRlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlQWRkcigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRSZW1vdGVBZGRyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlbW90ZUhvc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIHMsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5zZXRBdHRyaWJ1dGUocywgbyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBzKSB7CisgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5yZW1vdmVBdHRyaWJ1dGUocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0TG9jYWxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudW1lcmF0aW9uIGdldExvY2FsZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0TG9jYWxlcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzU2VjdXJlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlcXVlc3REaXNwYXRjaGVyIGdldFJlcXVlc3REaXNwYXRjaGVyKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdERpc3BhdGNoZXIocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWFsUGF0aChTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlYWxQYXRoKHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRSZW1vdGVQb3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0TG9jYWxOYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbEFkZHIoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0TG9jYWxBZGRyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRMb2NhbFBvcnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERpc3BhdGNoZXJUeXBlIGdldERpc3BhdGNoZXJUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldERpc3BhdGNoZXJUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFzeW5jQ29udGV4dCBnZXRBc3luY0NvbnRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0QXN5bmNDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbG9nb3V0KCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkubG9nb3V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbG9naW4oU3RyaW5nIHUsIFN0cmluZyBwKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5sb2dpbih1LCBwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNlcnZpY2VMb2NhdG9yIGdldFNlcnZpY2VMb2NhdG9yKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBpZiAoaW5qZWN0aW9uTWFuYWdlciBpbnN0YW5jZW9mIEltbWVkaWF0ZUhrMkluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAgKChJbW1lZGlhdGVIazJJbmplY3Rpb25NYW5hZ2VyKSBpbmplY3Rpb25NYW5hZ2VyKS5nZXRTZXJ2aWNlTG9jYXRvcigpOworICAgICAgICB9IGVsc2UgaWYgKGluamVjdGlvbk1hbmFnZXIgaW5zdGFuY2VvZiBEZWxheWVkSGsySW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICAgICAgcmV0dXJuICAoKERlbGF5ZWRIazJJbmplY3Rpb25NYW5hZ2VyKSBpbmplY3Rpb25NYW5hZ2VyKS5nZXRTZXJ2aWNlTG9jYXRvcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgSW5qZWN0aW9uTWFuYWdlciIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzgwZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIuUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyJERlc2NyaXB0b3JQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzODUxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyLlJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiMDVjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICAgICB2ZXJzaW9uPSIzLjAiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5QXBwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyLlJlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2UsCisgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIuUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRTaW5nbGV0b25SZXNvdXJjZQorICAgICAgICAgICAgPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleUFwcDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3dlYnhtbGNvbmZpZ3VyZWQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjIvQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyL0Fic3RyYWN0UmVxdWVzdFJlc3BvbnNlVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMxNDUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyL0Fic3RyYWN0UmVxdWVzdFJlc3BvbnNlVHlwZVRlc3QuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyMjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi5SZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogTWFrZSBzdXJlIHRoYXQgaW5qZWN0ZWQgcmVxdWVzdC9yZXNwb25zZSBpbnN0YW5jZXMKKyAqIGFyZSBvZiB0aGUgdHlwZXMgaW5qZWN0ZWQgYnkge0BsaW5rIFJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVxdWVzdFJlc3BvbnNlVHlwZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RUeXBlID0gdGFyZ2V0KGdldEFwcEJhc2VQYXRoKCkpLnBhdGgoInJlcXVlc3RUeXBlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RUeXBlLCBpcyhlcXVhbFRvKFJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5SZXF1ZXN0V3JhcHBlci5jbGFzcy5nZXROYW1lKCkpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VHlwZSA9IHRhcmdldChnZXRBcHBCYXNlUGF0aCgpKS5wYXRoKCJyZXNwb25zZVR5cGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdFR5cGUsIGlzKGVxdWFsVG8oUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLlJlc3BvbnNlV3JhcHBlci5jbGFzcy5nZXROYW1lKCkpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uUmVxdWVzdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RUeXBlID0gdGFyZ2V0KGdldEFwcEJhc2VQYXRoKCkpLnBhdGgoInNpbmdsZXRvbi9yZXF1ZXN0VHlwZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0VHlwZSwgaXMoZXF1YWxUbyhSZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIuUmVxdWVzdFdyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvblJlcXVlc3RBdHRyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoU3RyaW5nIHEgOiBuZXcgU3RyaW5nW10geyIxIiwgIjIiLCAiMyIsICI5NSIsICI5OCIsICJOVCIsICIyMDAwIiwgIlhQIiwgIlZpc3RhIiwgIjciLCAiOCIsICIxMCJ9KSB7CisgICAgICAgICAgICBfdGVzdFNpbmdsZXRvblJlcXVlc3RBdHRyKCJvbmUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0U2luZ2xldG9uUmVxdWVzdEF0dHIoU3RyaW5nIHEpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFR5cGUgPSB0YXJnZXQoZ2V0QXBwQmFzZVBhdGgoKSkucGF0aCgic2luZ2xldG9uL3JlcXVlc3QvcGFyYW0iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgcSkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RUeXBlLCBpcyhlcXVhbFRvKHEpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uUmVzcG9uc2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VHlwZSA9IHRhcmdldChnZXRBcHBCYXNlUGF0aCgpKS5wYXRoKCJzaW5nbGV0b24vcmVzcG9uc2VUeXBlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RUeXBlLCBpcyhlcXVhbFRvKFJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5SZXNwb25zZVdyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKSkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QXBwQmFzZVBhdGgoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyMi9BdXRvZGV0ZWN0ZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjIvQXV0b2RldGVjdGVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTYwNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjIvQXV0b2RldGVjdGVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi5KYXhSc0FwcGxpY2F0aW9uQXV0b2RldGVjdGVkOworCisvKioKKyAqIFRlc3QgZm9yIHRoZSBhdXRvZGV0ZWN0ZWQgSkFYLVJTIGFwcC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXV0b2RldGVjdGVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFJlc3BvbnNlVHlwZVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBcHBCYXNlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICJhdXRvZGV0ZWN0ZWQiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKEpheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyMi9XZWJYbWxDb25maWd1cmVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyL1dlYlhtbENvbmZpZ3VyZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwMjhkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyMi9XZWJYbWxDb25maWd1cmVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi5SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlOworCisvKioKKyAqIFRlc3QgZm9yIHRoZSB3ZWIueG1sIGNvbmZpZ3VyZWQgSkFYLVJTIGFwcC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgV2ViWG1sQ29uZmlndXJlZEFwcFJlcXVlc3RSZXNwb25zZVR5cGVJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RSZXNwb25zZVR5cGVUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QXBwQmFzZVBhdGgoKSB7CisgICAgICAgIHJldHVybiAid2VieG1sY29uZmlndXJlZCI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4NjljNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvcG9tLnhtbApAQCAtMCwwICsxLDgxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC1yZXF1ZXN0LXdyYXBwcGVyLWJpbmRpbmc8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBSZXF1ZXN0IHdyYXBwZXIgYmluZGluZyAtIFNlcnZsZXRDb250YWluZXJQcm92aWRlckZhY3RvcnksIFNlcnZsZXRDb250YWluZXJQcm92aWRlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmxldC1wb3J0YWJpbGl0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nL0pheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nL0pheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmU0MTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcvSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUZXN0IGFwcGxpY2F0aW9uLiBUaGlzIG9uZSBnZXRzIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJhdXRvZGV0ZWN0ZWQiKQorcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChSZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZy9SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZy9SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRjYzY5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nL1JlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmc7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKKy8qKgorICogVGVzdCByZXNvdXJjZSB0aGF0IGdldHMgaW5qZWN0ZWQgd2l0aCB0aGUgYWN0dWFsIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3R9IGFuZAorICoge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IGluc3RhbmNlLCBzbyB0aGF0IHdlIGNvdWxkIHRlc3RpZnkgY3VzdG9tIGltcGxlbWVudGF0aW9ucworICogaGFzIGJlZW4gdXNlZCB0aGVyZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCisgICAgQENvbnRleHQKKyAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0VHlwZSIpCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0VHlwZSgpIHsKKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlc3BvbnNlVHlwZSIpCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVR5cGUoKSB7CisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nL1JlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcvUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmNDBhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nL1JlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlJlcXVlc3RTY29wZWRJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5Ob09wU2VydmxldENvbnRhaW5lclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyOworCisvKioKKyAqIFNlcnZsZXQgY29udGFpbmVyIHByb3ZpZGVyIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIFNlcnZsZXQgcmVxdWVzdC9yZXNwb25zZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyIGV4dGVuZHMgTm9PcFNlcnZsZXRDb250YWluZXJQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzcyBzdGFuZGFyZCB3cmFwcGVyIHNvIHRoYXQgd2UgbWFrZSAxMDAgJSBzdXJlIHdlIGFyZSBnZXR0aW5nIHRoZSByaWdodCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdFdyYXBwZXIgZXh0ZW5kcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKKworICAgICAgICBwdWJsaWMgUmVxdWVzdFdyYXBwZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlcXVlc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3Mgc3RhbmRhcmQgd3JhcHBlciBzbyB0aGF0IHdlIG1ha2UgMTAwICUgc3VyZSB3ZSBhcmUgZ2V0dGluZyB0aGUgcmlnaHQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlV3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworICAgICAgICBwdWJsaWMgUmVzcG9uc2VXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlciBnZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQgLT4gKFJlcXVlc3RTY29wZWRJbml0aWFsaXplcikgaW5qZWN0aW9uTWFuYWdlciAtPiB7CisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLjxSZWY8SHR0cFNlcnZsZXRSZXF1ZXN0Pj5nZXRJbnN0YW5jZShIVFRQX1NFUlZMRVRfUkVRVUVTVF9UWVBFKQorICAgICAgICAgICAgICAgICAgICAuc2V0KHdyYXBwZWQoY29udGV4dC5nZXRIdHRwU2VydmxldFJlcXVlc3QoKSkpOworICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci48UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2U+PmdldEluc3RhbmNlKEhUVFBfU0VSVkxFVF9SRVNQT05TRV9UWVBFKQorICAgICAgICAgICAgICAgICAgICAuc2V0KHdyYXBwZWQoY29udGV4dC5nZXRIdHRwU2VydmxldFJlc3BvbnNlKCkpKTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCB3cmFwcGVkKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdFdyYXBwZXIocmVxdWVzdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIHdyYXBwZWQoZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlV3JhcHBlcihyZXNwb25zZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTdmN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZy5SZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlZTU5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgICAgdmVyc2lvbj0iMy4wIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleUFwcDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nLlJlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5QXBwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vd2VieG1sY29uZmlndXJlZC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlci9BYnN0cmFjdFJlcXVlc3RSZXNwb25zZVR5cGVUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIvQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDcxMGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIvQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZy5SZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogTWFrZSBzdXJlIHRoYXQgaW5qZWN0ZWQgcmVxdWVzdC9yZXNwb25zZSBpbnN0YW5jZXMKKyAqIGFyZSBvZiB0aGUgdHlwZXMgaW5qZWN0ZWQgYnkge0BsaW5rIFJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVxdWVzdFJlc3BvbnNlVHlwZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RUeXBlID0gdGFyZ2V0KGdldEFwcEJhc2VQYXRoKCkpLnBhdGgoInJlcXVlc3RUeXBlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RUeXBlLCBpcyhlcXVhbFRvKFJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5SZXF1ZXN0V3JhcHBlci5jbGFzcy5nZXROYW1lKCkpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VHlwZSA9IHRhcmdldChnZXRBcHBCYXNlUGF0aCgpKS5wYXRoKCJyZXNwb25zZVR5cGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdFR5cGUsIGlzKGVxdWFsVG8oUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLlJlc3BvbnNlV3JhcHBlci5jbGFzcy5nZXROYW1lKCkpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBcHBCYXNlUGF0aCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyL0F1dG9kZXRlY3RlZEFwcFJlcXVlc3RSZXNwb25zZVR5cGVJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlci9BdXRvZGV0ZWN0ZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3NDAzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlci9BdXRvZGV0ZWN0ZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZy5KYXhSc0FwcGxpY2F0aW9uQXV0b2RldGVjdGVkOworCisvKioKKyAqIFRlc3QgZm9yIHRoZSBhdXRvZGV0ZWN0ZWQgSkFYLVJTIGFwcC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXV0b2RldGVjdGVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFJlc3BvbnNlVHlwZVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBcHBCYXNlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICJhdXRvZGV0ZWN0ZWQiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKEpheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlci9XZWJYbWxDb25maWd1cmVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyL1dlYlhtbENvbmZpZ3VyZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhODVhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlci9XZWJYbWxDb25maWd1cmVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcuUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZTsKKworLyoqCisgKiBUZXN0IGZvciB0aGUgd2ViLnhtbCBjb25maWd1cmVkIEpBWC1SUyBhcHAuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFdlYlhtbENvbmZpZ3VyZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFwcEJhc2VQYXRoKCkgeworICAgICAgICByZXR1cm4gIndlYnhtbGNvbmZpZ3VyZWQiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTg1MmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3BvbS54bWwKQEAgLTAsMCArMSw3MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtdGVzdHM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC10ZXN0czwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXQgb2Ygc21hbGxlciB1bnJlbGF0ZWQgc2VydmxldC1zcGVjaWZpYyB0ZXN0cy48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0NhY2hlQ29udHJvbE9uNDA0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ2FjaGVDb250cm9sT240MDRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2E0NjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0NhY2hlQ29udHJvbE9uNDA0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ2FjaGVDb250cm9sOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCI0MDQiKQorcHVibGljIGNsYXNzIENhY2hlQ29udHJvbE9uNDA0UmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0NDA0KCkgeworICAgICAgICBDYWNoZUNvbnRyb2wgY2MgPSBuZXcgQ2FjaGVDb250cm9sKCk7CisgICAgICAgIGNjLnNldE1heEFnZSgxMCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkuY2FjaGVDb250cm9sKGNjKS50eXBlKCJ0ZXh0L3BsYWluIikuZW50aXR5KCI0MDQgTm90IEZvdW5kIikuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0N1c3RvbU1lZGlhVHlwZUFuZDQwNFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0N1c3RvbU1lZGlhVHlwZUFuZDQwNFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkMjk1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ3VzdG9tTWVkaWFUeXBlQW5kNDA0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFBhdGgoInJlc291cmNlNDA0IikKK3B1YmxpYyBjbGFzcyBDdXN0b21NZWRpYVR5cGVBbmQ0MDRSZXNvdXJjZSB7CisgICAgQFBhdGgoImNvbnRlbnQtdHlwZS1lbnRpdHkiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0U3BlY2lhbENvbnRlbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQpLnR5cGUoImFwcGxpY2F0aW9uL3NvbWV0aGluZyIpLmVudGl0eSgibm90IGZvdW5kIGN1c3RvbSBlbnRpdHkiKS5idWlsZCgpOworICAgIH0KKworICAgIEBQYXRoKCJjb250ZW50LXR5cGUtZW1wdHktZW50aXR5IikKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGdldFNwZWNpYWxDb250ZW50VHlwZVdpdGhFbXB0eUVudGl0eVN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5EKS50eXBlKCJhcHBsaWNhdGlvbi9zb21ldGhpbmciKS5lbnRpdHkoIiIpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9GaWx0ZXJDb250ZXh0UGF0aFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlckNvbnRleHRQYXRoUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWI1YzJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9GaWx0ZXJDb250ZXh0UGF0aFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFBhdGgoImNvbnRleHRQYXRoUmVzb3VyY2UiKQorcHVibGljIGNsYXNzIEZpbHRlckNvbnRleHRQYXRoUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJjb250ZXh0UGF0aFJlc291cmNlIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlckZvcndhcmRPbjQwNFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlckZvcndhcmRPbjQwNFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2YjAwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyRm9yd2FyZE9uNDA0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgiZm9yd2FyZGluZ0ZpbHRlci9yZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgRmlsdGVyRm9yd2FyZE9uNDA0UmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJmb3J3YXJkaW5nRmlsdGVyL3Jlc291cmNlIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlck5vQ29udGV4dFBhdGhSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9GaWx0ZXJOb0NvbnRleHRQYXRoUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzlhMmQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9GaWx0ZXJOb0NvbnRleHRQYXRoUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgiZmlsdGVyL3Jlc291cmNlIikKK3B1YmxpYyBjbGFzcyBGaWx0ZXJOb0NvbnRleHRQYXRoUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJmaWx0ZXIvcmVzb3VyY2UiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyU3RhdGljQ29udGVudFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlclN0YXRpY0NvbnRlbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NmFiNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlclN0YXRpY0NvbnRlbnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJzdGF0aWNDb250ZW50RmlsdGVyL3Jlc291cmNlIikKK3B1YmxpYyBjbGFzcyBGaWx0ZXJTdGF0aWNDb250ZW50UmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJzdGF0aWNDb250ZW50RmlsdGVyL3Jlc291cmNlIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0Zvcm1Db25zdW1wdGlvbkZpbHRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3JtQ29uc3VtcHRpb25GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGEwZDNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3JtQ29uc3VtcHRpb25GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgRm9ybUNvbnN1bXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2Ugc2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBmaWx0ZXJDaGFpbikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbnN1bWUgZW50aXR5CisgICAgICAgIHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlcigidGV4dCIpOworICAgICAgICBmaWx0ZXJDaGFpbi5kb0ZpbHRlcihzZXJ2bGV0UmVxdWVzdCwgc2VydmxldFJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRm9ybUNvbnN1bXB0aW9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRm9ybUNvbnN1bXB0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDkxMGZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3JtQ29uc3VtcHRpb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgiZm9ybS1jb25zdW1wdGlvbiIpCitwdWJsaWMgY2xhc3MgRm9ybUNvbnN1bXB0aW9uUmVzb3VyY2UgeworICAgIEBQT1NUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgIHB1YmxpYyBTdHJpbmcgcG9zdEl0KEBGb3JtUGFyYW0oInRleHQiKSBTdHJpbmcgdGV4dCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKworICAgIEBQT1NUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgIEBQYXRoKCJlbmNvZGluZyIpCisgICAgcHVibGljIFN0cmluZyBwb3N0RW5jb2RpbmcoQEVuY29kZWQgQEZvcm1QYXJhbSgidGV4dCIpIFN0cmluZyB0ZXh0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBVUkxEZWNvZGVyLmRlY29kZSh0ZXh0LCAiVVRGLTgiKTsKKyAgICB9CisKKyAgICBAUFVUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgIHB1YmxpYyBTdHJpbmcgcHV0SXQoQEZvcm1QYXJhbSgidGV4dCIpIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvU2VjdXJlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL1NlY3VyZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMzc2NzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL1NlY3VyZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LlJvbGVzQWxsb3dlZDsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFBhdGgoImFkbWluIikKK3B1YmxpYyBjbGFzcyBTZWN1cmVkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBSb2xlc0FsbG93ZWQoImFkbWluIikKKyAgICBwdWJsaWMgU3RyaW5nIHNlY3VyZWQoKSB7CisgICAgICAgIHJldHVybiAiU2VjdXJlZCI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL1N1cHByZXNzQ29udGVudExlbmd0aEZpbHRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9TdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmIyYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9TdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqL3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworCisvKioKKyAqIEpFUlNFWS0yOTM2IHJlcHJvZHVjZXIgZmlsdGVyLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX05BTUVfU1VQUFJFU1NfQ09OVEVOVF9MRU5HVEggPSAiU3VwcHJlc3NDb250ZW50TGVuZ3RoIjsKKworICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgZmluYWwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocmVxdWVzdC5nZXRQYXJhbWV0ZXIoUEFSQU1FVEVSX05BTUVfU1VQUFJFU1NfQ09OVEVOVF9MRU5HVEgpKSkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSBuZXcgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudExlbmd0aChpbnQgbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBkZWxlZ2F0ZSB0byBvcmlnaW5hbCBTZXJ2bGV0UmVzcG9uc2UgLT4gcmVzcG9uc2UgaXMgTk9UIGNvbW1pdHRlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgeworICAgICAgICAvL05PT1AKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAvL05PT1AKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDlkOTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMTYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisKKyAgICA8IS0tIHNlcnZsZXQgZm9yIGdlbmVyaWMgdXNlIChoYXMgYWxsIHJlc291cmNlcykgLS0+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuUm9sZXNBbGxvd2VkRHluYW1pY0ZlYXR1cmU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vc2VydmxldC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDwhLS0gZmlsdGVyIHRvIHRlc3QgTk9UIGNvbW1pdGVkIHJlc3BvbnNlcyAtLT4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+U3VwcHJlc3NDb250ZW50TGVuZ3RoRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHMuU3VwcHJlc3NDb250ZW50TGVuZ3RoRmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+U3VwcHJlc3NDb250ZW50TGVuZ3RoRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPCEtLSBmaWx0ZXIgZm9yIGdlbmVyaWMgdXNlIChoYXMgYWxsIHJlc291cmNlcykgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0RmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9maWx0ZXIvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDwhLS0gZmlsdGVyIGNvbnRleHQgcGF0aCAtLT4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdEZpbHRlcjI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzLkZpbHRlckNvbnRleHRQYXRoUmVzb3VyY2UKKyAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHMuRmlsdGVyTm9Db250ZXh0UGF0aFJlc291cmNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuY29udGV4dFBhdGg8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+L2NvbnRleHRQYXRoRmlsdGVyLzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0RmlsdGVyMjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vY29udGV4dFBhdGhGaWx0ZXIvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDwhLS0gZm9yd2FyZCBvbiA0MDQgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RGaWx0ZXIzPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0cy5GaWx0ZXJGb3J3YXJkT240MDRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZsZXQuZmlsdGVyLmZvcndhcmRPbjQwNDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RGaWx0ZXIzPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9mb3J3YXJkaW5nRmlsdGVyLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8IS0tIHN0YXRpYyBjb250ZW50IHJlZ2V4IC0tPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0RmlsdGVyNDwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHMuRmlsdGVyU3RhdGljQ29udGVudFJlc291cmNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuc3RhdGljQ29udGVudFJlZ2V4PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPi9zdGF0aWNDb250ZW50RmlsdGVyLy4qXC5qc3A8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdEZpbHRlcjQ8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3N0YXRpY0NvbnRlbnRGaWx0ZXIvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDwhLS0gZm9ybSBjb25zdW1wdGlvbiAtLT4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+Rm9ybUNvbnN1bXB0aW9uRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHMuRm9ybUNvbnN1bXB0aW9uRmlsdGVyPC9maWx0ZXItY2xhc3M+CisgICAgPC9maWx0ZXI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9ybUNvbnN1bXB0aW9uU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHMuRm9ybUNvbnN1bXB0aW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkZvcm1Db25zdW1wdGlvblNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9mb3JtLWNvbnN1bXB0aW9uLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkZvcm1Db25zdW1wdGlvbkZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vZm9ybS1jb25zdW1wdGlvbi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPCEtLSA0MDQgLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPmN1c3RvbTQwNDwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHMuQ3VzdG9tTWVkaWFUeXBlQW5kNDA0UmVzb3VyY2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5jb250ZXh0UGF0aDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4vY3VzdG9tNDA0LzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5jdXN0b200MDQ8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2N1c3RvbTQwNC8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvZmlsdGVyL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL2ZpbHRlci9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxN2Q5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL2ZpbHRlci9pbmRleC5qc3AKQEAgLTAsMCArMSwyNyBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8dGl0bGU+PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL3dlYmFwcC9mb3J3YXJkaW5nRmlsdGVyL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL2ZvcndhcmRpbmdGaWx0ZXIvaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTdkOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL3dlYmFwcC9mb3J3YXJkaW5nRmlsdGVyL2luZGV4LmpzcApAQCAtMCwwICsxLDI3IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Cis8aHRtbD4KKzxoZWFkPgorICAgIDx0aXRsZT48L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL3N0YXRpY0NvbnRlbnRGaWx0ZXIvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvc3RhdGljQ29udGVudEZpbHRlci9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxN2Q5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL3N0YXRpY0NvbnRlbnRGaWx0ZXIvaW5kZXguanNwCkBAIC0wLDAgKzEsMjcgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4KKzxodG1sPgorPGhlYWQ+CisgICAgPHRpdGxlPjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9DYWNoZUNvbnRyb2xPbjQwNElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9DYWNoZUNvbnRyb2xPbjQwNElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTdlMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0NhY2hlQ29udHJvbE9uNDA0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBjbGFzcyByZWxhdGVkIHRvIGlzc3VlIEpFUlNFWS0xMTg5LgorICogQ29uZmlybXMgdGhhdCBpZiBvbmUgc2VuZHMgYW4gZW50aXR5IHdpdGggdGhlIGVycm9yIHN0YXR1cywgdGhlIGNhY2hlIGNvbnRyb2wKKyAqIGhlYWRlcnMgZG9uJ3QgZ2V0IHJlc2V0IGJ5IHRoZSBjb250YWluZXIuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVDb250cm9sT240MDRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ2FjaGVDb250cm9sT240MDRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3Q0MDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdDQwNEltcGwoZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDQwNFN1cHByZXNzQ29udGVudExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0NDA0SW1wbCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdDQwNEltcGwoZmluYWwgYm9vbGVhbiBzdXBwcmVzc0NvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgic2VydmxldCIpLnBhdGgoIjQwNCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oU3VwcHJlc3NDb250ZW50TGVuZ3RoRmlsdGVyLlBBUkFNRVRFUl9OQU1FX1NVUFBSRVNTX0NPTlRFTlRfTEVOR1RILCBzdXBwcmVzc0NvbnRlbnRMZW5ndGgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiNDA0IE5vdCBGb3VuZCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gdmFsdWVzID0gci5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ0FDSEVfQ09OVFJPTCkuc3BsaXQoIiwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5vLXRyYW5zZm9ybSIsIHZhbHVlc1swXS50cmltKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1heC1hZ2U9MTAiLCB2YWx1ZXNbMV0udHJpbSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ3VzdG9tNDA0TWVkaWFUeXBlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0N1c3RvbTQwNE1lZGlhVHlwZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOWQ1YmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0N1c3RvbTQwNE1lZGlhVHlwZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbTQwNE1lZGlhVHlwZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gZHVtbXkgcmVzb3VyY2UgY29uZmlnCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbTQwNCgpIHsKKyAgICAgICAgdGVzdEN1c3RvbTQwNEltcGwoZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbTQwNFdpdGhFbXRweUVudGl0eVN0cmluZygpIHsKKyAgICAgICAgdGVzdEN1c3RvbTQwNFdpdGhFbXRweUVudGl0eVN0cmluZ0ltcGwoZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbTQwNFN1cHByZXNzQ29udGVudExlbmd0aCgpIHsKKyAgICAgICAgdGVzdEN1c3RvbTQwNEltcGwodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tNDA0V2l0aEVtdHB5RW50aXR5U3RyaW5nU3VwcHJlc3NDb250ZW50TGVuZ3RoKCkgeworICAgICAgICB0ZXN0Q3VzdG9tNDA0V2l0aEVtdHB5RW50aXR5U3RyaW5nSW1wbCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEN1c3RvbTQwNEltcGwoZmluYWwgYm9vbGVhbiBzdXBwcmVzc0NvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJjdXN0b200MDQvcmVzb3VyY2U0MDQvY29udGVudC10eXBlLWVudGl0eSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oU3VwcHJlc3NDb250ZW50TGVuZ3RoRmlsdGVyLlBBUkFNRVRFUl9OQU1FX1NVUFBSRVNTX0NPTlRFTlRfTEVOR1RILCBzdXBwcmVzc0NvbnRlbnRMZW5ndGgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYXBwbGljYXRpb24vc29tZXRoaW5nIiwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm5vdCBmb3VuZCBjdXN0b20gZW50aXR5IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEN1c3RvbTQwNFdpdGhFbXRweUVudGl0eVN0cmluZ0ltcGwoZmluYWwgYm9vbGVhbiBzdXBwcmVzc0NvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJjdXN0b200MDQvcmVzb3VyY2U0MDQvY29udGVudC10eXBlLWVtcHR5LWVudGl0eSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oU3VwcHJlc3NDb250ZW50TGVuZ3RoRmlsdGVyLlBBUkFNRVRFUl9OQU1FX1NVUFBSRVNTX0NPTlRFTlRfTEVOR1RILCBzdXBwcmVzc0NvbnRlbnRMZW5ndGgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYXBwbGljYXRpb24vc29tZXRoaW5nIiwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0R1cGxpY2F0ZUhlYWRlcklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9EdXBsaWNhdGVIZWFkZXJJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU2ZWNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9EdXBsaWNhdGVIZWFkZXJJVENhc2UuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIER1cGxpY2F0ZUhlYWRlcklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIGR1bW15IHJlc291cmNlIGNvbmZpZworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVIZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0RHVwbGljYXRlSGVhZGVySW1wbCgiY29udGV4dFBhdGhGaWx0ZXIvY29udGV4dFBhdGhSZXNvdXJjZSIpOworICAgICAgICB0ZXN0RHVwbGljYXRlSGVhZGVySW1wbCgic2VydmxldC9jb250ZXh0UGF0aFJlc291cmNlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3REdXBsaWNhdGVIZWFkZXJJbXBsKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0RHVwbGljYXRlSGVhZGVySW1wbCgwLCBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX09LLCBwYXRoKTsKKyAgICAgICAgdGVzdER1cGxpY2F0ZUhlYWRlckltcGwoMSwgSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9PSywgcGF0aCk7CisgICAgICAgIHRlc3REdXBsaWNhdGVIZWFkZXJJbXBsKDIsIEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfQkFEX1JFUVVFU1QsIHBhdGgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RHVwbGljYXRlSGVhZGVySW1wbChmaW5hbCBpbnQgaGVhZGVyQ291bnQsIGludCBleHBlY3RlZFJlc3BvbnNlQ29kZSwgZmluYWwgU3RyaW5nIHBhdGgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyTmFtZSA9IEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRTsKKyAgICAgICAgVVJMIGdldFVybCA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgocGF0aCkuYnVpbGQoKS50b1VSTCgpOworICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSBnZXRVcmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmFkZFJlcXVlc3RQcm9wZXJ0eShoZWFkZXJOYW1lLCAiTi9BIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXRoICsgIiBbIiArIGhlYWRlck5hbWUgKyAiOiIgKyBoZWFkZXJDb3VudCArICJ4XSIsIGV4cGVjdGVkUmVzcG9uc2VDb2RlLCBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlckNvbnRleHRQYXRoSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlckNvbnRleHRQYXRoSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlOTlkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyQ29udGV4dFBhdGhJVENhc2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJDb250ZXh0UGF0aElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIGR1bW15IHJlc291cmNlIGNvbmZpZworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0UGF0aFJlc291cmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRleHRQYXRoUmVzb3VyY2UiLCB0YXJnZXQoImNvbnRleHRQYXRoRmlsdGVyL2NvbnRleHRQYXRoUmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vQ29udGV4dFBhdGhSZXNvdXJjZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWx0ZXIvcmVzb3VyY2UiLCB0YXJnZXQoImZpbHRlci9yZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3RoZXJSZXNvdXJjZVVucmVhY2hhYmxlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJmaWx0ZXIvY29udGV4dFBhdGhSZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3JtQ29uc3VtcHRpb25JVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRm9ybUNvbnN1bXB0aW9uSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY3YTVmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRm9ybUNvbnN1bXB0aW9uSVRDYXNlLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEZvcm1Db25zdW1wdGlvbklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIGR1bW15IHJlc291cmNlIGNvbmZpZworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvcm0ucGFyYW0oInRleHQiLCAidGhpcyBpcyBhIHRlc3QiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgiZm9ybS1jb25zdW1wdGlvbi9mb3JtLWNvbnN1bXB0aW9uIikucmVxdWVzdCgpLnB1dChFbnRpdHkuZm9ybShmb3JtKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm0uYXNNYXAoKS5nZXRGaXJzdCgidGV4dCIpLCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvcm0ucGFyYW0oInRleHQiLCAidGhpcyBpcyBhIHRlc3QiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgiZm9ybS1jb25zdW1wdGlvbi9mb3JtLWNvbnN1bXB0aW9uIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmZvcm0oZm9ybSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtLmFzTWFwKCkuZ2V0Rmlyc3QoInRleHQiKSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0V2l0aEVuY29kaW5nKCkgeworICAgICAgICBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJ0ZXh0IiwgInRoaXMgaXMgYW4gZW5jb2RpbmcgdGVzdCArLSovPSIpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJmb3JtLWNvbnN1bXB0aW9uL2Zvcm0tY29uc3VtcHRpb24vZW5jb2RpbmciKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZm9ybShmb3JtKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm0uYXNNYXAoKS5nZXRGaXJzdCgidGV4dCIpLCByZXN1bHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRm9yd2FyZE9uNDA0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZvcndhcmRPbjQwNElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzk5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZvcndhcmRPbjQwNElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEZvcndhcmRPbjQwNElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIGR1bW15IHJlc291cmNlIGNvbmZpZworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVJlYWNoYWJsZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb3J3YXJkaW5nRmlsdGVyL3Jlc291cmNlIiwgdGFyZ2V0KCJmb3J3YXJkaW5nRmlsdGVyL3Jlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleFJlYWNoYWJsZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiZm9yd2FyZGluZ0ZpbHRlci9pbmRleC5qc3AiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvSW52YWxpZFJlcXVlc3RVcmlJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvSW52YWxpZFJlcXVlc3RVcmlJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY3ZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9JbnZhbGlkUmVxdWVzdFVyaUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGNsYXNzIHJlbGF0ZWQgdG8gaXNzdWUgSkVSU0VZLTI2ODAuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBJbnZhbGlkUmVxdWVzdFVyaUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFJlcXVlc3RVcmlGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW52YWxpZFJlcXVlc3RVcmkoImZpbHRlciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRSZXF1ZXN0VXJpU2VydmxldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnZhbGlkUmVxdWVzdFVyaSgic2VydmxldCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludmFsaWRSZXF1ZXN0VXJpKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyBwYXRoICsgIi9yZXNvdXJjZXsiKTsKKyAgICAgICAgZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7CisKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdCIsICJ0ZXh0L3BsYWluIik7CisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvUm9sZXNBbGxvd2VkRmlsdGVySVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL1JvbGVzQWxsb3dlZEZpbHRlcklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMmYwYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL1JvbGVzQWxsb3dlZEZpbHRlcklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlc0FsbG93ZWRGaWx0ZXJJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIER1bW15IHJlc291cmNlIGNvbmZpZworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3Q0MDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgic2VydmxldC9hZG1pbiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMywgci5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9TdGF0aWNDb250ZW50UmVnZXhJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvU3RhdGljQ29udGVudFJlZ2V4SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2NDdlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvU3RhdGljQ29udGVudFJlZ2V4SVRDYXNlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgU3RhdGljQ29udGVudFJlZ2V4SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gZHVtbXkgcmVzb3VyY2UgY29uZmlnCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZGV4VW5yZWFjaGFibGUoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImZpbHRlciIpLnBhdGgoImluZGV4LmpzcCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhSZWFjaGFibGUoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoInN0YXRpY0NvbnRlbnRGaWx0ZXIvaW5kZXguanNwIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVJlYWNoYWJsZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgic3RhdGljQ29udGVudEZpbHRlci9yZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic3RhdGljQ29udGVudEZpbHRlci9yZXNvdXJjZSIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5N2JlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3QvcG9tLnhtbApAQCAtMCwwICsxLDY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c29uYXItdGVzdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zb25hci10ZXN0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBwcm92aWRlIGFuIGFiaWxpdHkgdG8gY2hlY2sgd2hldGhlciBTb25hcidzIGNvZGUgY292ZXJhZ2UgaW5jbHVkZXMKKyAgICAgICAgbGluZXMgb2YgY29kZSBleGVjdXRlZCBmcm9tIGFuIGV4dGVybmFsbHkgZXhlY3V0ZWQgSlZNLCBKZXR0eSB3ZWIgc2VydmVyIGluIHRoaXMgY2FzZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc29uYXIvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc29uYXIvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViNjdlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNvbmFyOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEplcnNleSBhcHBsaWNhdGlvbiBmb3IgY29kZSBjb3ZlcmFnZSB0ZXN0aW5nLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFRlc3RBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc29uYXIvVGVzdFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc29uYXIvVGVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiZmFhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNvbmFyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zb25hci5Tb25hckplcnNleUNvbW1vbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc29uYXIuU29uYXJKZXJzZXlTZXJ2ZXI7CisKKy8qKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBTdHJpbmcgaGVsbG9TZXJ2ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgU29uYXJKZXJzZXlDb21tb24oKS5pbnRlZ3JhdGlvblNlcnZlckp2bSgpICsgIiAiICsgbmV3IFNvbmFySmVyc2V5U2VydmVyKCkuaW50ZWdyYXRpb25TZXJ2ZXJKdm0oKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjYwMTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc29uYXItdGVzdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNvbmFyLlRlc3RBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc29uYXIvSmVyc2V5U29uYXJJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9KZXJzZXlTb25hcklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOWYwNzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc29uYXIvSmVyc2V5U29uYXJJVENhc2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNvbmFyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNvbmFyLlNvbmFySmVyc2V5Q29tbW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc29uYXIuU29uYXJKZXJzZXlTZXJ2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlTb25hcklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdyYXRpb25TZXJ2ZXJKdm0oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdHJpbmcgPSB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiY29tbW9uIHNlcnZlciBqdm0gc2VydmVyIHNlcnZlciBqdm0iLCBzdHJpbmcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVncmF0aW9uVGVzdEp2bSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZyA9IG5ldyBTb25hckplcnNleUNvbW1vbigpLmludGVncmF0aW9uVGVzdEp2bSgpICsgIiAiICsgbmV3IFNvbmFySmVyc2V5U2VydmVyKCkuaW50ZWdyYXRpb25UZXN0SnZtKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiY29tbW9uIHRlc3QganZtIHNlcnZlciB0ZXN0IGp2bSIsIHN0cmluZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0QXBwbGljYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L1JFQURNRS50eHQgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExMDVmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDMwIEBACisKK3Rlc3RzCis9PT09PQorCitUZXN0cyBhcmUgbG9jYXRlZCBpbiBqZXJzZXktc3ByaW5nLXRlc3QgbW9kdWxlLgorVGhlIG1vZHVsZSBjb250YWlucyBhIHRlc3Qgd2ViYXBwIGFuZCB0ZXN0IGNvZGUuCitUaGUgdGVzdHMgY2FuIGJlIHJ1biBpbiBKZXJzZXkgdGVzdCBjb250YWluZXIgb3IgYW4gZXh0ZXJuYWwgY29udGFpbmVyLgorCistIFJ1bm5pbmcgdGVzdHMgaW4gSmVyc2V5IHRlc3QgY29udGFpbmVyCisgICAgbXZuIGNsZWFuIHRlc3QKKworLSBSdW5uaW5nIHRlc3RzIGluIGFuIGV4dGVybmFsIGNvbnRhaW5lcgorICBidWlsZCB0aGUgdGVzdCBhcHAKKyAgZGVwbG95IHRvIGFuIGV4dGVybmFsIGNvbnRhaW5lcgorICBjb25maWd1cmUgY29udGFpbmVyIGNvbm5lY3Rpb24gaW5mbyBpbiBqZXJzZXktc3ByaW5nLXRlc3QvcG9tLnhtbCwgaWYgbmVlZGVkCisgIHJ1biB0ZXN0cyBpbiBpbnRlZ3JhdGlvbiB0ZXN0IG1vZGU6CisgICAgbXZuIC1QaXQgdmVyaWZ5CisKKy0gUnVubmluZyB0ZXN0cyBpbiBlbWJlZGRlZCBKZXR0eSBpbnN0YW5jZQorICBidWlsZCB0aGUgdGVzdCBhcHAKKyAgZGVwbG95IHRvIEpldHR5OgorICAgIG12biAtUGpldHR5IGpldHR5OnJ1bgorICBydW4gdGVzdHMgaW4gaW50ZWdyYXRpb24gdGVzdCBtb2RlIGluIGFub3RoZXIgY29uc29sZSBzZXNzaW9uOgorICAgIG12biAtUGl0IHZlcmlmeQorCit0ZXN0IGNsYXNzIG5hbWluZyBjb252ZW50aW9ucworLSAqSVRUZXN0LmphdmE6IHJ1biBpbiB1bml0IGFuZCBJVCB0ZXN0IG1vZGUKKy0gKlRlc3QuamF2YTogcnVuIGFzIHVuaXQgdGVzdHMKKy0gKklULmphdmE6IHJ1biBhcyBJVCB0ZXN0cworCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlOTNhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvcG9tLnhtbApAQCAtMCwwICsxLDEzMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI2LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c3ByaW5nNDwvYXJ0aWZhY3RJZD4KKworICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNwcmluZzQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSB0ZXN0cyBmb3IgU3ByaW5nIDQgaW50ZWdyYXRpb24KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNwcmluZzQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx3ZWJBcHA+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGV4dFBhdGg+LzwvY29udGV4dFBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8d2ViSW5mSW5jbHVkZUphclBhdHRlcm4+LipcLmphciQ8L3dlYkluZkluY2x1ZGVKYXJQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICA8L3dlYkFwcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmRlbGF5ZWQtc3RyYXRlZ3ktc2tpcC10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0aW9uLm1hbmFnZXIuc3RyYXRlZ3k8L25hbWU+CisgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5kZWxheWVkPC92YWx1ZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50SmVyc2V5UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudEplcnNleVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZjdiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudEplcnNleVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5RdWFsaWZpZXI7CisKKy8qKgorICogSmVyc2V5IG1hbmFnZWQgSkFYLVJTIHJlc291cmNlIGZvciB0ZXN0aW5nIGplcnNleS1zcHJpbmcuCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworQFBhdGgoIi9qZXJzZXkvYWNjb3VudCIpCitwdWJsaWMgY2xhc3MgQWNjb3VudEplcnNleVJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBATmFtZWQoIkFjY291bnRTZXJ2aWNlLXNpbmdsZXRvbiIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZUluamVjdDsKKworICAgIEBBdXRvd2lyZWQKKyAgICBAUXVhbGlmaWVyKCJBY2NvdW50U2VydmljZS1zaW5nbGV0b24iKQorICAgIHByaXZhdGUgQWNjb3VudFNlcnZpY2UgYWNjb3VudFNlcnZpY2VBdXRvd2lyZWQ7CisKKyAgICBASW5qZWN0CisgICAgQE5hbWVkKCJBY2NvdW50U2VydmljZS1yZXF1ZXN0LTEiKQorICAgIHByaXZhdGUgQWNjb3VudFNlcnZpY2UgYWNjb3VudFNlcnZpY2VSZXF1ZXN0MTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBAUXVhbGlmaWVyKCJBY2NvdW50U2VydmljZS1yZXF1ZXN0LTEiKQorICAgIHByaXZhdGUgQWNjb3VudFNlcnZpY2UgYWNjb3VudFNlcnZpY2VSZXF1ZXN0MjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBAUXVhbGlmaWVyKCJBY2NvdW50U2VydmljZS1wcm90b3R5cGUtMSIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZVByb3RvdHlwZTE7CisKKyAgICBAQXV0b3dpcmVkCisgICAgQFF1YWxpZmllcigiQWNjb3VudFNlcnZpY2UtcHJvdG90eXBlLTEiKQorICAgIHByaXZhdGUgQWNjb3VudFNlcnZpY2UgYWNjb3VudFNlcnZpY2VQcm90b3R5cGUyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IGh0dHBTZXJ2bGV0UmVxdWVzdDsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEhLMlNlcnZpY2VTaW5nbGV0b24gaGsyU2luZ2xldG9uOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgSEsyU2VydmljZVJlcXVlc3RTY29wZWQgaGsyUmVxdWVzdFNjb3BlZDsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEhLMlNlcnZpY2VQZXJMb29rdXAgaGsyUGVyTG9va3VwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9ICJuL2EiOworCisgICAgLy8gcmVzb3VyY2UgbWV0aG9kcyBmb3IgdGVzdGluZyByZXNvdXJjZSBjbGFzcyBzY29wZQorICAgIEBHRVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBAUFVUCisgICAgQFBhdGgoIm1lc3NhZ2UiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgLy8gSkVSU0VZLTI1MDYgRklYIFZFUklGSUNBVElPTgorICAgIEBHRVQKKyAgICBAUGF0aCgic2VydmVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gIlBBU1NFRDogIiArIGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzaW5nbGV0b24vc2VydmVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uSW50b1NpbmdsZXRvbigpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlSW5qZWN0LnZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzaW5nbGV0b24vYXV0b3dpcmVkL3NlcnZlciIpCisgICAgcHVibGljIFN0cmluZyB2ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbkludG9BdXRvd2lyZWRTaW5nbGV0b24oKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZUF1dG93aXJlZC52ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbigpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdC9zZXJ2ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb25JbnRvUmVxdWVzdFNjb3BlZEJlYW4oKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZVJlcXVlc3QxLnZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJwcm90b3R5cGUvc2VydmVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uSW50b1Byb3RvdHlwZVNjb3BlZEJlYW4oKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZVByb3RvdHlwZTEudmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKTsKKyAgICB9CisKKyAgICAvLyByZXNvdXJjZSBtZXRob2RzIGZvciB0ZXN0aW5nIHNpbmdsZXRvbiBzY29wZWQgYmVhbnMKKyAgICBAR0VUCisgICAgQFBhdGgoInNpbmdsZXRvbi9pbmplY3Qve2FjY291bnRJZH0iKQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEFjY291bnRCYWxhbmNlU2luZ2xldG9uSW5qZWN0KEBQYXRoUGFyYW0oImFjY291bnRJZCIpIGZpbmFsIFN0cmluZyBhY2NvdW50SWQpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlSW5qZWN0LmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzaW5nbGV0b24vYXV0b3dpcmVkL3thY2NvdW50SWR9IikKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY2NvdW50QmFsYW5jZVNpbmdsZXRvbkF1dG93aXJlZChAUGF0aFBhcmFtKCJhY2NvdW50SWQiKSBmaW5hbCBTdHJpbmcgYWNjb3VudElkKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZUF1dG93aXJlZC5nZXRBY2NvdW50QmFsYW5jZShhY2NvdW50SWQpOworICAgIH0KKworICAgIEBQVVQKKyAgICBAUGF0aCgic2luZ2xldG9uL3thY2NvdW50SWR9IikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIHZvaWQgc2V0QWNjb3VudEJhbGFuY2VTaW5nbGV0b24oQFBhdGhQYXJhbSgiYWNjb3VudElkIikgZmluYWwgU3RyaW5nIGFjY291bnRJZCwgZmluYWwgU3RyaW5nIGJhbGFuY2UpIHsKKyAgICAgICAgYWNjb3VudFNlcnZpY2VJbmplY3Quc2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkLCBuZXcgQmlnRGVjaW1hbChiYWxhbmNlKSk7CisgICAgfQorCisgICAgLy8gcmVzb3VyY2UgbWV0aG9kcyBmb3IgdGVzdGluZyByZXF1ZXN0IHNjb3BlZCBiZWFucworICAgIEBQVVQKKyAgICBAUGF0aCgicmVxdWVzdC97YWNjb3VudElkfSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIHNldEFjY291bnRCYWxhbmNlUmVxdWVzdChAUGF0aFBhcmFtKCJhY2NvdW50SWQiKSBmaW5hbCBTdHJpbmcgYWNjb3VudElkLCBmaW5hbCBTdHJpbmcgYmFsYW5jZSkgeworICAgICAgICBhY2NvdW50U2VydmljZVJlcXVlc3QxLnNldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCwgbmV3IEJpZ0RlY2ltYWwoYmFsYW5jZSkpOworICAgICAgICByZXR1cm4gYWNjb3VudFNlcnZpY2VSZXF1ZXN0Mi5nZXRBY2NvdW50QmFsYW5jZShhY2NvdW50SWQpOworICAgIH0KKworICAgIC8vIHJlc291cmNlIG1ldGhvZHMgZm9yIHRlc3RpbmcgcHJvdG90eXBlIHNjb3BlZCBiZWFucworICAgIEBQVVQKKyAgICBAUGF0aCgicHJvdG90eXBlL3thY2NvdW50SWR9IikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIEJpZ0RlY2ltYWwgc2V0QWNjb3VudEJhbGFuY2VQcm90b3R5cGUoQFBhdGhQYXJhbSgiYWNjb3VudElkIikgZmluYWwgU3RyaW5nIGFjY291bnRJZCwgZmluYWwgU3RyaW5nIGJhbGFuY2UpIHsKKyAgICAgICAgYWNjb3VudFNlcnZpY2VQcm90b3R5cGUxLnNldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCwgbmV3IEJpZ0RlY2ltYWwoYmFsYW5jZSkpOworICAgICAgICByZXR1cm4gYWNjb3VudFNlcnZpY2VQcm90b3R5cGUyLmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50U2VydmljZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MWUyMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworLyoqCisgKiBTaW1wbGUgYWNjb3VudCBzZXJ2aWNlIHRvIHRlc3RpZnkgaW5qZWN0aW9uIGludG8gZGlmZmVyZW50IHNjb3Blcy4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFjY291bnRTZXJ2aWNlIHsKKworICAgIHZvaWQgc2V0QWNjb3VudEJhbGFuY2UoU3RyaW5nIGFjY291bnRJZCwgQmlnRGVjaW1hbCBiYWxhbmNlKTsKKworICAgIEJpZ0RlY2ltYWwgZ2V0QWNjb3VudEJhbGFuY2UoU3RyaW5nIGFjY291bnRJZCk7CisKKyAgICBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFNlcnZpY2VJbXBsLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTllNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRTZXJ2aWNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CisKKy8qKgorICogQWNjb3VudFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFjY291bnRTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEFjY291bnRTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgQmlnRGVjaW1hbD4gYWNjb3VudHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBCaWdEZWNpbWFsIGRlZmF1bHRBY2NvdW50QmFsYW5jZTsKKworICAgIC8vIEpFUlNFWS0yNTA2IEZJWCBWRVJJRklDQVRJT04KKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWNjb3VudEJhbGFuY2UoU3RyaW5nIGFjY291bnRJZCwgQmlnRGVjaW1hbCBiYWxhbmNlKSB7CisgICAgICAgIGFjY291bnRzLnB1dChhY2NvdW50SWQsIGJhbGFuY2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEFjY291bnRCYWxhbmNlKFN0cmluZyBhY2NvdW50SWQpIHsKKyAgICAgICAgQmlnRGVjaW1hbCBiYWxhbmNlID0gYWNjb3VudHMuZ2V0KGFjY291bnRJZCk7CisgICAgICAgIGlmIChiYWxhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0QWNjb3VudEJhbGFuY2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJhbGFuY2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEFjY291bnRCYWxhbmNlKFN0cmluZyBkZWZhdWx0QWNjb3VudEJhbGFuY2UpIHsKKyAgICAgICAgdGhpcy5kZWZhdWx0QWNjb3VudEJhbGFuY2UgPSBuZXcgQmlnRGVjaW1hbChkZWZhdWx0QWNjb3VudEJhbGFuY2UpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAiUEFTU0VEOiAiICsgaHR0cFNlcnZsZXRSZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFNwcmluZ1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRTcHJpbmdSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNmU2YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRTcHJpbmdSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUXVhbGlmaWVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKKy8qKgorICogU3ByaW5nIG1hbmFnZWQgSkFYLVJTIHJlc291cmNlIGZvciB0ZXN0aW5nIGplcnNleS1zcHJpbmcuCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworQFBhdGgoIi9zcHJpbmcvYWNjb3VudCIpCitAQ29tcG9uZW50CitwdWJsaWMgY2xhc3MgQWNjb3VudFNwcmluZ1Jlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBATmFtZWQoIkFjY291bnRTZXJ2aWNlLXNpbmdsZXRvbiIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZUluamVjdDsKKworICAgIEBBdXRvd2lyZWQKKyAgICBAUXVhbGlmaWVyKCJBY2NvdW50U2VydmljZS1zaW5nbGV0b24iKQorICAgIHByaXZhdGUgQWNjb3VudFNlcnZpY2UgYWNjb3VudFNlcnZpY2VBdXRvd2lyZWQ7CisKKyAgICBASW5qZWN0CisgICAgQE5hbWVkKCJBY2NvdW50U2VydmljZS1yZXF1ZXN0LTEiKQorICAgIHByaXZhdGUgQWNjb3VudFNlcnZpY2UgYWNjb3VudFNlcnZpY2VSZXF1ZXN0MTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBAUXVhbGlmaWVyKCJBY2NvdW50U2VydmljZS1yZXF1ZXN0LTEiKQorICAgIHByaXZhdGUgQWNjb3VudFNlcnZpY2UgYWNjb3VudFNlcnZpY2VSZXF1ZXN0MjsKKworICAgIEBBdXRvd2lyZWQKKyAgICBAUXVhbGlmaWVyKCJBY2NvdW50U2VydmljZS1wcm90b3R5cGUtMSIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZVByb3RvdHlwZTE7CisKKyAgICBAQXV0b3dpcmVkCisgICAgQFF1YWxpZmllcigiQWNjb3VudFNlcnZpY2UtcHJvdG90eXBlLTEiKQorICAgIHByaXZhdGUgQWNjb3VudFNlcnZpY2UgYWNjb3VudFNlcnZpY2VQcm90b3R5cGUyOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IGh0dHBTZXJ2bGV0UmVxdWVzdDsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEhLMlNlcnZpY2VTaW5nbGV0b24gaGsyU2luZ2xldG9uOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgSEsyU2VydmljZVJlcXVlc3RTY29wZWQgaGsyUmVxdWVzdFNjb3BlZDsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEhLMlNlcnZpY2VQZXJMb29rdXAgaGsyUGVyTG9va3VwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9ICJuL2EiOworCisgICAgLy8gcmVzb3VyY2UgbWV0aG9kcyBmb3IgdGVzdGluZyByZXNvdXJjZSBjbGFzcyBzY29wZQorICAgIEBHRVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBAUFVUCisgICAgQFBhdGgoIm1lc3NhZ2UiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgLy8gSkVSU0VZLTI1MDYgRklYIFZFUklGSUNBVElPTgorICAgIEBHRVQKKyAgICBAUGF0aCgic2VydmVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gIlBBU1NFRDogIiArIGh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzaW5nbGV0b24vc2VydmVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uSW50b1NpbmdsZXRvbigpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlSW5qZWN0LnZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzaW5nbGV0b24vYXV0b3dpcmVkL3NlcnZlciIpCisgICAgcHVibGljIFN0cmluZyB2ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbkludG9BdXRvd2lyZWRTaW5nbGV0b24oKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZUF1dG93aXJlZC52ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbigpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdC9zZXJ2ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb25JbnRvUmVxdWVzdFNjb3BlZEJlYW4oKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZVJlcXVlc3QxLnZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJwcm90b3R5cGUvc2VydmVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uSW50b1Byb3RvdHlwZVNjb3BlZEJlYW4oKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZVByb3RvdHlwZTEudmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKTsKKyAgICB9CisKKyAgICAvLyByZXNvdXJjZSBtZXRob2RzIGZvciB0ZXN0aW5nIHNpbmdsZXRvbiBzY29wZWQgYmVhbnMKKyAgICBAR0VUCisgICAgQFBhdGgoInNpbmdsZXRvbi9pbmplY3Qve2FjY291bnRJZH0iKQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEFjY291bnRCYWxhbmNlU2luZ2xldG9uSW5qZWN0KEBQYXRoUGFyYW0oImFjY291bnRJZCIpIFN0cmluZyBhY2NvdW50SWQpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlSW5qZWN0LmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzaW5nbGV0b24vYXV0b3dpcmVkL3thY2NvdW50SWR9IikKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY2NvdW50QmFsYW5jZVNpbmdsZXRvbkF1dG93aXJlZChAUGF0aFBhcmFtKCJhY2NvdW50SWQiKSBTdHJpbmcgYWNjb3VudElkKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZUF1dG93aXJlZC5nZXRBY2NvdW50QmFsYW5jZShhY2NvdW50SWQpOworICAgIH0KKworICAgIEBQVVQKKyAgICBAUGF0aCgic2luZ2xldG9uL3thY2NvdW50SWR9IikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIHZvaWQgc2V0QWNjb3VudEJhbGFuY2VTaW5nbGV0b24oQFBhdGhQYXJhbSgiYWNjb3VudElkIikgU3RyaW5nIGFjY291bnRJZCwgU3RyaW5nIGJhbGFuY2UpIHsKKyAgICAgICAgYWNjb3VudFNlcnZpY2VJbmplY3Quc2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkLCBuZXcgQmlnRGVjaW1hbChiYWxhbmNlKSk7CisgICAgfQorCisgICAgLy8gcmVzb3VyY2UgbWV0aG9kcyBmb3IgdGVzdGluZyByZXF1ZXN0IHNjb3BlZCBiZWFucworICAgIEBQVVQKKyAgICBAUGF0aCgicmVxdWVzdC97YWNjb3VudElkfSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIHNldEFjY291bnRCYWxhbmNlUmVxdWVzdChAUGF0aFBhcmFtKCJhY2NvdW50SWQiKSBTdHJpbmcgYWNjb3VudElkLCBTdHJpbmcgYmFsYW5jZSkgeworICAgICAgICBhY2NvdW50U2VydmljZVJlcXVlc3QxLnNldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCwgbmV3IEJpZ0RlY2ltYWwoYmFsYW5jZSkpOworICAgICAgICByZXR1cm4gYWNjb3VudFNlcnZpY2VSZXF1ZXN0Mi5nZXRBY2NvdW50QmFsYW5jZShhY2NvdW50SWQpOworICAgIH0KKworICAgIC8vIHJlc291cmNlIG1ldGhvZHMgZm9yIHRlc3RpbmcgcHJvdG90eXBlIHNjb3BlZCBiZWFucworICAgIEBQVVQKKyAgICBAUGF0aCgicHJvdG90eXBlL3thY2NvdW50SWR9IikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIEJpZ0RlY2ltYWwgc2V0QWNjb3VudEJhbGFuY2VQcm90b3R5cGUoQFBhdGhQYXJhbSgiYWNjb3VudElkIikgU3RyaW5nIGFjY291bnRJZCwgU3RyaW5nIGJhbGFuY2UpIHsKKyAgICAgICAgYWNjb3VudFNlcnZpY2VQcm90b3R5cGUxLnNldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCwgbmV3IEJpZ0RlY2ltYWwoYmFsYW5jZSkpOworICAgICAgICByZXR1cm4gYWNjb3VudFNlcnZpY2VQcm90b3R5cGUyLmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0NvbnRyb2xsZXJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9Db250cm9sbGVyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE0YzIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9Db250cm9sbGVyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db250cm9sbGVyOworCisvKioKKyAqIEBhdXRob3IgS29ucmFkIEdhcnVzIChrb25yYWQuZ2FydXMgYXQgZ21haWwuY29tKQorICovCitAQ29udHJvbGxlcgorQFBhdGgoIi9zcHJpbmcvY29udHJvbGxlciIpCitwdWJsaWMgY2xhc3MgQ29udHJvbGxlclJlc291cmNlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICBAUFVUCisgICAgQFBhdGgoIm1lc3NhZ2UiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtZXNzYWdlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvRW5kcG9pbnQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvRW5kcG9pbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTlmMTcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9FbmRwb2ludC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCisvKioKKyAqIEBhdXRob3IgS29ucmFkIEdhcnVzIChrb25yYWQuZ2FydXMgYXQgZ21haWwuY29tKQorICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQENvbXBvbmVudAorcHVibGljIEBpbnRlcmZhY2UgRW5kcG9pbnQgeworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0VuZHBvaW50UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvRW5kcG9pbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjA4NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0VuZHBvaW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIEtvbnJhZCBHYXJ1cyAoa29ucmFkLmdhcnVzIGF0IGdtYWlsLmNvbSkKKyAqLworQEVuZHBvaW50CitAUGF0aCgiL3NwcmluZy9lbmRwb2ludCIpCitwdWJsaWMgY2xhc3MgRW5kcG9pbnRSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworCisgICAgQFBVVAorICAgIEBQYXRoKCJtZXNzYWdlIikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0hLMlNlcnZpY2VQZXJMb29rdXAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSEsyU2VydmljZVBlckxvb2t1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjg5YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0hLMlNlcnZpY2VQZXJMb29rdXAuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworLyoqCisgKiBUeXBlIHRvIGJlIGhhbmRsZWQgYXMgSEsyIHBlci1sb29rdXAgYmVhbi4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitwdWJsaWMgY2xhc3MgSEsyU2VydmljZVBlckxvb2t1cCB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0hLMlNlcnZpY2VSZXF1ZXN0U2NvcGVkLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0hLMlNlcnZpY2VSZXF1ZXN0U2NvcGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0NWFlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSEsyU2VydmljZVJlcXVlc3RTY29wZWQuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworLyoqCisgKiBUeXBlIHRvIGJlIGhhbmRsZWQgYXMgSEsyIHJlcXVlc3Qgc2NvcGVkIGJlYW4uCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhLMlNlcnZpY2VSZXF1ZXN0U2NvcGVkIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSEsyU2VydmljZVNpbmdsZXRvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9ISzJTZXJ2aWNlU2luZ2xldG9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdiOGZhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSEsyU2VydmljZVNpbmdsZXRvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCisvKioKKyAqIFR5cGUgdG8gYmUgaGFuZGxlZCBhcyBISzIgc2luZ2xldG9uLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBISzJTZXJ2aWNlU2luZ2xldG9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZjMwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5QZXJMb29rdXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBjbGFzcyBmb3IgY29uZmlndXJpbmcgaW5qZWN0YWJsZSBzZXJ2aWNlcyBpbiBISzIgcmVnaXN0cnkgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIE15QXBwbGljYXRpb24oZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIEJpbmRlciBiaW5kZXIgPSBuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kQXNDb250cmFjdChISzJTZXJ2aWNlU2luZ2xldG9uLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KEhLMlNlcnZpY2VSZXF1ZXN0U2NvcGVkLmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBiaW5kQXNDb250cmFjdChISzJTZXJ2aWNlUGVyTG9va3VwLmNsYXNzKS5pbihQZXJMb29rdXAuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoYmluZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1JlcG9zaXRvcnlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9SZXBvc2l0b3J5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzNiNTYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9SZXBvc2l0b3J5UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5SZXBvc2l0b3J5OworCisvKioKKyAqIEBhdXRob3IgS29ucmFkIEdhcnVzIChrb25yYWQuZ2FydXMgYXQgZ21haWwuY29tKQorICovCitAUmVwb3NpdG9yeQorQFBhdGgoIi9zcHJpbmcvcmVwb3NpdG9yeSIpCitwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVJlc291cmNlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICBAUFVUCisgICAgQFBhdGgoIm1lc3NhZ2UiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtZXNzYWdlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU2VydmljZVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NlcnZpY2VSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTZkY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NlcnZpY2VSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CisKKy8qKgorICogQGF1dGhvciBLb25yYWQgR2FydXMgKGtvbnJhZC5nYXJ1cyBhdCBnbWFpbC5jb20pCisgKi8KK0BTZXJ2aWNlCitAUGF0aCgiL3NwcmluZy9zZXJ2aWNlIikKK3B1YmxpYyBjbGFzcyBTZXJ2aWNlUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKworICAgIEBQVVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1lc3NhZ2UiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb25Db250ZXh0LnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uQ29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjOTEyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uQ29udGV4dC54bWwKQEAgLTAsMCArMSw2MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhtbG5zOmFvcD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9hb3AiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucworICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy54c2QgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9hb3AKKyAgICAgICAgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9hb3Avc3ByaW5nLWFvcC54c2QiPgorCisgICAgPCEtLTxiZWFuIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWRBbm5vdGF0aW9uQmVhblBvc3RQcm9jZXNzb3IiLz4tLT4KKyAgICA8YmVhbiBjbGFzcz0ib3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkQW5ub3RhdGlvbkJlYW5Qb3N0UHJvY2Vzc29yIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImF1dG93aXJlZEFubm90YXRpb25UeXBlcyI+CisgICAgICAgICAgICA8c2V0PgorICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ8L3ZhbHVlPgorICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5WYWx1ZTwvdmFsdWU+CisgICAgICAgICAgICA8L3NldD4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBuYW1lPSJBY2NvdW50U2VydmljZS1zaW5nbGV0b24iIGNsYXNzPSJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuQWNjb3VudFNlcnZpY2VJbXBsIiAvPgorCisgICAgPGJlYW4gbmFtZT0iQWNjb3VudFNlcnZpY2UtcmVxdWVzdC0xIiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0LkFjY291bnRTZXJ2aWNlSW1wbCIgc2NvcGU9InJlcXVlc3QiPgorICAgICAgICA8YW9wOnNjb3BlZC1wcm94eS8+CisgICAgPC9iZWFuPgorCisgICAgPGJlYW4gbmFtZT0iQWNjb3VudFNlcnZpY2UtcmVxdWVzdC0yIiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0LkFjY291bnRTZXJ2aWNlSW1wbCIgc2NvcGU9InJlcXVlc3QiLz4KKworICAgIDxiZWFuIG5hbWU9IkFjY291bnRTZXJ2aWNlLXByb3RvdHlwZS0xIiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0LkFjY291bnRTZXJ2aWNlSW1wbCIgc2NvcGU9InByb3RvdHlwZSI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0QWNjb3VudEJhbGFuY2UiIHZhbHVlPSI5ODcuNjUiLz4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBuYW1lPSJBY2NvdW50U2VydmljZS1wcm90b3R5cGUtMiIgY2xhc3M9Im9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdC5BY2NvdW50U2VydmljZUltcGwiIHNjb3BlPSJwcm90b3R5cGUiLz4KKworICAgIDwhLS0gU3ByaW5nIG1hbmFnZWQgSkFYLVJTIHJlc291cmNlcyAtLT4KKyAgICA8YmVhbiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0LkFjY291bnRTcHJpbmdSZXNvdXJjZSIvPgorCisgICAgPGJlYW4gY2xhc3M9Im9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdC5TZXJ2aWNlUmVzb3VyY2UiLz4KKworICAgIDxiZWFuIGNsYXNzPSJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuQ29udHJvbGxlclJlc291cmNlIi8+CisKKyAgICA8YmVhbiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0LlJlcG9zaXRvcnlSZXNvdXJjZSIvPgorCisgICAgPGJlYW4gY2xhc3M9Im9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdC5FbmRwb2ludFJlc291cmNlIi8+CisKKzwvYmVhbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjZmY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMCIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCI+CisKKyAgPG1vZHVsZS1uYW1lPmplcnNleS1zcHJpbmctdGVzdDwvbW9kdWxlLW5hbWU+CisKKyAgICA8IS0tIHVzZSB0aGlzIHRvIGV4cGxpY2l0bHkgY29uZmlndXJlIFNwcmluZyAtLT4KKyAgICA8IS0tCisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyTGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5yZXF1ZXN0LlJlcXVlc3RDb250ZXh0TGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisgICAgPGNvbnRleHQtcGFyYW0+CisgICAgICAgIDxwYXJhbS1uYW1lPmNvbnRleHRDb25maWdMb2NhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgPHBhcmFtLXZhbHVlPmNsYXNzcGF0aDovYXBwbGljYXRpb25Db250ZXh0LnhtbDwvcGFyYW0tdmFsdWU+CisgICAgPC9jb250ZXh0LXBhcmFtPgorICAgIC0tPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0Lk15QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisKKzwvd2ViLWFwcD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50UmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmOWYxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50UmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgciA9IHRhcmdldCgpLnBhdGgoIi9qZXJzZXkvYWNjb3VudC9tZXNzYWdlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMociwgIm4vYSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFJlc291cmNlVGVzdEJhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFJlc291cmNlVGVzdEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzc3NzRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50UmVzb3VyY2VUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5zdGFydHNXaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIEpBWC1SUyByZXNvdXJjZSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWNjb3VudFJlc291cmNlVGVzdEJhc2UgZXh0ZW5kcyBSZXNvdXJjZVRlc3RCYXNlIHsKKworICAgIC8vIHRlc3Qgc2luZ2xldG9uIHNjb3BlZCBTcHJpbmcgYmVhbiBpbmplY3Rpb24gdXNpbmcgQEluamVjdCArIEBBdXRvd2lyZWQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25TY29wZWRTcHJpbmdTZXJ2aWNlKCkgeworICAgICAgICBmaW5hbCBCaWdEZWNpbWFsIG5ld0JhbGFuY2UgPSBuZXcgQmlnRGVjaW1hbChNYXRoLnJhbmRvbSgpKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoZ2V0UmVzb3VyY2VGdWxsUGF0aCgpKTsKKworICAgICAgICB0LnBhdGgoIi9zaW5nbGV0b24veHl6MTIzIikucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KG5ld0JhbGFuY2UudG9TdHJpbmcoKSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBmaW5hbCBCaWdEZWNpbWFsIGJhbGFuY2UgPSB0LnBhdGgoIi9zaW5nbGV0b24vYXV0b3dpcmVkL3h5ejEyMyIpLnJlcXVlc3QoKS5nZXQoQmlnRGVjaW1hbC5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXdCYWxhbmNlLCBiYWxhbmNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0U2NvcGVkU3ByaW5nU2VydmljZSgpIHsKKyAgICAgICAgZmluYWwgQmlnRGVjaW1hbCBuZXdCYWxhbmNlID0gbmV3IEJpZ0RlY2ltYWwoTWF0aC5yYW5kb20oKSk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0ID0gdGFyZ2V0KGdldFJlc291cmNlRnVsbFBhdGgoKSk7CisgICAgICAgIGZpbmFsIEJpZ0RlY2ltYWwgYmFsYW5jZSA9IHQucGF0aCgicmVxdWVzdC9hYmM0NTYiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KG5ld0JhbGFuY2UpLCBCaWdEZWNpbWFsLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0JhbGFuY2UsIGJhbGFuY2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3RvdHlwZVNjb3BlZFNwcmluZ1NlcnZpY2UoKSB7CisgICAgICAgIGZpbmFsIEJpZ0RlY2ltYWwgbmV3QmFsYW5jZSA9IG5ldyBCaWdEZWNpbWFsKE1hdGgucmFuZG9tKCkpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdCA9IHRhcmdldChnZXRSZXNvdXJjZUZ1bGxQYXRoKCkpOworICAgICAgICBmaW5hbCBCaWdEZWNpbWFsIGJhbGFuY2UgPSB0LnBhdGgoInByb3RvdHlwZS9hYmM0NTYiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KG5ld0JhbGFuY2UpLCBCaWdEZWNpbWFsLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI5ODcuNjUiKSwgYmFsYW5jZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmxldEluamVjdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoZ2V0UmVzb3VyY2VGdWxsUGF0aCgpKTsKKworICAgICAgICBTdHJpbmcgc2VydmVyID0gdC5wYXRoKCJzZXJ2ZXIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoc2VydmVyLCBzdGFydHNXaXRoKCJQQVNTRUQ6ICIpKTsKKworICAgICAgICBzZXJ2ZXIgPSB0LnBhdGgoInNpbmdsZXRvbi9zZXJ2ZXIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoc2VydmVyLCBzdGFydHNXaXRoKCJQQVNTRUQ6ICIpKTsKKworICAgICAgICBzZXJ2ZXIgPSB0LnBhdGgoInNpbmdsZXRvbi9hdXRvd2lyZWQvc2VydmVyIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHNlcnZlciwgc3RhcnRzV2l0aCgiUEFTU0VEOiAiKSk7CisKKyAgICAgICAgc2VydmVyID0gdC5wYXRoKCJyZXF1ZXN0L3NlcnZlciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzZXJ2ZXIsIHN0YXJ0c1dpdGgoIlBBU1NFRDogIikpOworCisgICAgICAgIHNlcnZlciA9IHQucGF0aCgicHJvdG90eXBlL3NlcnZlciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzZXJ2ZXIsIHN0YXJ0c1dpdGgoIlBBU1NFRDogIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSmVyc2V5TWFuYWdlZElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9KZXJzZXlNYW5hZ2VkSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxNWUwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSmVyc2V5TWFuYWdlZElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGZvciBKZXJzZXkgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlNYW5hZ2VkSVRDYXNlIGV4dGVuZHMgQWNjb3VudFJlc291cmNlVGVzdEJhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUNvbmZpZyByYykgeworICAgICAgICByZXR1cm4gcmMucmVnaXN0ZXIoQWNjb3VudEplcnNleVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICIvamVyc2V5L2FjY291bnQiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlU2NvcGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0ID0gdGFyZ2V0KGdldFJlc291cmNlRnVsbFBhdGgoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gImhlbGxvLCB3b3JsZCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBlY2hvID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dChtZXNzYWdlKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGVjaG8pOworICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm4vYSIsIG1zZyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1Jlc291cmNlVGVzdEJhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvUmVzb3VyY2VUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjBkN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1Jlc291cmNlVGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5TcHJpbmdMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnNjb3BlLlJlcXVlc3RDb250ZXh0RmlsdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIEpBWC1SUyByZXNvdXJjZSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VUZXN0QmFzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfV0VCQVBQX0NPTlRFWFRfUEFUSCA9ICJqZXJzZXkuc3ByaW5nLnRlc3QuY29udGV4dFBhdGgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NPTlRBSU5FUl9GQUNUT1JZX0VYVEVSTkFMID0gIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwiCisgICAgICAgICAgICArICIuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoU3ByaW5nTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFJlcXVlc3RDb250ZXh0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgVGVzdFV0aWwucmVnaXN0ZXJISzJTZXJ2aWNlcyhyYyk7CisgICAgICAgIHJjLnByb3BlcnR5KCJjb250ZXh0Q29uZmlnTG9jYXRpb24iLCAiY2xhc3NwYXRoOmFwcGxpY2F0aW9uQ29udGV4dC54bWwiKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZShyYyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZShSZXNvdXJjZUNvbmZpZyByYyk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFJlc291cmNlUGF0aCgpOworCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUZ1bGxQYXRoKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgY29udGFpbmVyRmFjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShUZXN0UHJvcGVydGllcy5DT05UQUlORVJfRkFDVE9SWSk7CisgICAgICAgIGlmIChURVNUX0NPTlRBSU5FUl9GQUNUT1JZX0VYVEVSTkFMLmVxdWFscyhjb250YWluZXJGYWN0b3J5KSkgeworICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShURVNUX1dFQkFQUF9DT05URVhUX1BBVEgpICsgZ2V0UmVzb3VyY2VQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFJlc291cmNlUGF0aCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZENvbnRyb2xsZXJJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZENvbnRyb2xsZXJJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmU0MmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkQ29udHJvbGxlcklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGZvciBTcHJpbmcgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2VzIHdpdGggQENvbnRyb2xsZXIgYXJjaGV0eXBlLgorICoKKyAqIEBhdXRob3IgS29ucmFkIEdhcnVzIChrb25yYWQuZ2FydXMgYXQgZ21haWwuY29tKQorICovCitwdWJsaWMgY2xhc3MgU3ByaW5nTWFuYWdlZENvbnRyb2xsZXJJVENhc2UgZXh0ZW5kcyBSZXNvdXJjZVRlc3RCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VDb25maWcgcmMpIHsKKyAgICAgICAgcmV0dXJuIHJjLnJlZ2lzdGVyKENvbnRyb2xsZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVBhdGgoKSB7CisgICAgICAgIHJldHVybiAiL3NwcmluZy9jb250cm9sbGVyIjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVNjb3BlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdCA9IHRhcmdldChnZXRSZXNvdXJjZUZ1bGxQYXRoKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJoZWxsbywgd29ybGQiOworICAgICAgICBmaW5hbCBTdHJpbmcgZWNobyA9IHQucGF0aCgibWVzc2FnZSIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQobWVzc2FnZSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBlY2hvKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IHQucGF0aCgibWVzc2FnZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkRW5kcG9pbnRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZEVuZHBvaW50SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5NjA5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZEVuZHBvaW50SVRDYXNlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgZm9yIFNwcmluZyBtYW5hZ2VkIEpBWC1SUyByZXNvdXJjZXMgd2l0aCBjdXN0b20gY29tcG9zaXRlCisgKiBhbm5vdGF0aW9uIHRoYXQgZGVyaXZlcyBmcm9tIEBDb21wb25lbnQuCisgKgorICogQGF1dGhvciBLb25yYWQgR2FydXMgKGtvbnJhZC5nYXJ1cyBhdCBnbWFpbC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTcHJpbmdNYW5hZ2VkRW5kcG9pbnRJVENhc2UgZXh0ZW5kcyBSZXNvdXJjZVRlc3RCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VDb25maWcgcmMpIHsKKyAgICAgICAgcmV0dXJuIHJjLnJlZ2lzdGVyKEVuZHBvaW50UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VQYXRoKCkgeworICAgICAgICByZXR1cm4gIi9zcHJpbmcvZW5kcG9pbnQiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlU2NvcGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0ID0gdGFyZ2V0KGdldFJlc291cmNlRnVsbFBhdGgoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gImhlbGxvLCB3b3JsZCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBlY2hvID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dChtZXNzYWdlKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGVjaG8pOworICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NwcmluZ01hbmFnZWRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZWE0MjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NwcmluZ01hbmFnZWRJVENhc2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBmb3IgU3ByaW5nIG1hbmFnZWQgSkFYLVJTIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitwdWJsaWMgY2xhc3MgU3ByaW5nTWFuYWdlZElUQ2FzZSBleHRlbmRzIEFjY291bnRSZXNvdXJjZVRlc3RCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VDb25maWcgcmMpIHsKKyAgICAgICAgcmV0dXJuIHJjLnJlZ2lzdGVyKEFjY291bnRTcHJpbmdSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVBhdGgoKSB7CisgICAgICAgIHJldHVybiAiL3NwcmluZy9hY2NvdW50IjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVNjb3BlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdCA9IHRhcmdldChnZXRSZXNvdXJjZUZ1bGxQYXRoKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJoZWxsbywgd29ybGQiOworICAgICAgICBmaW5hbCBTdHJpbmcgZWNobyA9IHQucGF0aCgibWVzc2FnZSIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQobWVzc2FnZSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBlY2hvKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IHQucGF0aCgibWVzc2FnZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIG1zZyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NwcmluZ01hbmFnZWRSZXBvc2l0b3J5SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NwcmluZ01hbmFnZWRSZXBvc2l0b3J5SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwMmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZFJlcG9zaXRvcnlJVENhc2UuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBmb3IgU3ByaW5nIG1hbmFnZWQgSkFYLVJTIHJlc291cmNlcyB3aXRoIEBSZXBvc2l0b3J5IGFyY2hldHlwZS4KKyAqCisgKiBAYXV0aG9yIEtvbnJhZCBHYXJ1cyAoa29ucmFkLmdhcnVzIGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNwcmluZ01hbmFnZWRSZXBvc2l0b3J5SVRDYXNlIGV4dGVuZHMgUmVzb3VyY2VUZXN0QmFzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKGZpbmFsIFJlc291cmNlQ29uZmlnIHJjKSB7CisgICAgICAgIHJldHVybiByYy5yZWdpc3RlcihSZXBvc2l0b3J5UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VQYXRoKCkgeworICAgICAgICByZXR1cm4gIi9zcHJpbmcvcmVwb3NpdG9yeSI7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTY29wZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoZ2V0UmVzb3VyY2VGdWxsUGF0aCgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiaGVsbG8sIHdvcmxkIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVjaG8gPSB0LnBhdGgoIm1lc3NhZ2UiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KG1lc3NhZ2UpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgZWNobyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSB0LnBhdGgoIm1lc3NhZ2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBtc2cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZFNlcnZpY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZFNlcnZpY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNjZWVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkU2VydmljZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGZvciBTcHJpbmcgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2VzIHdpdGggQFNlcnZpY2UgYXJjaGV0eXBlLgorICoKKyAqIEBhdXRob3IgS29ucmFkIEdhcnVzIChrb25yYWQuZ2FydXMgYXQgZ21haWwuY29tKQorICovCitwdWJsaWMgY2xhc3MgU3ByaW5nTWFuYWdlZFNlcnZpY2VJVENhc2UgZXh0ZW5kcyBSZXNvdXJjZVRlc3RCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VDb25maWcgcmMpIHsKKyAgICAgICAgcmV0dXJuIHJjLnJlZ2lzdGVyKFNlcnZpY2VSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVBhdGgoKSB7CisgICAgICAgIHJldHVybiAiL3NwcmluZy9zZXJ2aWNlIjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVNjb3BlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdCA9IHRhcmdldChnZXRSZXNvdXJjZUZ1bGxQYXRoKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJoZWxsbywgd29ybGQiOworICAgICAgICBmaW5hbCBTdHJpbmcgZWNobyA9IHQucGF0aCgibWVzc2FnZSIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQobWVzc2FnZSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBlY2hvKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IHQucGF0aCgibWVzc2FnZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9UZXN0VXRpbC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9UZXN0VXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YjQxNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1Rlc3RVdGlsLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlBlckxvb2t1cDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkJ1aWxkZXJIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisKK2NsYXNzIFRlc3RVdGlsIHsKKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgcmVnaXN0ZXJISzJTZXJ2aWNlcyhmaW5hbCBSZXNvdXJjZUNvbmZpZyByYykgeworICAgICAgICByYworICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKEJ1aWxkZXJIZWxwZXIubGluayhISzJTZXJ2aWNlU2luZ2xldG9uLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmluZChCdWlsZGVySGVscGVyLmxpbmsoSEsyU2VydmljZVJlcXVlc3RTY29wZWQuY2xhc3MpLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmluZChCdWlsZGVySGVscGVyLmxpbmsoSEsyU2VydmljZVBlckxvb2t1cC5jbGFzcykuaW4oUGVyTG9va3VwLmNsYXNzKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmUwOGViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3BvbS54bWwKQEAgLTAsMCArMSw4NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnRyYWNpbmctc3VwcG9ydDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi10cmFjaW5nLXN1cHBvcnQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+VHJhY2luZyBzdXBwb3J0IGludGVncmF0aW9uIHRlc3Q8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjbGllbnQgc2lkZSBjb25maWcgd29ya3MgLSBmYWlsc2FmZSBwbHVnaW4gZm9ya3MganZtIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPiR7cHJvamVjdC5idWlsZC50ZXN0T3V0cHV0RGlyZWN0b3J5fS9sb2dnaW5nLnByb3BlcnRpZXM8L2phdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0b3JzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3Rvcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzcG9uc2VIZWFkZXJTaXplPjE2MTkyPC9yZXNwb25zZUhlYWRlclNpemU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3Rvcj4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0b3JzPgorICAgICAgICAgICAgICAgICAgICA8IS0tIHNlcnZlciBzaWRlIGNvbmZpZyBkb2VzIG5vdCBmb3JrIHdpdGggamV0dHk6cnVuIGdvYWwgLSBpdCB1c2VzIHNhbWUganZtCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIG1hdmVuICctRCcgb3B0aW9uIGluc3RlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12biBfZ29hbF8gLURqYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZT10YXJnZXQvdGVzdC1jbGFzc2VzL2xvZ2dpbmcucHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qYXZhLnV0aWwubG9nZ2luZy5jb25maWcuZmlsZTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9L2xvZ2dpbmcucHJvcGVydGllczwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQWxsVHJhY2luZ1N1cHBvcnQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQWxsVHJhY2luZ1N1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjYwYTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9BbGxUcmFjaW5nU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5UcmFjaW5nQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9BTEwiKQorcHVibGljIGNsYXNzIEFsbFRyYWNpbmdTdXBwb3J0IGV4dGVuZHMgVHJhY2luZ1N1cHBvcnQgeworCisgICAgcHVibGljIEFsbFRyYWNpbmdTdXBwb3J0KCkgeworICAgICAgICBzdXBlcihUcmFjaW5nQ29uZmlnLkFMTCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0FzeW5jUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQXN5bmNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODE3MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0FzeW5jUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworCisvKioKKyogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyovCitAUGF0aCgiL2FzeW5jIikKK3B1YmxpYyBjbGFzcyBBc3luY1Jlc291cmNlIHsKKworICAgIEBQYXRoKCJ7bmFtZX0iKQorICAgIEBHRVQKKyAgICBwdWJsaWMgdm9pZCBnZXQoQFBhdGhQYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lLCBAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKG5hbWUpLnJldmVyc2UoKS50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBwdWJsaWMgdm9pZCBwb3N0KE1lc3NhZ2UgcG9zdCwgQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IE1lc3NhZ2UobmV3IFN0cmluZ0J1ZmZlcihwb3N0LmdldFRleHQoKSkucmV2ZXJzZSgpLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViLXJlc291cmNlLW1ldGhvZCIpCisgICAgQFBPU1QKKyAgICBwdWJsaWMgdm9pZCBwb3N0U3ViKE1lc3NhZ2UgcG9zdCwgQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IE1lc3NhZ2UobmV3IFN0cmluZ0J1ZmZlcihwb3N0LmdldFRleHQoKSkucmV2ZXJzZSgpLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViLXJlc291cmNlLWxvY2F0b3IiKQorICAgIHB1YmxpYyBBc3luY1N1YlJlc291cmNlIGdldFN1YkxvYygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3luY1N1YlJlc291cmNlKCk7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1sb2NhdG9yLW51bGwiKQorICAgIHB1YmxpYyBBc3luY1N1YlJlc291cmNlIGdldFN1YkxvY051bGwoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicnVudGltZS1leGNlcHRpb24iKQorICAgIHB1YmxpYyB2b2lkIGdldFJ1bnRpbWVFeGNlcHRpb24oQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNvbWV0aGluZyBkb2VzIG5vdCB3b3JrIC4uLiIpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1hcHBlZC1leGNlcHRpb24iKQorICAgIHB1YmxpYyB2b2lkIGdldE1hcHBlZEV4Y2VwdGlvbihAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgVGVzdEV4Y2VwdGlvbigiVGhpcyBjb3VsZCBiZSBjbGllbnQgZmF1bHQgLi4uIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Bc3luY1N1YlJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0FzeW5jU3ViUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjY2NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Bc3luY1N1YlJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CisKKy8qKgorKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBBc3luY1N1YlJlc291cmNlIHsKKyAgICBAUE9TVAorICAgIHB1YmxpYyB2b2lkIHBvc3QoTWVzc2FnZSBwb3N0LCBAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKHBvc3QuZ2V0VGV4dCgpKS5yZXZlcnNlKCkudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIEBQYXRoKCJzdWItcmVzb3VyY2UtbWV0aG9kIikKKyAgICBAUE9TVAorICAgIHB1YmxpYyB2b2lkIHBvc3RTdWIoTWVzc2FnZSBwb3N0LCBAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKHBvc3QuZ2V0VGV4dCgpKS5yZXZlcnNlKCkudG9TdHJpbmcoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVxdWVzdEZpbHRlcjY4LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0NvbnRhaW5lclJlcXVlc3RGaWx0ZXI2OC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjY4OGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0NvbnRhaW5lclJlcXVlc3RGaWx0ZXI2OC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByaW9yaXR5KDY4KQorcHVibGljIGNsYXNzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXI2OCBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBDb250YWluZXJSZXF1ZXN0RmlsdGVyNjguZmlsdGVyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Db250YWluZXJSZXF1ZXN0RmlsdGVyTm9Qcmlvcml0eS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Db250YWluZXJSZXF1ZXN0RmlsdGVyTm9Qcmlvcml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzA5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0NvbnRhaW5lclJlcXVlc3RGaWx0ZXJOb1ByaW9yaXR5LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXJOb1ByaW9yaXR5IGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIENvbnRhaW5lclJlcXVlc3RGaWx0ZXJOb1ByaW9yaXR5LmZpbHRlciIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI1MDAxLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0NvbnRhaW5lclJlc3BvbnNlRmlsdGVyNTAwMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzQzNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0NvbnRhaW5lclJlc3BvbnNlRmlsdGVyNTAwMS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByaW9yaXR5KDUwMDEpCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI1MDAxIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBDb250YWluZXJSZXNwb25zZUZpbHRlcjUwMDEuZmlsdGVyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Db250YWluZXJSZXNwb25zZUZpbHRlck5vUHJpb3JpdHkuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJOb1ByaW9yaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxZGExNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJOb1ByaW9yaXR5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyTm9Qcmlvcml0eSBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJOb1ByaW9yaXR5LmZpbHRlciIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmNGY2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyB0ZXh0OworCisgICAgcHVibGljIE1lc3NhZ2UoKSB7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2UoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBNZXNzYWdlOiB8IiArIHRleHQgKyAifCIpOworICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgeworICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSAoTWVzc2FnZSkgbzsKKworICAgICAgICBpZiAodGV4dCAhPSBudWxsID8gIXRleHQuZXF1YWxzKG1lc3NhZ2UudGV4dCkgOiBtZXNzYWdlLnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRleHQgIT0gbnVsbCA/IHRleHQuaGFzaENvZGUoKSA6IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlQm9keVJlYWRlckdlbmVyaWMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZUJvZHlSZWFkZXJHZW5lcmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MzMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZUJvZHlSZWFkZXJHZW5lcmljLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BDb25zdW1lcygiKi8qIikKK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVJlYWRlckdlbmVyaWMgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNZXNzYWdlPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lc3NhZ2UgcmVhZEZyb20oQ2xhc3M8TWVzc2FnZT4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5UmVhZGVyVGVzdEZvcm1hdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlQm9keVJlYWRlclRlc3RGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQwOTQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlQm9keVJlYWRlclRlc3RGb3JtYXQuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQENvbnN1bWVzKFV0aWxzLkFQUExJQ0FUSU9OX1hfSkVSU0VZX1RFU1QpCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlSZWFkZXJUZXN0Rm9ybWF0IGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8TWVzc2FnZT4geworCisgICAgYm9vbGVhbiBzZXJ2ZXJTaWRlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBNZXNzYWdlQm9keVJlYWRlclRlc3RGb3JtYXQoKSB7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VCb2R5UmVhZGVyVGVzdEZvcm1hdChmaW5hbCBib29sZWFuIHNlcnZlclNpZGUpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlID0gc2VydmVyU2lkZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuaXNBc3NpZ25hYmxlRnJvbShNZXNzYWdlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVzc2FnZSByZWFkRnJvbShmaW5hbCBDbGFzczxNZXNzYWdlPiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZW50aXR5U3RyZWFtLCBNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCB8fCAhbGluZS5zdGFydHNXaXRoKFV0aWxzLkZPUk1BVF9QUkVGSVgpIHx8ICFsaW5lLmVuZHNXaXRoKFV0aWxzLkZPUk1BVF9TVUZGSVgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklucHV0IGNvbnRlbnQgJyIgKyBsaW5lICsgIicgaXMgbm90IGluIGEgdmFsaWQgZm9ybWF0ISIpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IGxpbmUuc3Vic3RyaW5nKFV0aWxzLkZPUk1BVF9QUkVGSVgubGVuZ3RoKCksIGxpbmUubGVuZ3RoKCkgLSBVdGlscy5GT1JNQVRfU1VGRklYLmxlbmd0aCgpKTsKKworICAgICAgICBpZiAoc2VydmVyU2lkZSkgeworICAgICAgICAgICAgVXRpbHMudGhyb3dFeGNlcHRpb24odGV4dCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfUkVBREVSX1RIUk9XX1dFQl9BUFBMSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfUkVBREVSX1RIUk9XX1BST0NFU1NJTkcsCisgICAgICAgICAgICAgICAgICAgIFV0aWxzLlRlc3RBY3Rpb24uTUVTU0FHRV9CT0RZX1JFQURFUl9USFJPV19BTlkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKHRleHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZUJvZHlXcml0ZXJHZW5lcmljLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5V3JpdGVyR2VuZXJpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjk1YmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5V3JpdGVyR2VuZXJpYy5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByb2R1Y2VzKCIqLyoiKQorcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5V3JpdGVyR2VuZXJpYyBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE1lc3NhZ2U+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShNZXNzYWdlIG1lc3NhZ2UsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhNZXNzYWdlIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5V3JpdGVyVGVzdEZvcm1hdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlQm9keVdyaXRlclRlc3RGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgzZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlQm9keVdyaXRlclRlc3RGb3JtYXQuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByb2R1Y2VzKFV0aWxzLkFQUExJQ0FUSU9OX1hfSkVSU0VZX1RFU1QpCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlXcml0ZXJUZXN0Rm9ybWF0IGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TWVzc2FnZT4geworCisgICAgYm9vbGVhbiBzZXJ2ZXJTaWRlID0gdHJ1ZTsKKworICAgIHB1YmxpYyBNZXNzYWdlQm9keVdyaXRlclRlc3RGb3JtYXQoKSB7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VCb2R5V3JpdGVyVGVzdEZvcm1hdChmaW5hbCBib29sZWFuIHNlcnZlclNpZGUpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXJTaWRlID0gc2VydmVyU2lkZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZS5pc0Fzc2lnbmFibGVGcm9tKE1lc3NhZ2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgTWVzc2FnZSBtZXNzYWdlLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzZXJ2ZXJTaWRlKSB7CisgICAgICAgICAgICBVdGlscy50aHJvd0V4Y2VwdGlvbihtZXNzYWdlLmdldFRleHQoKSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfV1JJVEVSX1RIUk9XX1dFQl9BUFBMSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfV1JJVEVSX1RIUk9XX1BST0NFU1NJTkcsCisgICAgICAgICAgICAgICAgICAgIFV0aWxzLlRlc3RBY3Rpb24uTUVTU0FHRV9CT0RZX1dSSVRFUl9USFJPV19BTlkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZW50aXR5U3RyZWFtLCBNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKFV0aWxzLkZPUk1BVF9QUkVGSVgpOworICAgICAgICB3cml0ZXIud3JpdGUobWVzc2FnZS5nZXRUZXh0KCkpOworICAgICAgICB3cml0ZXIud3JpdGUoVXRpbHMuRk9STUFUX1NVRkZJWCk7CisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvT25EZW1hbmRUcmFjaW5nU3VwcG9ydC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9PbkRlbWFuZFRyYWNpbmdTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExNTI2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvT25EZW1hbmRUcmFjaW5nU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5UcmFjaW5nQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9PTl9ERU1BTkQiKQorcHVibGljIGNsYXNzIE9uRGVtYW5kVHJhY2luZ1N1cHBvcnQgZXh0ZW5kcyBUcmFjaW5nU3VwcG9ydCB7CisKKyAgICBwdWJsaWMgT25EZW1hbmRUcmFjaW5nU3VwcG9ydCgpIHsKKyAgICAgICAgc3VwZXIoVHJhY2luZ0NvbmZpZy5PTl9ERU1BTkQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9QcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXIyMy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9QcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXIyMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzMyYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1ByZU1hdGNoaW5nQ29udGFpbmVyUmVxdWVzdEZpbHRlcjIzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByZU1hdGNoaW5nCitAUHJpb3JpdHkoMjMpCitwdWJsaWMgY2xhc3MgUHJlTWF0Y2hpbmdDb250YWluZXJSZXF1ZXN0RmlsdGVyMjMgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogUHJlTWF0Y2hpbmdDb250YWluZXJSZXF1ZXN0RmlsdGVyMjMuZmlsdGVyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9QcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXI0Mi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9QcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXI0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODM5ODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1ByZU1hdGNoaW5nQ29udGFpbmVyUmVxdWVzdEZpbHRlcjQyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByZU1hdGNoaW5nCitAUHJpb3JpdHkoNDIpCitwdWJsaWMgY2xhc3MgUHJlTWF0Y2hpbmdDb250YWluZXJSZXF1ZXN0RmlsdGVyNDIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogUHJlTWF0Y2hpbmdDb250YWluZXJSZXF1ZXN0RmlsdGVyNDIuZmlsdGVyIik7CisgICAgICAgIFV0aWxzLnRocm93RXhjZXB0aW9uKHJlcXVlc3RDb250ZXh0LCB0aGlzLAorICAgICAgICAgICAgICAgIFV0aWxzLlRlc3RBY3Rpb24uUFJFX01BVENISU5HX1JFUVVFU1RfRklMVEVSX1RIUk9XX1dFQl9BUFBMSUNBVElPTiwKKyAgICAgICAgICAgICAgICBVdGlscy5UZXN0QWN0aW9uLlBSRV9NQVRDSElOR19SRVFVRVNUX0ZJTFRFUl9USFJPV19QUk9DRVNTSU5HLAorICAgICAgICAgICAgICAgIFV0aWxzLlRlc3RBY3Rpb24uUFJFX01BVENISU5HX1JFUVVFU1RfRklMVEVSX1RIUk9XX0FOWSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9SZWFkZXJJbnRlcmNlcHRvcjE0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1JlYWRlckludGVyY2VwdG9yMTQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc5NzFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9SZWFkZXJJbnRlcmNlcHRvcjE0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BQcmlvcml0eSgxNCkKK3B1YmxpYyBjbGFzcyBSZWFkZXJJbnRlcmNlcHRvcjE0IGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIFJlYWRlckludGVyY2VwdG9yMTQuYXJvdW5kUmVhZEZyb206IEJFRk9SRSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDQyKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg0Mik7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIFJlYWRlckludGVyY2VwdG9yMTQuYXJvdW5kUmVhZEZyb206IEFGVEVSIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1JlYWRlckludGVyY2VwdG9yMTguamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUmVhZGVySW50ZXJjZXB0b3IxOC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2Y0NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1JlYWRlckludGVyY2VwdG9yMTguamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByaW9yaXR5KDE4KQorcHVibGljIGNsYXNzIFJlYWRlckludGVyY2VwdG9yMTggaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogUmVhZGVySW50ZXJjZXB0b3IxOC5hcm91bmRSZWFkRnJvbTogQkVGT1JFIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIFJlYWRlckludGVyY2VwdG9yMTguYXJvdW5kUmVhZEZyb206IEFGVEVSIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEzYjU3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKKworLyoqCisqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisqLworQFBhdGgoIi9yb290IikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICBAUGF0aCgie25hbWV9IikKKyAgICBAR0VUCisgICAgcHVibGljIE1lc3NhZ2UgZ2V0KEBQYXRoUGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UobmV3IFN0cmluZ0J1ZmZlcihuYW1lKS5yZXZlcnNlKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBwdWJsaWMgTWVzc2FnZSBwb3N0KE1lc3NhZ2UgcG9zdCkgeworICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UobmV3IFN0cmluZ0J1ZmZlcihwb3N0LmdldFRleHQoKSkucmV2ZXJzZSgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBQYXRoKCJzdWItcmVzb3VyY2UtbWV0aG9kIikKKyAgICBAUE9TVAorICAgIHB1YmxpYyBNZXNzYWdlIHBvc3RTdWIoTWVzc2FnZSBwb3N0KSB7CisgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKHBvc3QuZ2V0VGV4dCgpKS5yZXZlcnNlKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1sb2NhdG9yIikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0U3ViTG9jKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1sb2NhdG9yLW51bGwiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJMb2NOdWxsKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJ1bnRpbWUtZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgTWVzc2FnZSBnZXRSdW50aW1lRXhjZXB0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU29tZXRoaW5nIGRvZXMgbm90IHdvcmsgLi4uIik7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZWQtZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgTWVzc2FnZSBnZXRNYXBwZWRFeGNlcHRpb24oKSB7CisgICAgICAgIHRocm93IG5ldyBUZXN0RXhjZXB0aW9uKCJUaGlzIGNvdWxkIGJlIGNsaWVudCBmYXVsdCAuLi4iKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvU3ViUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvU3ViUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODAzYzNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9TdWJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFN1YlJlc291cmNlIHsKKyAgICBAUE9TVAorICAgIHB1YmxpYyBNZXNzYWdlIHBvc3QoTWVzc2FnZSBwb3N0KSB7CisgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKHBvc3QuZ2V0VGV4dCgpKS5yZXZlcnNlKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1tZXRob2QiKQorICAgIEBQT1NUCisgICAgcHVibGljIE1lc3NhZ2UgcG9zdFN1YihNZXNzYWdlIHBvc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKG5ldyBTdHJpbmdCdWZmZXIocG9zdC5nZXRUZXh0KCkpLnJldmVyc2UoKS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Rlc3RFeGNlcHRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGNjZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Rlc3RFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9UZXN0RXhjZXB0aW9uTWFwcGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Rlc3RFeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQ2ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9UZXN0RXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByaW9yaXR5KFByaW9yaXRpZXMuVVNFUikKK0BQcm92aWRlcgorcHVibGljIGNsYXNzIFRlc3RFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VGVzdEV4Y2VwdGlvbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoVGVzdEV4Y2VwdGlvbiB0aHJvd2FibGUpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1MDEpLmJ1aWxkKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Rlc3RFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlckdlbmVyaWMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyR2VuZXJpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMGNjOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Rlc3RFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlckdlbmVyaWMuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJpb3JpdHkoUHJpb3JpdGllcy5VU0VSICsgMSkKK0BQcm92aWRlcgorcHVibGljIGNsYXNzIFRlc3RFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlckdlbmVyaWMgaW1wbGVtZW50cyBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxFeGNlcHRpb24+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEV4Y2VwdGlvbiB0aHJvd2FibGUpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1MDApLmJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwYWJsZShFeGNlcHRpb24gdGhyb3dhYmxlKSB7CisgICAgICAgIHJldHVybiAhKHRocm93YWJsZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyUnVudGltZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9UZXN0RXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJSdW50aW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2MWIzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyUnVudGltZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmlvcml0eShQcmlvcml0aWVzLlVTRVIgKyAyKQorQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyUnVudGltZSBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPFRocm93YWJsZT4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDUwMCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBhYmxlKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgcmV0dXJuICh0aHJvd2FibGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSAmJiAhKHRocm93YWJsZSBpbnN0YW5jZW9mIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1RyYWNpbmdTdXBwb3J0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1RyYWNpbmdTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiYjdhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVHJhY2luZ1N1cHBvcnQuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlRyYWNpbmdDb25maWc7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRyYWNpbmdTdXBwb3J0IGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFRyYWNpbmdTdXBwb3J0KFRyYWNpbmdDb25maWcgdHlwZSkgeworICAgICAgICBVdGlscy5jb25maWd1cmUodGhpcyk7CisgICAgICAgIHByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuVFJBQ0lORywgdHlwZS5uYW1lKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9VdGlscy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWI0NWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1V0aWxzLmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhYmxlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVXRpbHMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQUNJTkdfUFJFRklYID0gIlgtSmVyc2V5LVRyYWNpbmctIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX1hfSkVSU0VZX1RFU1QgPSAiYXBwbGljYXRpb24veC1qZXJzZXktdGVzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1BSRUZJWCA9ICItPSNbIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfU1VGRklYID0gIl0jPS0iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9URVNUX0FDVElPTiA9ICJ0ZXN0LWFjdGlvbiI7CisKKyAgICBwcml2YXRlIFV0aWxzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmUoUmVzb3VyY2VDb25maWcgY29uZmlndXJhYmxlKSB7CisgICAgICAgIGNvbmZpZ3VyYWJsZS5wYWNrYWdlcyhVdGlscy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKy8vICAgICAgICBPUjoKKy8vICAgICAgICBjb25maWd1cmUoKENvbmZpZ3VyYWJsZSljb25maWd1cmFibGUpOworLy8gICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihQcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXIyMy5jbGFzcyk7CisvLyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFByZU1hdGNoaW5nQ29udGFpbmVyUmVxdWVzdEZpbHRlcjQyLmNsYXNzKTsKKy8vICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoQ29udGFpbmVyUmVxdWVzdEZpbHRlcjY4LmNsYXNzKTsKKy8vICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoQ29udGFpbmVyUmVxdWVzdEZpbHRlck5vUHJpb3JpdHkuY2xhc3MpOworLy8gICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihDb250YWluZXJSZXNwb25zZUZpbHRlcjUwMDEuY2xhc3MpOworLy8gICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihDb250YWluZXJSZXNwb25zZUZpbHRlck5vUHJpb3JpdHkuY2xhc3MpOworLy8gICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihUZXN0RXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKy8vICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyR2VuZXJpYy5jbGFzcyk7CisvLyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFRlc3RFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlclJ1bnRpbWUuY2xhc3MpOworLy8gICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihSZXNvdXJjZS5jbGFzcyk7CisvLyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFN1YlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0QW5vbnltb3VzTG9nZ2VyKCksIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmUoQ2xpZW50Q29uZmlnIGNvbmZpZ3VyYWJsZSkgeworICAgICAgICBjb25maWd1cmUoKENvbmZpZ3VyYWJsZSkgY29uZmlndXJhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyYWJsZSBjb25maWd1cmFibGUpIHsKKyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFJlYWRlckludGVyY2VwdG9yMTQuY2xhc3MpOworICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoUmVhZGVySW50ZXJjZXB0b3IxOC5jbGFzcyk7CisgICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihXcml0ZXJJbnRlcmNlcHRvcjM5LmNsYXNzKTsKKyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFdyaXRlckludGVyY2VwdG9yNDUuY2xhc3MpOworICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIobmV3IE1lc3NhZ2VCb2R5UmVhZGVyVGVzdEZvcm1hdChmYWxzZSkpOworICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoTWVzc2FnZUJvZHlSZWFkZXJHZW5lcmljLmNsYXNzKTsKKyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKG5ldyBNZXNzYWdlQm9keVdyaXRlclRlc3RGb3JtYXQoZmFsc2UpKTsKKyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKE1lc3NhZ2VCb2R5V3JpdGVyR2VuZXJpYy5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZnJvbUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RBY3Rpb24gdGhyb3dXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGVzdEFjdGlvbiB0aHJvd1Byb2Nlc3NpbmdFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RBY3Rpb24gdGhyb3dBbnlFeGNlcHRpb24pIHsKKyAgICAgICAgZmluYWwgVXRpbHMuVGVzdEFjdGlvbiB0ZXN0QWN0aW9uID0gVXRpbHMuZ2V0VGVzdEFjdGlvbihyZXF1ZXN0Q29udGV4dCk7CisgICAgICAgIHRocm93RXhjZXB0aW9uSW1wbCh0ZXN0QWN0aW9uLCBmcm9tQ29udGV4dCwgdGhyb3dXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgdGhyb3dQcm9jZXNzaW5nRXhjZXB0aW9uLCB0aHJvd0FueUV4Y2VwdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKGZpbmFsIFN0cmluZyB0ZXN0QWN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZyb21Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXN0QWN0aW9uIHRocm93V2ViQXBwbGljYXRpb25FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RBY3Rpb24gdGhyb3dQcm9jZXNzaW5nRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXN0QWN0aW9uIHRocm93QW55RXhjZXB0aW9uKSB7CisgICAgICAgIFV0aWxzLlRlc3RBY3Rpb24gdGVzdEFjdGlvbjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRlc3RBY3Rpb24gPSBUZXN0QWN0aW9uLnZhbHVlT2YodGVzdEFjdGlvbk5hbWUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGVzdEFjdGlvbiA9IFRlc3RBY3Rpb24udmFsdWVPZihuZXcgU3RyaW5nQnVmZmVyKHRlc3RBY3Rpb25OYW1lKS5yZXZlcnNlKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgyKSB7CisgICAgICAgICAgICAgICAgdGVzdEFjdGlvbiA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyb3dFeGNlcHRpb25JbXBsKHRlc3RBY3Rpb24sIGZyb21Db250ZXh0LCB0aHJvd1dlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLCB0aHJvd1Byb2Nlc3NpbmdFeGNlcHRpb24sIHRocm93QW55RXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uSW1wbChmaW5hbCBVdGlscy5UZXN0QWN0aW9uIHRlc3RBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZyb21Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RBY3Rpb24gdGhyb3dXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXN0QWN0aW9uIHRocm93UHJvY2Vzc2luZ0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXN0QWN0aW9uIHRocm93QW55RXhjZXB0aW9uKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlRlc3QgRXhjZXB0aW9uIGZyb20gIiArIGZyb21Db250ZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgICAgICBpZiAodGVzdEFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0gZWxzZSBpZiAodGVzdEFjdGlvbiA9PSB0aHJvd1dlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0gZWxzZSBpZiAodGVzdEFjdGlvbiA9PSB0aHJvd1Byb2Nlc3NpbmdFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9IGVsc2UgaWYgKHRlc3RBY3Rpb24gPT0gdGhyb3dBbnlFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBUZXN0QWN0aW9uIGdldFRlc3RBY3Rpb24oQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgU3RyaW5nIHRlc3RBY3Rpb25IZWFkZXIgPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJTdHJpbmcoSEVBREVSX1RFU1RfQUNUSU9OKTsKKyAgICAgICAgVGVzdEFjdGlvbiB0ZXN0QWN0aW9uID0gbnVsbDsKKyAgICAgICAgaWYgKHRlc3RBY3Rpb25IZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdEFjdGlvbiA9IFRlc3RBY3Rpb24udmFsdWVPZih0ZXN0QWN0aW9uSGVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVzdEFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGVudW0gVGVzdEFjdGlvbiB7CisgICAgICAgIFBSRV9NQVRDSElOR19SRVFVRVNUX0ZJTFRFUl9USFJPV19XRUJfQVBQTElDQVRJT04sCisgICAgICAgIFBSRV9NQVRDSElOR19SRVFVRVNUX0ZJTFRFUl9USFJPV19QUk9DRVNTSU5HLAorICAgICAgICBQUkVfTUFUQ0hJTkdfUkVRVUVTVF9GSUxURVJfVEhST1dfQU5ZLAorICAgICAgICBNRVNTQUdFX0JPRFlfUkVBREVSX1RIUk9XX1dFQl9BUFBMSUNBVElPTiwKKyAgICAgICAgTUVTU0FHRV9CT0RZX1JFQURFUl9USFJPV19QUk9DRVNTSU5HLAorICAgICAgICBNRVNTQUdFX0JPRFlfUkVBREVSX1RIUk9XX0FOWSwKKyAgICAgICAgTUVTU0FHRV9CT0RZX1dSSVRFUl9USFJPV19XRUJfQVBQTElDQVRJT04sCisgICAgICAgIE1FU1NBR0VfQk9EWV9XUklURVJfVEhST1dfUFJPQ0VTU0lORywKKyAgICAgICAgTUVTU0FHRV9CT0RZX1dSSVRFUl9USFJPV19BTlk7CisgICAgICAgIC8vVE9ETyBhZGQgb3RoZXIgKl9USFJPV18qIGFjdGlvbnMgdG8gdGhyb3cgZXhjZXB0aW9uIGZyb20gb3RoZXIgc3RhZ2VzCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Xcml0ZXJJbnRlcmNlcHRvcjM5LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1dyaXRlckludGVyY2VwdG9yMzkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjI1N2RiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Xcml0ZXJJbnRlcmNlcHRvcjM5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BQcmlvcml0eSgzOSkKK3B1YmxpYyBjbGFzcyBXcml0ZXJJbnRlcmNlcHRvcjM5IGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIFdyaXRlckludGVyY2VwdG9yMzkuYXJvdW5kV3JpdGVUbzogQkVGT1JFIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNDIpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKFdyaXRlckludGVyY2VwdG9yMzkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBuZXcgRGF0ZSgpKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogV3JpdGVySW50ZXJjZXB0b3IzOS5hcm91bmRXcml0ZVRvOiBBRlRFUiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvV3JpdGVySW50ZXJjZXB0b3I0NS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Xcml0ZXJJbnRlcmNlcHRvcjQ1LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2ZjEzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvV3JpdGVySW50ZXJjZXB0b3I0NS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJpb3JpdHkoNDUpCitwdWJsaWMgY2xhc3MgV3JpdGVySW50ZXJjZXB0b3I0NSBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBXcml0ZXJJbnRlcmNlcHRvcjQ1LmFyb3VuZFdyaXRlVG86IEJFRk9SRSIpOworICAgICAgICBjb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoV3JpdGVySW50ZXJjZXB0b3I0NS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG5ldyBEYXRlKCkpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg0Mik7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIFdyaXRlckludGVyY2VwdG9yNDUuYXJvdW5kV3JpdGVUbzogQUZURVIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0FsbFRyYWNpbmdTdXBwb3J0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0FsbFRyYWNpbmdTdXBwb3J0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwNzg5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQWxsVHJhY2luZ1N1cHBvcnRJVENhc2UuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVHJhY2luZ0NvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuU2VydmVyVHJhY2VFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiAnQUxMJyB0cmFjaW5nIHN1cHBvcnQgdGVzdCB0aGF0IGlzIHJ1bm5pbmcgaW4gZXh0ZXJuYWwgSmV0dHkgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQWxsVHJhY2luZ1N1cHBvcnRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aDsKKworICAgIHB1YmxpYyBBbGxUcmFjaW5nU3VwcG9ydElUQ2FzZShTdHJpbmcgcmVzb3VyY2VQYXRoKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7Ii9yb290In0sCisgICAgICAgICAgICAgICAgeyIvYXN5bmMifSwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBKZXJzZXlUZXN0CisgICAgLy8KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBBbGxUcmFjaW5nU3VwcG9ydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY2xpZW50Q29uZmlnKSB7CisgICAgICAgIFV0aWxzLmNvbmZpZ3VyZShjbGllbnRDb25maWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyB0ZXN0cworICAgIC8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gcmVzb3VyY2UocmVzb3VyY2VQYXRoKS5wYXRoKCJOQU1FIikucmVxdWVzdCgpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIuZ2V0KCk7CisgICAgICAgIGFzc2VydFhKZXJzZXlUcmFjZShyZXNwb25zZSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZShyZXNvdXJjZVBhdGgpLnBhdGgoInJ1bnRpbWUtZXhjZXB0aW9uIikucmVxdWVzdCgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRlci5nZXQoKTsKKyAgICAgICAgYXNzZXJ0WEplcnNleVRyYWNlKHJlc3BvbnNlLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlZEV4Y2VwdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlKHJlc291cmNlUGF0aCkucGF0aCgibWFwcGVkLWV4Y2VwdGlvbiIpLnJlcXVlc3QoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIuZ2V0KCk7CisgICAgICAgIGFzc2VydFhKZXJzZXlUcmFjZShyZXNwb25zZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1MDEsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQ0MDUoKSB7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gcmVzb3VyY2UocmVzb3VyY2VQYXRoKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLmdldCgpOworICAgICAgICBhc3NlcnRYSmVyc2V5VHJhY2UocmVzcG9uc2UsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RTdWJSZXNvdXJjZU1ldGhvZCgpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZShyZXNvdXJjZVBhdGgpLnBhdGgoInN1Yi1yZXNvdXJjZS1tZXRob2QiKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLnBvc3QoRW50aXR5LmVudGl0eShuZXcgTWVzc2FnZSgiUE9TVCIpLCBVdGlscy5BUFBMSUNBVElPTl9YX0pFUlNFWV9URVNUKSk7CisgICAgICAgIGFzc2VydFhKZXJzZXlUcmFjZShyZXNwb25zZSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRTT1AiLCByZXNwb25zZS5yZWFkRW50aXR5KE1lc3NhZ2UuY2xhc3MpLmdldFRleHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFN1YlJlc291cmNlTG9jYXRvcigpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZShyZXNvdXJjZVBhdGgpLnBhdGgoInN1Yi1yZXNvdXJjZS1sb2NhdG9yIikucmVxdWVzdCgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRlci5wb3N0KEVudGl0eS5lbnRpdHkobmV3IE1lc3NhZ2UoIlBPU1QiKSwgVXRpbHMuQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCkpOworICAgICAgICBhc3NlcnRYSmVyc2V5VHJhY2UocmVzcG9uc2UsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUU09QIiwgcmVzcG9uc2UucmVhZEVudGl0eShNZXNzYWdlLmNsYXNzKS5nZXRUZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RTdWJSZXNvdXJjZUxvY2F0b3JOdWxsKCkgeworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlKHJlc291cmNlUGF0aCkucGF0aCgic3ViLXJlc291cmNlLWxvY2F0b3ItbnVsbCIpLnJlcXVlc3QoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIucG9zdChFbnRpdHkuZW50aXR5KG5ldyBNZXNzYWdlKCJQT1NUIiksIFV0aWxzLkFQUExJQ0FUSU9OX1hfSkVSU0VZX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RTdWJSZXNvdXJjZUxvY2F0b3JTdWJSZXNvdXJjZU1ldGhvZCgpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZShyZXNvdXJjZVBhdGgpLnBhdGgoInN1Yi1yZXNvdXJjZS1sb2NhdG9yIikucGF0aCgic3ViLXJlc291cmNlLW1ldGhvZCIpLnJlcXVlc3QoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIucG9zdChFbnRpdHkuZW50aXR5KG5ldyBNZXNzYWdlKCJQT1NUIiksIFV0aWxzLkFQUExJQ0FUSU9OX1hfSkVSU0VZX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0WEplcnNleVRyYWNlKHJlc3BvbnNlLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVFNPUCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTWVzc2FnZS5jbGFzcykuZ2V0VGV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFjZUlubmVyRXhjZXB0aW9uKCkgeworICAgICAgICAvLyBQUkVfTUFUQ0hJTkdfUkVRVUVTVF9GSUxURVIKKyAgICAgICAgdGVzdFRyYWNlSW5uZXJFeGNlcHRpb25JbXBsKFV0aWxzLlRlc3RBY3Rpb24uUFJFX01BVENISU5HX1JFUVVFU1RfRklMVEVSX1RIUk9XX1dFQl9BUFBMSUNBVElPTiwgNTAwLCBmYWxzZSk7CisgICAgICAgIHRlc3RUcmFjZUlubmVyRXhjZXB0aW9uSW1wbChVdGlscy5UZXN0QWN0aW9uLlBSRV9NQVRDSElOR19SRVFVRVNUX0ZJTFRFUl9USFJPV19QUk9DRVNTSU5HLCA1MDAsIHRydWUpOworICAgICAgICB0ZXN0VHJhY2VJbm5lckV4Y2VwdGlvbkltcGwoVXRpbHMuVGVzdEFjdGlvbi5QUkVfTUFUQ0hJTkdfUkVRVUVTVF9GSUxURVJfVEhST1dfQU5ZLCA1MDAsIHRydWUpOworICAgICAgICAvLyBNRVNTQUdFX0JPRFlfV1JJVEVSCisgICAgICAgIHRlc3RUcmFjZUlubmVyRXhjZXB0aW9uSW1wbChVdGlscy5UZXN0QWN0aW9uLk1FU1NBR0VfQk9EWV9XUklURVJfVEhST1dfV0VCX0FQUExJQ0FUSU9OLCA1MDAsIGZhbHNlKTsKKyAgICAgICAgdGVzdFRyYWNlSW5uZXJFeGNlcHRpb25JbXBsKFV0aWxzLlRlc3RBY3Rpb24uTUVTU0FHRV9CT0RZX1dSSVRFUl9USFJPV19QUk9DRVNTSU5HLCA1MDAsIHRydWUpOworICAgICAgICB0ZXN0VHJhY2VJbm5lckV4Y2VwdGlvbkltcGwoVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfV1JJVEVSX1RIUk9XX0FOWSwgNTAwLCB0cnVlKTsKKyAgICAgICAgLy8gTUVTU0FHRV9CT0RZX1JFQURFUgorICAgICAgICB0ZXN0VHJhY2VJbm5lckV4Y2VwdGlvbkltcGwoVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfUkVBREVSX1RIUk9XX1dFQl9BUFBMSUNBVElPTiwgNTAwLCBmYWxzZSk7CisgICAgICAgIHRlc3RUcmFjZUlubmVyRXhjZXB0aW9uSW1wbChVdGlscy5UZXN0QWN0aW9uLk1FU1NBR0VfQk9EWV9SRUFERVJfVEhST1dfUFJPQ0VTU0lORywgNTAwLCB0cnVlKTsKKyAgICAgICAgdGVzdFRyYWNlSW5uZXJFeGNlcHRpb25JbXBsKFV0aWxzLlRlc3RBY3Rpb24uTUVTU0FHRV9CT0RZX1JFQURFUl9USFJPV19BTlksIDUwMCwgdHJ1ZSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyB1dGlscworICAgIC8vCisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFRyYWNlSW5uZXJFeGNlcHRpb25JbXBsKFV0aWxzLlRlc3RBY3Rpb24gdGVzdEFjdGlvbiwgaW50IGV4cGVjdGVkU3RhdHVzLCBib29sZWFuIGV4Y2VwdGlvbkV4cGVjdGVkKSB7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gcmVzb3VyY2UocmVzb3VyY2VQYXRoKS5yZXF1ZXN0KCk7CisgICAgICAgIGJ1aWxkZXIuaGVhZGVyKFV0aWxzLkhFQURFUl9URVNUX0FDVElPTiwgdGVzdEFjdGlvbik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLnBvc3QoRW50aXR5LmVudGl0eShuZXcgTWVzc2FnZSh0ZXN0QWN0aW9uLm5hbWUoKSksIFV0aWxzLkFQUExJQ0FUSU9OX1hfSkVSU0VZX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0WEplcnNleVRyYWNlKHJlc3BvbnNlLCBleGNlcHRpb25FeHBlY3RlZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0YXR1cywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRYSmVyc2V5VHJhY2UoUmVzcG9uc2UgcmVzcG9uc2UsIGJvb2xlYW4gZXhjZXB0aW9uRXhwZWN0ZWQpIHsKKyAgICAgICAgaW50IGZpbmlzaGVkID0gMDsKKyAgICAgICAgaW50IGV4Y2VwdGlvbk1hcHBpbmcgPSAwOworCisgICAgICAgIGZvciAoU3RyaW5nIGsgOiByZXNwb25zZS5nZXRIZWFkZXJzKCkua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChrLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVdGlscy5IRUFERVJfVFJBQ0lOR19QUkVGSVgudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoayk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoU2VydmVyVHJhY2VFdmVudC5GSU5JU0hFRC5jYXRlZ29yeSgpKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCsrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuc3RhcnRzV2l0aChTZXJ2ZXJUcmFjZUV2ZW50LkVYQ0VQVElPTl9NQVBQSU5HLmNhdGVnb3J5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1hcHBpbmcrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKdXN0IG9uZSBGSU5JU0hFRCBleHBlY3RlZCEiLCAxLCBmaW5pc2hlZCk7CisgICAgICAgIGlmIChleGNlcHRpb25FeHBlY3RlZCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFWENFUFRJT04gZXhwZWN0ZWQhIiwgMSwgZXhjZXB0aW9uTWFwcGluZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkVYQ0VQVElPTiBOT1QgZXhwZWN0ZWQhIiwgMCwgZXhjZXB0aW9uTWFwcGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFdlYlRhcmdldCByZXNvdXJjZShTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0KCIvIiArIFRyYWNpbmdDb25maWcuQUxMKS5wYXRoKHBhdGgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9PbkRlbWFuZFRyYWNpbmdTdXBwb3J0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL09uRGVtYW5kVHJhY2luZ1N1cHBvcnRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWVjY2ViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9PbkRlbWFuZFRyYWNpbmdTdXBwb3J0SVRDYXNlLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlRyYWNpbmdMb2dnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5UcmFjaW5nQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogJ09OX0RFTUFORCcgdHJhY2luZyBzdXBwb3J0IHRlc3QgdGhhdCBpcyBydW5uaW5nIGluIGV4dGVybmFsIEpldHR5IGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgT25EZW1hbmRUcmFjaW5nU3VwcG9ydElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgLy8KKyAgICAvLyBKZXJzZXlUZXN0CisgICAgLy8KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBPbkRlbWFuZFRyYWNpbmdTdXBwb3J0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjbGllbnRDb25maWcpIHsKKyAgICAgICAgVXRpbHMuY29uZmlndXJlKGNsaWVudENvbmZpZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHRlc3RzCisgICAgLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vVHJhY2luZygpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZSgiL3Jvb3QiKS5yZXF1ZXN0KCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRlci5wb3N0KEVudGl0eS5lbnRpdHkobmV3IE1lc3NhZ2UoIlBPU1QiKSwgVXRpbHMuQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCkpOworICAgICAgICBhc3NlcnRGYWxzZShoYXNYX0plcnNleV9UcmFjZShyZXNwb25zZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRTT1AiLCByZXNwb25zZS5yZWFkRW50aXR5KE1lc3NhZ2UuY2xhc3MpLmdldFRleHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2VBY2NlcHRFbXB0eSgpIHsKKyAgICAgICAgdGVzdFRyYWNlQWNjZXB0KCIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFjZUFjY2VwdFRydWUoKSB7CisgICAgICAgIHRlc3RUcmFjZUFjY2VwdCgidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWNlQWNjZXB0V2hhdGV2ZXIoKSB7CisgICAgICAgIHRlc3RUcmFjZUFjY2VwdCgid2hhdGV2ZXIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFRyYWNlQWNjZXB0KFN0cmluZyBhY2NlcHRWYWx1ZSkgeworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlKCIvcm9vdCIpLnJlcXVlc3QoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLmhlYWRlcihUcmFjaW5nTG9nZ2VyLkhFQURFUl9BQ0NFUFQsIGFjY2VwdFZhbHVlKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IE1lc3NhZ2UoIlBPU1QiKSwgVXRpbHMuQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKGhhc1hfSmVyc2V5X1RyYWNlKHJlc3BvbnNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVFNPUCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTWVzc2FnZS5jbGFzcykuZ2V0VGV4dCgpKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHV0aWxzCisgICAgLy8KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNYX0plcnNleV9UcmFjZShSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBmb3IgKFN0cmluZyBrIDogcmVzcG9uc2UuZ2V0SGVhZGVycygpLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoay50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVXRpbHMuSEVBREVSX1RSQUNJTkdfUFJFRklYLnRvTG93ZXJDYXNlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgV2ViVGFyZ2V0IHJlc291cmNlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXQoIi8iICsgVHJhY2luZ0NvbmZpZy5PTl9ERU1BTkQpLnBhdGgocGF0aCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTczOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZ2dpbmcucHJvcGVydGllcwpAQCAtMCwwICsxLDI1IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKKyNBbGwgYXR0cmlidXRlcyBkZXRhaWxzCitoYW5kbGVycz1qYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlcgoramF2YS51dGlsLmxvZ2dpbmcuQ29uc29sZUhhbmRsZXIubGV2ZWw9RklORVNUCitqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXIuZm9ybWF0PSU0JC03cyBbJTMkc10gJTUkcyU2JHMlbgorCisjQWxsIGxvZyBsZXZlbCBkZXRhaWxzCisubGV2ZWw9SU5GTworb3JnLmdsYXNzZmlzaC5qZXJzZXkubGV2ZWw9Q09ORklHCitvcmcuZ2xhc3NmaXNoLmplcnNleS50cmFjaW5nLmxldmVsPUZJTkVTVApkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3BvbS54bWwgYi90ZXN0cy9tZW0tbGVha3MvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZiNGMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3BvbS54bWwKQEAgLTAsMCArMSwzMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrczwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW1lbWxlYWs8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIE1lbW9yeSBsZWFrcyB0ZXN0IG1hdmVuIHBhcmVudCBtb2R1bGUuCisKKyAgICAgICAgVGhpcyBtb2R1bGUgYWdncmVnYXRlcyBtYXZlbiBiYXNlZCBjb25maWd1cmF0aW9uIGZvciBhbGwgbWVtb3J5IGxlYWsgcmVsYXRlZCBtb2R1bGVzLgorCisgICAgICAgIE5vdGUgdGhhdCB0aGUgbWFqb3JpdHkgb2YgcGx1Z2luIGV4ZWN1dGlvbiBpbiBtYXZlbiBzdWItbW9kdWxlcyBpcyBib3VuZCB0byBwaGFzZSBub25lIGJ5IGRlZmF1bHQuIFRoZSByZWFzb24gaXMgdGhhdAorICAgICAgICBtZW1vcnkgbGVhayB0ZXN0cyBhcmUgZXhlY3V0ZWQgb25seSBpZiBvbmUgb2YgbWVtb3J5IGxlYWsgbWF2ZW4gcHJvZmlsZXMgYXJlIGFjdGl2YXRlZC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisKKyAgICAgICAgPG1lbWxlYWsuamVyc2V5LnZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvbWVtbGVhay5qZXJzZXkudmVyc2lvbj4KKworICAgICAgICA8bWVtbGVhay50bXBkaXI+L3RtcDwvbWVtbGVhay50bXBkaXI+CisKKyAgICAgICAgPG1lbWxlYWsuanZtLm1heGhlYXA+NTEybTwvbWVtbGVhay5qdm0ubWF4aGVhcD4KKyAgICAgICAgPG1lbWxlYWsuanZtLmhlYXBkdW1wZGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9PC9tZW1sZWFrLmp2bS5oZWFwZHVtcGRpcj4KKworICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC9leHRlcm5hbC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5wb3J0PiR7ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQuZHluYW1pY308L2V4dGVybmFsLmNvbnRhaW5lci5wb3J0PgorICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290PiR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn08L2V4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdD4KKyAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci53YXJQYXRoPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9LiR7cHJvamVjdC5wYWNrYWdpbmd9CisgICAgICAgIDwvZXh0ZXJuYWwuY29udGFpbmVyLndhclBhdGg+CisgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIubG9nRmlsZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jb250YWluZXIubG9nPC9leHRlcm5hbC5jb250YWluZXIubG9nRmlsZT4KKworICAgICAgICA8bWF2ZW4uYnVpbGQudGltZXN0YW1wLmZvcm1hdD55eXl5LU1NLWRkPC9tYXZlbi5idWlsZC50aW1lc3RhbXAuZm9ybWF0PgorICAgICAgICA8bWVtbGVhay50aW1lc3RhbXA+JHttYXZlbi5idWlsZC50aW1lc3RhbXB9PC9tZW1sZWFrLnRpbWVzdGFtcD4KKworICAgICAgICA8bWVtbGVhay5nbGFzc2Zpc2guemlwPiR7bWVtbGVhay50bXBkaXJ9L21lbWxlYWstdGVzdC1nbGFzc2Zpc2gtJHttZW1sZWFrLnRpbWVzdGFtcH0uemlwPC9tZW1sZWFrLmdsYXNzZmlzaC56aXA+CisgICAgICAgIDxtZW1sZWFrLmdsYXNzZmlzaC5hZG1pblBvcnQ+JHttZW1sZWFrLmdsYXNzZmlzaC5hZG1pblBvcnQuZHluYW1pY308L21lbWxlYWsuZ2xhc3NmaXNoLmFkbWluUG9ydD4KKyAgICAgICAgPG1lbWxlYWsuZ2xhc3NmaXNoLnVybD4ke2plcnNleS5ydW5uZXIuZGlzdFVybH08L21lbWxlYWsuZ2xhc3NmaXNoLnVybD4KKyAgICAgICAgPG1lbWxlYWsuZ2xhc3NmaXNoLm1heGhlYXA+JHttZW1sZWFrLmp2bS5tYXhoZWFwfTwvbWVtbGVhay5nbGFzc2Zpc2gubWF4aGVhcD4KKworICAgICAgICA8bWVtbGVhay53bHMuamFyPiR7bWVtbGVhay50bXBkaXJ9L21lbWxlYWstdGVzdC13bHMtJHttZW1sZWFrLnRpbWVzdGFtcH0uamFyPC9tZW1sZWFrLndscy5qYXI+CisgICAgICAgIDxtZW1sZWFrLndscy51cmw+JHtqZXJzZXkucnVubmVyLmRpc3RVcmx9PC9tZW1sZWFrLndscy51cmw+CisgICAgICAgIDxtZW1sZWFrLndscy5tYXhoZWFwPiR7bWVtbGVhay5qdm0ubWF4aGVhcH08L21lbWxlYWsud2xzLm1heGhlYXA+CisKKyAgICAgICAgPG1lbWxlYWsudG9tY2F0LnZlcnNpb24+OC4wLjIzPC9tZW1sZWFrLnRvbWNhdC52ZXJzaW9uPgorICAgICAgICA8bWVtbGVhay50b21jYXQudXJsPgorICAgICAgICAgICAgaHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L3RvbWNhdC90b21jYXQtOC92JHttZW1sZWFrLnRvbWNhdC52ZXJzaW9ufS9iaW4vYXBhY2hlLXRvbWNhdC0ke21lbWxlYWsudG9tY2F0LnZlcnNpb259LnppcAorICAgICAgICA8L21lbWxlYWsudG9tY2F0LnVybD4KKyAgICAgICAgPG1lbWxlYWsudG9tY2F0LnppcD4ke21lbWxlYWsudG1wZGlyfS9tZW1sZWFrLXRlc3QtdG9tY2F0LSR7bWVtbGVhay50b21jYXQudmVyc2lvbn0tJHttZW1sZWFrLnRpbWVzdGFtcH0uemlwCisgICAgICAgIDwvbWVtbGVhay50b21jYXQuemlwPgorICAgICAgICA8bWVtbGVhay50b21jYXQubWF4aGVhcD4ke21lbWxlYWsuanZtLm1heGhlYXB9PC9tZW1sZWFrLnRvbWNhdC5tYXhoZWFwPgorCisgICAgICAgIDwhLS0gYnkgZGVmYXVsdCwgYWxsIGNvbW1vbiBleGVjdXRpb25zIGFyZSBib3VuZCB0byB0aGUgcGFoc2UgJ25vbmUnIHNvIHRoYXQgdGhleSdyZSBub3QgZXhlY3V0ZWQgLS0+CisgICAgICAgIDxwaGFzZS5jb21tb24ucHJlLWludGVncmF0aW9uLXRlc3Q+bm9uZTwvcGhhc2UuY29tbW9uLnByZS1pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICA8cGhhc2UuY29tbW9uLnBvc3QtaW50ZWdyYXRpb24tdGVzdD5ub25lPC9waGFzZS5jb21tb24ucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PgorCisgICAgICAgIDwhLS0gYnkgZGVmYXVsdCwgcmVkZXBsb3ltZW50IGV4ZWN1dGlvbnMgYXJlIGJvdW5kIHRvIHRoZSBwaGFzZSAnbm9uZScgc28gdGhhdCB0aGV5J3JlIG5vdCBleGVjdXRlZCAtLT4KKyAgICAgICAgPHBoYXNlLnJlZGVwbG95bWVudC5wcmUtaW50ZWdyYXRpb24tdGVzdD5ub25lPC9waGFzZS5yZWRlcGxveW1lbnQucHJlLWludGVncmF0aW9uLXRlc3Q+CisgICAgICAgIDxwaGFzZS5yZWRlcGxveW1lbnQuaW50ZWdyYXRpb24tdGVzdD5ub25lPC9waGFzZS5yZWRlcGxveW1lbnQuaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgPHBoYXNlLnJlZGVwbG95bWVudC5wb3N0LWludGVncmF0aW9uLXRlc3Q+bm9uZTwvcGhhc2UucmVkZXBsb3ltZW50LnBvc3QtaW50ZWdyYXRpb24tdGVzdD4KKworICAgICAgICA8IS0tIGJ5IGRlZmF1bHQsIHRlc3QtY2FzZXMgZXhlY3V0aW9ucyBhcmUgYm91bmQgdG8gdGhlIHBoYXNlICdub25lJyBzbyB0aGF0IHRoZXkncmUgbm90IGV4ZWN1dGVkIC0tPgorICAgICAgICA8cGhhc2UudGVzdHMudGVzdD5ub25lPC9waGFzZS50ZXN0cy50ZXN0PgorICAgICAgICA8cGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3Q+bm9uZTwvcGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3Q+CisgICAgICAgIDxwaGFzZS50ZXN0cy5pbnRlZ3JhdGlvbi10ZXN0Pm5vbmU8L3BoYXNlLnRlc3RzLmludGVncmF0aW9uLXRlc3Q+CisgICAgICAgIDxwaGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3Q+bm9uZTwvcGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICA8cGhhc2UudGVzdHMudmVyaWZ5Pm5vbmU8L3BoYXNlLnRlc3RzLnZlcmlmeT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5yZWRlcGxveW1lbnQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT50ZXN0LWNhc2VzPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnJlc2VydmUtbmV0d29yay1wb3J0czwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5yZXNlcnZlLW5ldHdvcmstcG9ydDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9ydE5hbWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvcnROYW1lPmV4dGVybmFsLmNvbnRhaW5lci5wb3J0LmR5bmFtaWM8L3BvcnROYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BvcnROYW1lcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3YXJQYXRoPiR7ZXh0ZXJuYWwuY29udGFpbmVyLndhclBhdGh9PC93YXJQYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRSb290PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290fTwvY29udGV4dFJvb3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8cG9ydD4ke2V4dGVybmFsLmNvbnRhaW5lci5wb3J0fTwvcG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisKKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5nZjQ8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlPgorICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nbGFzc2Zpc2g0L2dsYXNzZmlzaC9kb21haW5zL21lbWxlYWtfdGVzdF9kb21haW4vbG9ncy9zZXJ2ZXIubG9nCisgICAgICAgICAgICAgICAgPC9leHRlcm5hbC5jb250YWluZXIubG9nRmlsZT4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb3J0TmFtZXMgY29tYmluZS5jaGlsZHJlbj0iYXBwZW5kIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb3J0TmFtZT5tZW1sZWFrLmdsYXNzZmlzaC5hZG1pblBvcnQuZHluYW1pYzwvcG9ydE5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9ydE5hbWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZG1pblBvcnQ+JHttZW1sZWFrLmdsYXNzZmlzaC5hZG1pblBvcnR9PC9hZG1pblBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXN0VXJsPiR7bWVtbGVhay5nbGFzc2Zpc2gudXJsfTwvZGlzdFVybD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3RUYXJnZXRMb2NhdGlvbj4ke21lbWxlYWsuZ2xhc3NmaXNoLnppcH08L2Rpc3RUYXJnZXRMb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3RTdWJkaXI+Z2xhc3NmaXNoNDwvZGlzdFN1YmRpcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhlYXA+JHttZW1sZWFrLmdsYXNzZmlzaC5tYXhoZWFwfTwvbWF4SGVhcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2Y0LWRvd25sb2FkPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5kb3dubG9hZEdmNDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5jb21tb24ucHJlLWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2Y0LXN0YXJ0LWFuZC1kZXBsb3k8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0YXJ0QW5kRGVwbG95R2Y0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZjQtdW5kZXBsb3ktYW5kLXN0b3A8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0b3BHZjQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UuY29tbW9uLnBvc3QtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+d2xzPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIubG9nRmlsZT4KKyAgICAgICAgICAgICAgICAgICAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2xzMTIyMTAvbWVtbGVha190ZXN0X2RvbWFpbi93bHMubG9nCisgICAgICAgICAgICAgICAgPC9leHRlcm5hbC5jb250YWluZXIubG9nRmlsZT4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlzdFVybD4ke21lbWxlYWsud2xzLnVybH08L2Rpc3RVcmw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXN0VGFyZ2V0TG9jYXRpb24+JHttZW1sZWFrLndscy5qYXJ9PC9kaXN0VGFyZ2V0TG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXN0U3ViZGlyPndsczEyMjEwPC9kaXN0U3ViZGlyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SGVhcD4ke21lbWxlYWsud2xzLm1heGhlYXB9PC9tYXhIZWFwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD53bHMtZG93bmxvYWQ8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmRvd25sb2FkV2xzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD53bHMtZGVwbG95PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zdGFydEFuZERlcGxveVdsczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5jb21tb24ucHJlLWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+d2xzLXN0b3A8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0b3BXbHM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UuY29tbW9uLnBvc3QtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+dG9tY2F0PC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIubG9nRmlsZT4KKyAgICAgICAgICAgICAgICAgICAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXBhY2hlLXRvbWNhdC0ke21lbWxlYWsudG9tY2F0LnZlcnNpb259L2xvZ3MvY2F0YWxpbmEub3V0CisgICAgICAgICAgICAgICAgPC9leHRlcm5hbC5jb250YWluZXIubG9nRmlsZT4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlzdFVybD4ke21lbWxlYWsudG9tY2F0LnVybH08L2Rpc3RVcmw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXN0VGFyZ2V0TG9jYXRpb24+JHttZW1sZWFrLnRvbWNhdC56aXB9PC9kaXN0VGFyZ2V0TG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXN0U3ViZGlyPmFwYWNoZS10b21jYXQtJHttZW1sZWFrLnRvbWNhdC52ZXJzaW9ufTwvZGlzdFN1YmRpcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heEhlYXA+JHttZW1sZWFrLnRvbWNhdC5tYXhoZWFwfTwvbWF4SGVhcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dG9tY2F0LWRvd25sb2FkPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5kb3dubG9hZFRvbWNhdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5jb21tb24ucHJlLWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dG9tY2F0LWRlcGxveTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c3RhcnRBbmREZXBsb3lUb21jYXQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UuY29tbW9uLnByZS1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnRvbWNhdC1zdG9wPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zdG9wVG9tY2F0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLmNvbW1vbi5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisKKworICAgICAgICA8IS0tIHByb2ZpbGVzIHRoYXQgaGVscCBzZXQgJHttZW1sZWFrLnRtcGRpcn0gYmFzZWQgb24gZW52aXJvbm1lbnQgLS0+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1lbWxlYWstZW52LXRtcGRpcjwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPmVudi5UTVBESVI8L25hbWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLnRtcGRpcj4ke2Vudi5UTVBESVJ9PC9tZW1sZWFrLnRtcGRpcj4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLWVudi10bXA8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT5lbnYuVE1QPC9uYW1lPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8bWVtbGVhay50bXBkaXI+JHtlbnYuVE1QfTwvbWVtbGVhay50bXBkaXI+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKworICAgIDwvcHJvZmlsZXM+CisKKyAgICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tZW1sZWFrLXRlc3QtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ib208L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHttZW1sZWFrLmplcnNleS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICAgICAgPHNjb3BlPmltcG9ydDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcG9tLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjJmODcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9wb20ueG1sCkBAIC0wLDAgKzEsMTg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MucmVkZXBsb3ltZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtbWVtbGVhay1yZWRlcGxveW1lbnQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIE1lbW9yeSBsZWFrcyByZWRlcGxveW1lbnQgdGVzdC4KKworICAgICAgICBUaGlzIG1vZHVsZSAoYW5kIGFsbCBzdWItbW9kdWxlcykgY29tYmluZSBjb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbiBnb2FscyAoJ2Rvd25sb2FkJywgJ3N0YXJ0QW5kRGVwbG95JywgJ3N0b3AnKSB3aXRoCisgICAgICAgICdyZWRlcGxveScgZ29hbCB3aGljaCByZXBldGl0aXZlbHkgcmVkZXBsb3lzIGFuZCB0ZXN0cyB3aXRoIGEgc2luZ2xlIGh0dHAgcmVxdWVzdCB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24uCisKKyAgICAgICAgVG8gYnVpbGQgYWxsIHRoZSBtb2R1bGVzIGluIHRoZSByZWRlcGxveW1lbnQgc3ViLW1vZHVsZSwgcnVuOgorCisgICAgICAgIG12biBjbGVhbiBpbnN0YWxsIC1hbWQgLXBsIHRlc3RzL21lbS1sZWFrcy8gLVAgdG9tY2F0LG1lbWxlYWstcmVkZXBsb3ltZW50IC1mYWUKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDwhLS0gYnkgZGVmYXVsdCwgYm91bmQgdG8gJ25vbmUnIHBoYXNlOyBpZiAnbWVtbGVhay1yZWRlcGxveW1lbnQnIHByb2ZpbGUgYWN0aXZlLCB0aGV5J3JlIGFjdGl2YXRlZCAtLT4KKyAgICAgICAgPHBoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdD4ke3BoYXNlLnJlZGVwbG95bWVudC5wcmUtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgPHBoYXNlLmNvbW1vbi5wb3N0LWludGVncmF0aW9uLXRlc3Q+JHtwaGFzZS5yZWRlcGxveW1lbnQucG9zdC1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2UuY29tbW9uLnBvc3QtaW50ZWdyYXRpb24tdGVzdD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnJlZGVwbG95bWVudC1oZWxsby13b3JsZC1hcHAtcmVmPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay1yZWRlcGxveW1lbnQ8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBzZXQgYWxsIHRoZSBwaGFzZXMgZm9yIHRoaXMgc3ViLW1vZHVsZSB0cmVlIHNvIHRoYXQgdGhlIGV4ZWN1dGlvbnMgYXJlIHVuLWJvdW5kIGZyb20gdGhlICdub25lJyBwaGFzZSAtLT4KKyAgICAgICAgICAgICAgICA8cGhhc2UucmVkZXBsb3ltZW50LnByZS1pbnRlZ3JhdGlvbi10ZXN0PnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZS5yZWRlcGxveW1lbnQucHJlLWludGVncmF0aW9uLXRlc3Q+CisgICAgICAgICAgICAgICAgPHBoYXNlLnJlZGVwbG95bWVudC5pbnRlZ3JhdGlvbi10ZXN0PmludGVncmF0aW9uLXRlc3Q8L3BoYXNlLnJlZGVwbG95bWVudC5pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICAgICAgICAgIDxwaGFzZS5yZWRlcGxveW1lbnQucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PnBvc3QtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2UucmVkZXBsb3ltZW50LnBvc3QtaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoZXNlIHRocmVlIG1lbWxlYWsucmVkZXBsb3kuKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBpbml0aWFsaXplZCBieSBzdWItbW9kdWxlcyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4cGVjdGVkU3RhdHVzPiR7bWVtbGVhay5yZWRlcGxveS5leHBlY3RlZFN0YXR1c308L2V4cGVjdGVkU3RhdHVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVkZXBsb3lDb3VudD4ke21lbWxlYWsucmVkZXBsb3kuY291bnR9PC9yZWRlcGxveUNvdW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVxdWVzdFBhdGhRdWVyeT4ke21lbWxlYWsucmVkZXBsb3kucmVxdWVzdFBhdGhRdWVyeX08L3JlcXVlc3RQYXRoUXVlcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmN1c3RvbS1lbmZvcmNlci1ydWxlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmVuZm9yY2Utb3V0LW9mLW1lbW9yeS1kaWQtbm90LW9jY3VyPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnJlZGVwbG95bWVudC5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGUgaW1wbGVtZW50YXRpb249Im9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVsZS5GaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlPiR7bWVtbGVhay5qdm0uaGVhcGR1bXBkaXJ9L2phdmFfcGlkKi5ocHJvZjwvZmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGUgaW1wbGVtZW50YXRpb249Im9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVsZS5QYXR0ZXJuTm90TWF0Y2hlZEluRmlsZVJ1bGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGU+JHtleHRlcm5hbC5jb250YWluZXIubG9nRmlsZX08L2ZpbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj4uKmphdmFcLmxhbmdcLk91dE9mTWVtb3J5RXJyb3IuKjwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ydWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhaWw+dHJ1ZTwvZmFpbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisKKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+d2xzPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPndscy1yZWRlcGxveTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cmVkZXBsb3lXbHM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UucmVkZXBsb3ltZW50LmludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmdmNDwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZjQtcmVkZXBsb3k8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlZGVwbG95R2Y0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnJlZGVwbG95bWVudC5pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50b21jYXQ8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dG9tY2F0LXJlZGVwbG95PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5yZWRlcGxveVRvbWNhdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5yZWRlcGxveW1lbnQuaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1oZWxsby13b3JsZC1hcHAtcmVmL3BvbS54bWwgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1oZWxsby13b3JsZC1hcHAtcmVmL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyZmI2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWhlbGxvLXdvcmxkLWFwcC1yZWYvcG9tLnhtbApAQCAtMCwwICsxLDEzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5yZWRlcGxveW1lbnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5yZWRlcGxveW1lbnQtaGVsbG8td29ybGQtYXBwLXJlZjwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtbWVtbGVhay1yZWRlcGxveW1lbnQtaGVsbG8td29ybGQtYXBwLXJlZjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgTWF2ZW4gbW9kdWxlIHRoYXQgdGVzdHMgOmhlbGxvd29ybGQtd2ViYXBwOndhciBpbiBvcmRlciB0byBwcmV2ZW50IHJlZ3Jlc3Npb24gb2YgYSBwcm9ibGVtIHdoZXJlIGEgcmVwZXRpdGl2ZSByZWRlcGxveW1lbnQKKyAgICAgICAgbWF5IGhhdmUgY2F1c2VkIG1lbW9yeSBsZWFrcy4KKworICAgICAgICBUbyBydW4gdGhpcyB0ZXN0LCBleGVjdXRlIGZyb20gSmVyc2V5IHJvb3QgZGlyOgorCisgICAgICAgIFsxXSBHbGFzc2Zpc2g6IG12biBpbnN0YWxsIC1hbSAtcGwgOnJlZGVwbG95bWVudC1oZWxsby13b3JsZC1hcHAtcmVmIC1QIGdmNCxtZW1sZWFrLXJlZGVwbG95bWVudAorCisgICAgICAgIFsyXSBXZWJsb2dpYzogbXZuIGluc3RhbGwgLWFtIC1wbCA6cmVkZXBsb3ltZW50LWhlbGxvLXdvcmxkLWFwcC1yZWYgLVAgd2xzLG1lbWxlYWstcmVkZXBsb3ltZW50CisKKyAgICAgICAgWzNdIFRvbWNhdDogbXZuIGluc3RhbGwgLWFtIC1wbCA6cmVkZXBsb3ltZW50LWhlbGxvLXdvcmxkLWFwcC1yZWYgLVAgdG9tY2F0LG1lbWxlYWstcmVkZXBsb3ltZW50CisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bWVtbGVhay5qdm0ubWF4aGVhcD4yNTZtPC9tZW1sZWFrLmp2bS5tYXhoZWFwPgorICAgICAgICA8bWVtbGVhay50b21jYXQubWF4aGVhcD41Nm08L21lbWxlYWsudG9tY2F0Lm1heGhlYXA+CisKKyAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci53YXJQYXRoPiR7b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM6aGVsbG93b3JsZC13ZWJhcHA6d2FyfTwvZXh0ZXJuYWwuY29udGFpbmVyLndhclBhdGg+CisgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3Q+aGVsbG93b3JsZC13ZWJhcHA8L2V4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdD4KKworICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5jb3VudD4yMDA8L21lbWxlYWsucmVkZXBsb3kuY291bnQ+CisgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LmV4cGVjdGVkU3RhdHVzPjIwMDwvbWVtbGVhay5yZWRlcGxveS5leHBlY3RlZFN0YXR1cz4KKyAgICAgICAgPG1lbWxlYWsucmVkZXBsb3kucmVxdWVzdFBhdGhRdWVyeT4ke2V4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdH0vaGVsbG93b3JsZDwvbWVtbGVhay5yZWRlcGxveS5yZXF1ZXN0UGF0aFF1ZXJ5PgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+dG9tY2F0PC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lbmZvcmNlLXRocmVhZGxvY2Fscy1sZWZ0LWNsZWFuZWQ8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5yZWRlcGxveW1lbnQucG9zdC1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhc3N1cmUgdGhhdCBUb21jYXQgVGhyZWFkTG9jYWwgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIG1lc3NhZ2VzIHdlcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIFRvbWNhdCBvdXRwdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzbywgVGhyZWFkTG9jYWxzIGFyZW4ndCBrZXB0IGNsZWFuIGFuZCB0aGF0J3Mgd2hhdCB1c2VycyBkbyBub3QgbGlrZSAoc2VlIEpFUlNFWS0yODkwKS4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGUgaW1wbGVtZW50YXRpb249Im9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVsZS5QYXR0ZXJuTm90TWF0Y2hlZEluRmlsZVJ1bGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZT4ke2V4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlfTwvZmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtDREFUQVsuKlNFVkVSRS4qVGhlIHdlYiBhcHBsaWNhdGlvbi4qY3JlYXRlZCBhIFRocmVhZExvY2FsIHdpdGgga2V5Liphdm9pZCBhIHByb2JhYmxlIG1lbW9yeSBsZWFrLipdXT48L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhNYXRjaGVkTGluZXM+MzwvbWF4TWF0Y2hlZExpbmVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmFpbD50cnVlPC9mYWlsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay1yZXByb2R1Y2VyPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLmplcnNleS52ZXJzaW9uPjIuMTk8L21lbWxlYWsuamVyc2V5LnZlcnNpb24+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cmVzb2x2ZS1tYXZlbi1kZXBlbmRlbmNpZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnByb3BlcnRpZXM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhlbGxvd29ybGQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwL3BvbS54bWwgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxYjU3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvcG9tLnhtbApAQCAtMCwwICsxLDE0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5yZWRlcGxveW1lbnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1tZW1sZWFrLXJlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBBbiBleGFtcGxlIGFwcGxpY2F0aW9uIHRoYXQgY2F1c2VzIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvbnRhaW5lciB3aGVyZSBpdCdzIGJlaW5nIHJlcGV0aXRpdmVseSByZWRlcGxveWVkLgorCisKKyAgICAgICAgVG8gcnVuIHRoaXMgZXhhbXBsZSwgZXhlY3V0ZSBmcm9tIGplcnNleSByb290IGRpcjoKKworICAgICAgICBbMV0gR2xhc3NmaXNoOiBtdm4gY2xlYW4gaW5zdGFsbCAtcGwgOnJlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwIC1QIGdmNCxtZW1sZWFrLWxlYWtpbmctdGVzdCxtZW1sZWFrLXJlZGVwbG95bWVudAorCisgICAgICAgIFsyXSBXZWJsb2dpYzogbXZuIGNsZWFuIGluc3RhbGwgLXBsIDpyZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcCAtUCB3bHMsbWVtbGVhay1sZWFraW5nLXRlc3QsbWVtbGVhay1yZWRlcGxveW1lbnQKKworICAgICAgICBbM10gVG9tY2F0OiBtdm4gY2xlYW4gaW5zdGFsbCAtcGwgOnJlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwIC1QIHRvbWNhdCxtZW1sZWFrLWxlYWtpbmctdGVzdCxtZW1sZWFrLXJlZGVwbG95bWVudAorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1lbWxlYWsuanZtLm1heGhlYXA+MjU2bTwvbWVtbGVhay5qdm0ubWF4aGVhcD4KKworICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5jb3VudD4xMDA8L21lbWxlYWsucmVkZXBsb3kuY291bnQ+CisgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LmV4cGVjdGVkU3RhdHVzPjIwMDwvbWVtbGVhay5yZWRlcGxveS5leHBlY3RlZFN0YXR1cz4KKyAgICAgICAgPG1lbWxlYWsucmVkZXBsb3kucmVxdWVzdFBhdGhRdWVyeT4ke2V4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdH0vaW52b2tlP3NpemU9MjAwMDAwMDA8L21lbWxlYWsucmVkZXBsb3kucmVxdWVzdFBhdGhRdWVyeT4KKworICAgIDwvcHJvcGVydGllcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZD5QT1NUPC9tZXRob2Q+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorCisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmVuZm9yY2Utb3V0LW9mLW1lbW9yeS1kaWQtbm90LW9jY3VyPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5ub25lPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1lbWxlYWstdGVzdC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1lbWxlYWstbGVha2luZy10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lbmZvcmNlLW91dC1vZi1tZW1vcnktZGlkLW5vdC1vY2N1cjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnJlZGVwbG95bWVudC5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9EYWVtb25UaHJlYWRNZW1vcnlMZWFraW5nUmVzb3VyY2UuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9EYWVtb25UaHJlYWRNZW1vcnlMZWFraW5nUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTVkZTRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3Rlc3RsZWFrL0RhZW1vblRocmVhZE1lbW9yeUxlYWtpbmdSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGxlYWs7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CisKKy8qKgorICogUmVzb3VyY2UgdGhhdCBjYXVzZXMge0BsaW5rIE91dE9mTWVtb3J5RXJyb3J9IGV4Y2VwdGlvbiB1cG9uIHJlcGV0aXRpdmUgY2FsbCBvZiB7QGxpbmsgI2ludm9rZShpbnQpfSBvZiBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzCisgKiBiZWluZyByZWRlcGxveWVkLgorICogPHAvPgorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyByZXNvdXJjZSAoYW5kIHRoZSBhcHApIGlzIHRvIHRlc3Qgd2hldGhlciB0aGUgbWVtb3J5IGxlYWtpbmcgaW5mcmFzdHJ1Y3R1cmUgZm9yIHJlZGVwbG95bWVudCBzY2VuYXJpb3MKKyAqIHdvcmtzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIERhZW1vblRocmVhZE1lbW9yeUxlYWtpbmdSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJpbnZva2UiKQorICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKEBEZWZhdWx0VmFsdWUoIjEwNDg1NzYiKSBAUXVlcnlQYXJhbSgic2l6ZSIpIGZpbmFsIGludCBzaXplKSB7CisKKyAgICAgICAgZmluYWwgRnV0dXJlPD8+IGZ1dHVyZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKS5zZXREYWVtb24odHJ1ZSkuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSdW5uaW5nIGEgVGhyZWFkISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYnl0ZXMgPSBzaXplIC8gKDEwMjQgKiAxMDI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBieXRlW11bXSBieXRlcyA9IG5ldyBieXRlW21ieXRlc11bXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtYnl0ZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1tpIC0gMV0gPSBuZXcgYnl0ZVsxMDI0ICogMTAyNF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb2NhdGVkOiAiICsgaSArICJNQiEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1lbW9yeSBhbGxvY2F0ZWQhIFRvdGFsOiAiICsgbWJ5dGVzICsgIk1CISBTbGVlcGluZy4uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDAwMDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBzbGVlcGluZyEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGcmVlaW5nOiAiICsgc2l6ZSArICIgb2YgYnl0ZXMuICIgKyBieXRlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhyZWFkIEludGVycnVwdGVkISIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5aW5nIHRvIGFsbG9jYXRlIGJ5dGVzIGZyb20gdGhlIHRocmVhZCBpdHNlbGYuIik7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOworICAgICAgICByZXR1cm4gIkZ1dHVyZSBzdWJtaXR0ZWQ6ICIgKyBmdXR1cmUgKyAiIGJ5dGVzIGFsbG9jYXRlZDogIiArIGJ5dGVzOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaGVsbG8iKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBoZWxsb1dvcmxkKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhFTExPIFdPUkxEISIpOworICAgICAgICByZXR1cm4gIkhFTExPIFdPUkxEISI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ODcxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRlc3RsZWFrOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKERhZW1vblRocmVhZE1lbW9yeUxlYWtpbmdSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjliZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiCisgICAgICAgIG1ldGFkYXRhLWNvbXBsZXRlPSJ0cnVlIj4KKworICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXk8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRlc3RsZWFrLlRlc3RBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvcG9tLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmY5MjRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MucmVkZXBsb3ltZW50PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+cmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtbWVtbGVhay1yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgUmVwcm9kdWNlciBvZiBISzItMjQ3LCBISzItMjY0CisKKyAgICAgICAgT24gc29tZSBwbGF0Zm9ybXMsIHJlZGVwbG95bWVudCBvZiB0aGlzIGFwcGxpY2F0aW9uIGRvZXMgbm90IGNhdXNlIGEgbWVtb3J5IGxlYWsuIEhvd2V2ZXIsIHNldmVyYWwgSEsyIGluc3RhbmNlcyBhcmUgbGVmdAorICAgICAgICBpbiB0aGUgY29udGFpbmVyIChyZWZlcmVuY2VkIGZyb20gVGhyZWFkTG9jYWxzKSwgd2hpY2ggaXMgd2hhdCBpcyB0ZXN0ZWQgKG9uIFRvbWNhdCBvbmx5KS4KKworICAgICAgICBbRXhlY3V0aW9uIGNvbW1hbmRzXQorCisgICAgICAgIFNob3VsZCBub3QgZmFpbDogbXZuIC1wbCA6cmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAgY2xlYW4gaW5zdGFsbCAtUCB0b21jYXQsbWVtbGVhay1yZWRlcGxveW1lbnQKKworICAgICAgICBTaG91bGQgZmFpbDogbXZuIC1wbCA6cmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAgY2xlYW4gaW5zdGFsbCAtUCB0b21jYXQsbWVtbGVhay1yZWRlcGxveW1lbnQsbWVtbGVhay1yZXByb2R1Y2VyCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bWVtbGVhay5qdm0ubWF4aGVhcD4xOTJtPC9tZW1sZWFrLmp2bS5tYXhoZWFwPgorICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290Pm5vLWplcnNleS1zZXJ2aWNlPC9leHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3Q+CisKKyAgICAgICAgPG1lbWxlYWsucmVkZXBsb3kuY291bnQ+NTAwPC9tZW1sZWFrLnJlZGVwbG95LmNvdW50PgorICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5leHBlY3RlZFN0YXR1cz4yMDA8L21lbWxlYWsucmVkZXBsb3kuZXhwZWN0ZWRTdGF0dXM+CisgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LnJlcXVlc3RQYXRoUXVlcnk+JHtleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3R9PC9tZW1sZWFrLnJlZGVwbG95LnJlcXVlc3RQYXRoUXVlcnk+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50b21jYXQ8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPG1lbWxlYWsuanZtLm1heGhlYXA+NDJtPC9tZW1sZWFrLmp2bS5tYXhoZWFwPgorICAgICAgICAgICAgICAgIDwhLS0gb24gVG9tY2F0LCB3ZSBjYW4gcmVseSBvbiB0aGUgbG9nIHJlY29yZCB3aGljaCBpcyBkZXRlY3RlZCBiZWxsb3cgYnkgbWF2ZW4tZW5mb3JjZXItcGx1Z2luIC0tPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LmNvdW50PjE8L21lbWxlYWsucmVkZXBsb3kuY291bnQ+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmVuZm9yY2UtdGhyZWFkbG9jYWxzLWxlZnQtY2xlYW5lZDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZW5mb3JjZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5yZWRlcGxveW1lbnQucG9zdC1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFzc3VyZSB0aGF0IFRvbWNhdCBUaHJlYWRMb2NhbCBtZW1vcnkgbGVhayBkZXRlY3Rpb24gbWVzc2FnZXMgd2VyZW4ndCBpbmNsdWRlZCBpbiB0aGUgVG9tY2F0IG91dHB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzbywgVGhyZWFkTG9jYWxzIGFyZW4ndCBrZXB0IGNsZWFuIGFuZCB0aGF0J3Mgd2hhdCB1c2VycyBkbyBub3QgbGlrZSAoc2VlIEpFUlNFWS0yODkwKS4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZSBpbXBsZW1lbnRhdGlvbj0ib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydWxlLlBhdHRlcm5Ob3RNYXRjaGVkSW5GaWxlUnVsZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZT4ke2V4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlfTwvZmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhW0NEQVRBWy4qU0VWRVJFLipUaGUgd2ViIGFwcGxpY2F0aW9uLipjcmVhdGVkIGEgVGhyZWFkTG9jYWwgd2l0aCBrZXkuKmF2b2lkIGEgcHJvYmFibGUgbWVtb3J5IGxlYWsuKl1dPjwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhNYXRjaGVkTGluZXM+MzwvbWF4TWF0Y2hlZExpbmVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3J1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmFpbD50cnVlPC9mYWlsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay1yZXByb2R1Y2VyPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxoazIudmVyc2lvbj4yLjUuMC1iMzA8L2hrMi52ZXJzaW9uPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxidWlsZD4KKworICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKworICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhrMi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhrMi1sb2NhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oazItdXRpbHM8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L0dyZWV0aW5nU2VydmljZS5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L0dyZWV0aW5nU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzQyMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvbm9qZXJzZXkvR3JlZXRpbmdTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5ub2plcnNleTsKKworaW1wb3J0IG9yZy5qdm5ldC5oazIuYW5ub3RhdGlvbnMuQ29udHJhY3Q7CisKKy8qKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAQ29udHJhY3QKK3B1YmxpYyBpbnRlcmZhY2UgR3JlZXRpbmdTZXJ2aWNlIHsKKyAgICBTdHJpbmcgZ2V0R3JlZXRpbmcoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9HcmVldGluZ1dyYXBwZXIuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9HcmVldGluZ1dyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQwYzliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L0dyZWV0aW5nV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3Mubm9qZXJzZXk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CisKKy8qKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgR3JlZXRpbmdXcmFwcGVyIHsKKyAgICBHcmVldGluZ1NlcnZpY2Ugc2VydmljZTsKKworICAgIHB1YmxpYyBHcmVldGluZ1dyYXBwZXIoU2VydmljZUxvY2F0b3IgbG9jYXRvcikgeworICAgICAgICBzZXJ2aWNlID0gbG9jYXRvci5nZXRTZXJ2aWNlKEdyZWV0aW5nU2VydmljZS5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbmplY3RlZEdyZWV0aW5nKCkgeworICAgICAgICByZXR1cm4gc2VydmljZS5nZXRHcmVldGluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L0hlbGxvU2VydmljZUltcGwuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9IZWxsb1NlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhYTJiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9IZWxsb1NlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5ub2plcnNleTsKKworaW1wb3J0IG9yZy5qdm5ldC5oazIuYW5ub3RhdGlvbnMuU2VydmljZTsKKworLyoqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgSGVsbG9TZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEdyZWV0aW5nU2VydmljZSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBmcm9tIE15U2VydmljZSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L01haW4uamF2YSBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4YjRjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9NYWluLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5ub2plcnNleTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5EeW5hbWljQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3JGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5iaW5kaW5nLkFic3RyYWN0QmluZGVyOworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1haW4geworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBTZXJ2aWNlTG9jYXRvckZhY3RvcnkgZmFjdG9yeSA9IFNlcnZpY2VMb2NhdG9yRmFjdG9yeS5nZXRJbnN0YW5jZSgpOworICAgICAgICBTZXJ2aWNlTG9jYXRvciBsb2NhdG9yID0gZmFjdG9yeS5jcmVhdGUoIm15TG9jYXRvciIpOworCisgICAgICAgIER5bmFtaWNDb25maWd1cmF0aW9uU2VydmljZSBkY3MgPSBsb2NhdG9yLmdldFNlcnZpY2UoRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgRHluYW1pY0NvbmZpZ3VyYXRpb24gZGMgPSBkY3MuY3JlYXRlRHluYW1pY0NvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBBYnN0cmFjdEJpbmRlciBiaW5kZXIgPSBuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kKEhlbGxvU2VydmljZUltcGwuY2xhc3MpLnRvKEdyZWV0aW5nU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbG9jYXRvci5pbmplY3QoYmluZGVyKTsKKyAgICAgICAgYmluZGVyLmJpbmQoZGMpOworCisgICAgICAgIGRjLmNvbW1pdCgpOworCisgICAgICAgIEdyZWV0aW5nV3JhcHBlciB3cmFwcGVyID0gbmV3IEdyZWV0aW5nV3JhcHBlcihsb2NhdG9yKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXN1bHQ6ICIgKyB3cmFwcGVyLmdldEluamVjdGVkR3JlZXRpbmcoKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvbm9qZXJzZXkvTXlTZXJ2bGV0LmphdmEgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvbm9qZXJzZXkvTXlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2YTI2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9NeVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLm5vamVyc2V5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkR5bmFtaWNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5EeW5hbWljQ29uZmlndXJhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNeVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yRmFjdG9yeSBmYWN0b3J5ID0gU2VydmljZUxvY2F0b3JGYWN0b3J5LmdldEluc3RhbmNlKCk7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IgPSBmYWN0b3J5LmNyZWF0ZSgibXlMb2NhdG9yIik7CisKKyAgICAgICAgRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlIGRjcyA9IGxvY2F0b3IuZ2V0U2VydmljZShEeW5hbWljQ29uZmlndXJhdGlvblNlcnZpY2UuY2xhc3MpOworICAgICAgICBEeW5hbWljQ29uZmlndXJhdGlvbiBkYyA9IGRjcy5jcmVhdGVEeW5hbWljQ29uZmlndXJhdGlvbigpOworCisgICAgICAgIEFic3RyYWN0QmluZGVyIGJpbmRlciA9IG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmQoSGVsbG9TZXJ2aWNlSW1wbC5jbGFzcykudG8oR3JlZXRpbmdTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBiaW5kZXIuYmluZChkYyk7CisKKyAgICAgICAgZGMuY29tbWl0KCk7CisKKyAgICAgICAgR3JlZXRpbmdXcmFwcGVyIHdyYXBwZXIgPSBuZXcgR3JlZXRpbmdXcmFwcGVyKGxvY2F0b3IpOworICAgICAgICByZXNwb25zZS5nZXRXcml0ZXIoKS53cml0ZSgiR3JlZXRpbmc6ICIgKyB3cmFwcGVyLmdldEluamVjdGVkR3JlZXRpbmcoKSk7CisgICAgICAgIGxvY2F0b3Iuc2h1dGRvd24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MjViNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TXlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLm5vamVyc2V5Lk15U2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5ub2plcnNleTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TXlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3OWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApAQCAtMCwwICsxLDI1IEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKzxodG1sPgorPGJvZHk+CisgICAgPGgyPkplcnNleSBSRVNUZnVsIFdlYiBBcHBsaWNhdGlvbiE8L2gyPgorICAgIDxwPjxhIGhyZWY9IndlYmFwaS9teXJlc291cmNlIj5KZXJzZXkgcmVzb3VyY2U8L2E+CisgICAgPHA+VmlzaXQgPGEgaHJlZj0iaHR0cDovL2plcnNleS5qYXZhLm5ldCI+UHJvamVjdCBKZXJzZXkgd2Vic2l0ZTwvYT4KKyAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBKZXJzZXkhCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3BvbS54bWwgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxODhkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvcG9tLnhtbApAQCAtMCwwICsxLDExNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnJlZGVwbG95bWVudDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnJlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW1lbWxlYWstcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisKKyAgICAgICAgVGhpcyBwcm9qZWN0IHNob3dzIHRoYXQgbm90IGNhcmVmdWwgdXNlIG9mIFRocmVhZExvY2FsIGluIGEgdGhyZWFkLXBvb2wgZW52aXJvbm1lbnQgaXMgYSByaXNrLiBJbiB0aGlzIGNhc2UsIG1lbW9yeSBsZWFrcworICAgICAgICBtYXkgb2NjdXIgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLgorCisgICAgICAgIEtub3duIGNhc2VzIHdoZW4gbWVtb3J5IGxlYWtzIGRvIGhhcHBlbjoKKworICAgICAgICBbMV0gVG9tY2F0IHdpdGggZGVwbG95bWVudCBieSB1c2luZyBpdHMgYWRtaW4gUkVTVCBBUEkgKGNvcHlpbmcgdG8gd2ViYXBwcyBkaXIgZG9lcyBub3QgY2F1c2UgYSBtZW1vcnkgbGVhayBzaW5jZSB0aGUKKyAgICAgICAgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgYSBkaWZmZXJlbnQgdGhyZWFkLCB3aGljaCBtaWdodCBnZXQgZXZlbnR1YWxseSBkaXNjYXJkZWQuKQorCisgICAgICAgIFsyXSBHbGFzc2Zpc2ggLSBwcm9iYWJseSB3b3JrcyBkdWUgdG8gYSBmYWN0LCB0aGF0IEhLMiBpcyBub3QgdXNlZCAoYXMgb3Bwb3NlZCB0byByZWRlcGxveW1lbnQtbm8tamVyc2V5LXRlc3QtYXBwKSBhbmQgdGhlCisgICAgICAgIGNsYXNzZXMgdGhhdCBwYXJ0aWNpcGF0ZSBvbiBzdHJvbmcgcmVmZXJlbmNlcyB0byBhIEdDIHJvb3QgYXJlIGxvYWRlZCBieSB3ZWJhcHAgY2xhc3Nsb2FkZXIuCisKKworICAgICAgICBUbyBydW4gdGhpcyB0ZXN0IHRocmVhZGxvY2FscyBjbGFzc2xvYWRlciBtZW1vcnkgbGVhayBleGFtcGxlLCBleGVjdXRlIGZyb20gamVyc2V5IHJvb3QgZGlyOgorCisgICAgICAgIFsxXSBHbGFzc2Zpc2g6IG12biBjbGVhbiBpbnN0YWxsIC1wbCA6cmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAgLVAgZ2Y0LG1lbWxlYWstbGVha2luZy10ZXN0LG1lbWxlYWstcmVkZXBsb3ltZW50CisKKyAgICAgICAgWzJdIFdlYmxvZ2ljOiBtdm4gY2xlYW4gaW5zdGFsbCAtcGwgOnJlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwIC1QIHdscyxtZW1sZWFrLWxlYWtpbmctdGVzdCxtZW1sZWFrLXJlZGVwbG95bWVudAorCisgICAgICAgIFszXSBUb21jYXQ6IG12biBjbGVhbiBpbnN0YWxsIC1wbCA6cmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAgLVAgdG9tY2F0LG1lbWxlYWstbGVha2luZy10ZXN0LG1lbWxlYWstcmVkZXBsb3ltZW50CisKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxtZW1sZWFrLmp2bS5tYXhoZWFwPjEyOG08L21lbWxlYWsuanZtLm1heGhlYXA+CisgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3Q+aGVsbG88L2V4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdD4KKworICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5jb3VudD4xMDAwMDwvbWVtbGVhay5yZWRlcGxveS5jb3VudD4KKyAgICAgICAgPG1lbWxlYWsucmVkZXBsb3kuZXhwZWN0ZWRTdGF0dXM+MjAwPC9tZW1sZWFrLnJlZGVwbG95LmV4cGVjdGVkU3RhdHVzPgorICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5yZXF1ZXN0UGF0aFF1ZXJ5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290fTwvbWVtbGVhay5yZWRlcGxveS5yZXF1ZXN0UGF0aFF1ZXJ5PgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+dG9tY2F0PC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLmp2bS5tYXhoZWFwPjQ4bTwvbWVtbGVhay5qdm0ubWF4aGVhcD4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLWxlYWtpbmctdGVzdDwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS1vdXQtb2YtbWVtb3J5LWRpZC1ub3Qtb2NjdXI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5yZWRlcGxveW1lbnQucG9zdC1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3RocmVhZGxvY2FsL1NvbWVDbGFzcy5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3RocmVhZGxvY2FsL1NvbWVDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMzZlNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGhyZWFkbG9jYWwvU29tZUNsYXNzLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50aHJlYWRsb2NhbDsKKworLyoqCisgKiBBIHNpbXBsZSBjbGFzcyB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgY2xhc3Mvb2JqZWN0IHJlZmVyZW5jZSBjaXJjbGUgdGhhdCBjYXVzZXMgYSBtZW1vcnkgbGVhay4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTb21lQ2xhc3MgeworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgaGVsbG8oKSB7CisgICAgICAgIHJldHVybiAiaGVsbG8iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90aHJlYWRsb2NhbC9TdGF0aWNSZWZlcmVuY2VDbGFzcy5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3RocmVhZGxvY2FsL1N0YXRpY1JlZmVyZW5jZUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2MmU3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90aHJlYWRsb2NhbC9TdGF0aWNSZWZlcmVuY2VDbGFzcy5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGhyZWFkbG9jYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkRGVxdWU7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIGtleSB0byB0aGUgY2xhc3Nsb2FkZXIgbWVtb3J5IGxlYWsgc2luY2UgaXQgaGFzIGEgc3RhdGljIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgd2hpY2ggd2lsbCByZWZlciBhIHtAbGluaworICogVGhyZWFkTG9jYWx9IGluc3RhbmNlIHdoaWNoIHJlZmVycyBhIGNsYXNzIG9iamVjdC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0aWNSZWZlcmVuY2VDbGFzcyB7CisKKyAgICBzdGF0aWMgZmluYWwgQ29uY3VycmVudExpbmtlZERlcXVlPFRocmVhZExvY2FsPENsYXNzPj4gU1RBVElDX0hPTERFUiA9IG5ldyBDb25jdXJyZW50TGlua2VkRGVxdWU8PigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3RocmVhZGxvY2FsL1RocmVhZExvY2FsTWVtb3J5TGVha1NlcnZsZXQuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90aHJlYWRsb2NhbC9UaHJlYWRMb2NhbE1lbW9yeUxlYWtTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1Yzg1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90aHJlYWRsb2NhbC9UaHJlYWRMb2NhbE1lbW9yeUxlYWtTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50aHJlYWRsb2NhbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogQSBzZXJ2bGV0IHRoYXQgaW50cm9kdWNlcyBhIG1lbW9yeSBsZWFrIHdpdGggYSBzaW5nbGUgY2FsbC4gQWxsIHRoZSBjbGFzc2VzIGxvYWRlZCBieSBjdXJyZW50IGNsYXNzbG9hZGVyIHdvbid0IGdldCBHQ2VkIGV2ZW4KKyAqIGFmdGVyIHRoaXMgYXBwbGljYXRpb24gaXMgdW5kZXBsb3llZC4KKyAqIDxwLz4KKyAqIFRoaXMgc2VydmxldCBkZW1vbnN0cmF0ZXMgdGhhdCBmaXggSEsyLTI0NyB3aGVuIHtAbGluayBUaHJlYWRMb2NhbH0gcmVmZXJlbmNlIGlzIGNoYW5nZWQgZnJvbSBhIHN0YXRpYyB0byBhbiBpbnN0YW5jZSwgaXQgZG9lcworICogbm90IGFsd2F5cyBzb2x2ZSBtZW1vcnkgbGVhayBpc3N1ZXMgYXMgbG9uZyBhcyBhIHN0YXRpYyByZWZlcmVuY2UgKGluIHRoaXMgY2FzZSB7QGxpbmsgU3RhdGljUmVmZXJlbmNlQ2xhc3MjU1RBVElDX0hPTERFUn0pCisgKiBob2xkcyAoZXZlbiB0cmFuc2l0aXZlbHkpIHRoZSB7QGxpbmsgVGhyZWFkTG9jYWx9IGluc3RhbmNlLgorICogPHAvPgorICogVG8gcmV2ZXJ0IHRoaXMgY2FzZSB0byB0aGUgc2ltcGxlIG9uZSAodGhlIG9yaWdpbmFsIG9uZSksIGNoYW5nZSB0aGUge0BsaW5rICN0aHJlYWRMb2NhbH0gaW5zdGFuY2Ugc2hvdWxkIGJlIHN0YXRpYyBhbmQgdGhhbiBubworICoge0BsaW5rIFN0YXRpY1JlZmVyZW5jZUNsYXNzI1NUQVRJQ19IT0xERVJ9IGlzIG5lZWRlZC4gVGhlIG1lbW9yeSBsZWFrIG9jY3VycyB3aXRob3V0IGFueSBvdGhlciBzcGVjaWFsIGFjdGlvbnMuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGhyZWFkTG9jYWxNZW1vcnlMZWFrU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKworICAgIC8qKgorICAgICAqIFRoaXMge0BsaW5rIFRocmVhZExvY2FsfSByZWZlcmVuY2UgaXMgaGVsZCBieSBpbnN0YW5jZSByZWZlcmVuY2UgYW5kIG1pZ2h0IGJlIEdDZWQ7IGhvd2V2ZXIsIHRoZSBjbGFzcyB7QGxpbmsgU29tZUNsYXNzfQorICAgICAqIGhhcyBhIHJlZmVyZW5jZSB0byBpdHMgY2xhc3Nsb2FkZXIgd2hpY2ggaGFzIGEgcmVmZXJlbmNlIHRvIHtAbGluayBTdGF0aWNSZWZlcmVuY2VDbGFzc30gY2xhc3Mgd2hpY2ggaGFzIGEgc3RhdGljIHJlZmVyZW5jZQorICAgICAqIHRvIHRoaXMgaW5zdGFuY2UuIEFzIGEgcmVzdWx0LCB0aGlzIHtAbGluayBUaHJlYWRMb2NhbH0gaW5zdGFuY2UgaXMgbmV2ZXIgR0NlZCBpbiBhIHRocmVhZCBwb29sIGVudmlyb25tZW50LgorICAgICAqIDxwLz4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIHdhcyBjaGFuZ2VkIHRvIGEgc3RhdGljIHJlZmVyZW5jZSwgdGhlIG1lbW9yeSBsZWFrIHdvdWxkIG9jY3VyIGV2ZW4gd2l0aG91dCB0aGUge0BsaW5rCisgICAgICogU3RhdGljUmVmZXJlbmNlQ2xhc3MjU1RBVElDX0hPTERFUn0gaG9sZGluZyB0aGlzIGluc3RhbmNlIChzZWUge0BsaW5rICNkb0dldChIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpfQorICAgICAqIG1ldGhvZCBiZWxsb3cpLgorICAgICAqLworICAgIGZpbmFsIFRocmVhZExvY2FsPENsYXNzPiB0aHJlYWRMb2NhbCA9IG5ldyBUaHJlYWRMb2NhbDxDbGFzcz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ2xhc3MgaW5pdGlhbFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIFNvbWVDbGFzcy5jbGFzczsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdGljUmVmZXJlbmNlQ2xhc3MuU1RBVElDX0hPTERFUi5hZGQodGhyZWFkTG9jYWwpOworICAgICAgICByZXNwb25zZS5nZXRXcml0ZXIoKS53cml0ZSgiR3JlZXRpbmc6ICIgKyBTb21lQ2xhc3MuaGVsbG8oKSArICJcbiIpOworICAgICAgICByZXNwb25zZS5nZXRXcml0ZXIoKS53cml0ZSgiVGhyZWFkIExvY2FscyBDb250ZW50OiAiICsgdGhyZWFkTG9jYWwuZ2V0KCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIlxuIik7CisgICAgICAgIHJlc3BvbnNlLmdldFdyaXRlcigpLndyaXRlKCJIb2xkZXIgc2l6ZTogIiArIFN0YXRpY1JlZmVyZW5jZUNsYXNzLlNUQVRJQ19IT0xERVIuc2l6ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNDE4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TXlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRocmVhZGxvY2FsLlRocmVhZExvY2FsTWVtb3J5TGVha1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPk15U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3BvbS54bWwgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDZlZTIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3BvbS54bWwKQEAgLTAsMCArMSwxMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+YmVhbi1wYXJhbS1sZWFrPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW1lbWxlYWstdGVzdGNhc2UtYmVhbi1wYXJhbS1sZWFrPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBSZXByb2R1Y2VyIG9mIEpFUlNFWS0yODAwCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bWVtbGVhay5qdm0ubWF4aGVhcD45Nm08L21lbWxlYWsuanZtLm1heGhlYXA+CisKKyAgICAgICAgPG1lbWxlYWsud2xzLm1heGhlYXA+MTI4bTwvbWVtbGVhay53bHMubWF4aGVhcD4KKyAgICAgICAgPG1lbWxlYWsudG9tY2F0Lm1heGhlYXA+NDJtPC9tZW1sZWFrLnRvbWNhdC5tYXhoZWFwPgorICAgICAgICA8bWVtbGVhay5qZXR0eS5tYXhoZWFwPjcwbTwvbWVtbGVhay5qZXR0eS5tYXhoZWFwPgorCisgICAgICAgIDxtZW1sZWFrLnRlc3QudGltZW91dD4yMDAwMDA8L21lbWxlYWsudGVzdC50aW1lb3V0PgorCisgICAgICAgIDxtZW1sZWFrLndscy5wYWNrYWdpbmdFeGNsdWRlcy53ZWJsb2dpYy54bWw+V0VCLUlORi93ZWJsb2dpYy54bWw8L21lbWxlYWsud2xzLnBhY2thZ2luZ0V4Y2x1ZGVzLndlYmxvZ2ljLnhtbD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tZW1sZWFrLXRlc3QtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8cGFja2FnaW5nRXhjbHVkZXM+JHttZW1sZWFrLndscy5wYWNrYWdpbmdFeGNsdWRlcy53ZWJsb2dpYy54bWx9PC9wYWNrYWdpbmdFeGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1lbWxlYWstcmVwcm9kdWNlcjwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8bWVtbGVhay5qZXJzZXkudmVyc2lvbj4yLjE2PC9tZW1sZWFrLmplcnNleS52ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLndscy5wYWNrYWdpbmdFeGNsdWRlcy53ZWJsb2dpYy54bWwgLz4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLW92ZXJyaWRlLWxpYnJhcmllczwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8bWVtbGVhay53bHMucGFja2FnaW5nRXhjbHVkZXMud2VibG9naWMueG1sIC8+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9iZWFucGFyYW0vQmVhblBhcmFtTGVha1Jlc291cmNlLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9iZWFucGFyYW0vQmVhblBhcmFtTGVha1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc4ZjY0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL2JlYW5wYXJhbS9CZWFuUGFyYW1MZWFrUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLmJlYW5wYXJhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIFRoaXMgcmVzb3VyY2UgcmVwcm9kdWNlcyBKRVJTRVktMjgwMCB3aGVuIHtAbGluayAjaW52b2tlQmVhblBhcmFtSW5qZWN0KCl9IGNhbGxlZCByZXBldGl0aXZlbHkuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL2JlYW5wYXJhbSIpCitwdWJsaWMgY2xhc3MgQmVhblBhcmFtTGVha1Jlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1ldGVyQmVhbiB7CisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFJlcXVlc3QgcmVxdWVzdDsKKworICAgICAgICBAUXVlcnlQYXJhbSgicSIpCisgICAgICAgIFN0cmluZyBxOworICAgIH0KKworICAgIEBCZWFuUGFyYW0KKyAgICBQYXJhbWV0ZXJCZWFuIGJlYW47CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJpbnZva2UiKQorICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlQmVhblBhcmFtSW5qZWN0KCkgeworICAgICAgICByZXR1cm4gYmVhbi5xOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaGVsbG93b3JsZCIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGhlbGxvV29ybGQoKSB7CisgICAgICAgIHJldHVybiAiSEVMTE8gV09STEQhIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL2JlYW5wYXJhbS9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL2JlYW5wYXJhbS9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzMzYzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvYmVhbnBhcmFtL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MuYmVhbnBhcmFtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEpBWC1SUyBBcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyB7QGxpbmsgQmVhblBhcmFtTGVha1Jlc291cmNlfSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihCZWFuUGFyYW1MZWFrUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMWJkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIgorICAgICAgICBtZXRhZGF0YS1jb21wbGV0ZT0idHJ1ZSIgPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MuYmVhbnBhcmFtLlRlc3RBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWJsb2dpYy54bWwgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2VibG9naWMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3M2U3MWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2VibG9naWMueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdsczp3ZWJsb2dpYy13ZWItYXBwIHhtbG5zOndscz0iaHR0cDovL3htbG5zLm9yYWNsZS5jb20vd2VibG9naWMvd2VibG9naWMtd2ViLWFwcCIKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS93ZWJsb2dpYy93ZWJsb2dpYy13ZWItYXBwIGh0dHA6Ly94bWxucy5vcmFjbGUuY29tL3dlYmxvZ2ljL3dlYmxvZ2ljLXdlYi1hcHAvMS4wL3dlYmxvZ2ljLXdlYi1hcHAueHNkIj4KKworICAgIDx3bHM6Y29udGFpbmVyLWRlc2NyaXB0b3I+CisgICAgICAgIDx3bHM6cHJlZmVyLWFwcGxpY2F0aW9uLXBhY2thZ2VzPgorICAgICAgICAgICAgPCEtLSBqc3IzMTEgLS0+CisgICAgICAgICAgICA8d2xzOnBhY2thZ2UtbmFtZT5qYXZheC53cy5ycy4qPC93bHM6cGFja2FnZS1uYW1lPgorICAgICAgICAgICAgPCEtLSBqYXZhc3Npc3QgLS0+CisgICAgICAgICAgICA8d2xzOnBhY2thZ2UtbmFtZT5qYXZhc3Npc3QuKjwvd2xzOnBhY2thZ2UtbmFtZT4KKyAgICAgICAgICAgIDwhLS0gYW9wIHJlcGFja2FnZWQgLS0+CisgICAgICAgICAgICA8d2xzOnBhY2thZ2UtbmFtZT5vcmcuYW9wYWxsaWFuY2UuKjwvd2xzOnBhY2thZ2UtbmFtZT4KKworICAgICAgICAgICAgPCEtLSBqZXJzZXkgMiAtLT4KKyAgICAgICAgICAgIDx3bHM6cGFja2FnZS1uYW1lPmplcnNleS5yZXBhY2thZ2VkLio8L3dsczpwYWNrYWdlLW5hbWU+CisgICAgICAgICAgICA8d2xzOnBhY2thZ2UtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS4qPC93bHM6cGFja2FnZS1uYW1lPgorICAgICAgICAgICAgPHdsczpwYWNrYWdlLW5hbWU+Y29tLnN1bi5yZXNlYXJjaC53cy53YWRsLio8L3dsczpwYWNrYWdlLW5hbWU+CisKKyAgICAgICAgICAgIDwhLS0gaGsyIC0tPgorICAgICAgICAgICAgPHdsczpwYWNrYWdlLW5hbWU+b3JnLmdsYXNzZmlzaC5oazIuKjwvd2xzOnBhY2thZ2UtbmFtZT4KKyAgICAgICAgICAgIDx3bHM6cGFja2FnZS1uYW1lPm9yZy5qdm5ldC5oazIuKjwvd2xzOnBhY2thZ2UtbmFtZT4KKyAgICAgICAgICAgIDx3bHM6cGFja2FnZS1uYW1lPm9yZy5qdm5ldC50aWdlcl90eXBlcy4qPC93bHM6cGFja2FnZS1uYW1lPgorICAgICAgICA8L3dsczpwcmVmZXItYXBwbGljYXRpb24tcGFja2FnZXM+CisKKyAgICAgICAgPHdsczpwcmVmZXItYXBwbGljYXRpb24tcmVzb3VyY2VzPgorICAgICAgICAgICAgPHdsczpyZXNvdXJjZS1uYW1lPk1FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnNlcnZsZXQuU2VydmxldENvbnRhaW5lckluaXRpYWxpemVyPC93bHM6cmVzb3VyY2UtbmFtZT4KKyAgICAgICAgICAgIDx3bHM6cmVzb3VyY2UtbmFtZT5NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlPC93bHM6cmVzb3VyY2UtbmFtZT4KKworICAgICAgICAgICAgPCEtLSBqZXJzZXkgLS0+CisgICAgICAgICAgICA8d2xzOnJlc291cmNlLW5hbWU+TUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuKjwvd2xzOnJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8d2xzOnJlc291cmNlLW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuKjwvd2xzOnJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8d2xzOnJlc291cmNlLW5hbWU+amVyc2V5LnJlcGFja2FnZWQuKjwvd2xzOnJlc291cmNlLW5hbWU+CisKKyAgICAgICAgICAgIDwhLS0gaGsyIC0tPgorICAgICAgICAgICAgPHdsczpyZXNvdXJjZS1uYW1lPk1FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guaGsyLio8L3dsczpyZXNvdXJjZS1uYW1lPgorICAgICAgICA8L3dsczpwcmVmZXItYXBwbGljYXRpb24tcmVzb3VyY2VzPgorICAgIDwvd2xzOmNvbnRhaW5lci1kZXNjcmlwdG9yPgorCis8L3dsczp3ZWJsb2dpYy13ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvYmVhbnBhcmFtL0JlYW5QYXJhbUxlYWtSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvYmVhbnBhcmFtL0JlYW5QYXJhbUxlYWtSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZmZiMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9iZWFucGFyYW0vQmVhblBhcmFtTGVha1Jlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5iZWFucGFyYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1lbWxlYWsuY29tbW9uLkFic3RyYWN0TWVtb3J5TGVha1dlYkFwcFRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tZW1sZWFrLmNvbW1vbi5NZW1vcnlMZWFrU3VjY2VlZGluZ1RpbWVvdXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UaW1lb3V0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRoaXMgaXMgYW4gaW50ZWdyYXRpb24gdGVzdCB0aGF0IHJlcHJvZHVjZXMgSkVSU0VZLTI4MDAgYnkgY2FsbGluZyBSRVNUZnVsIHJlc291cmNlIHtAbGluayBCZWFuUGFyYW1MZWFrUmVzb3VyY2V9CisgKiByZXBldGl0aXZlbHkuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQmVhblBhcmFtTGVha1Jlc291cmNlSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RNZW1vcnlMZWFrV2ViQXBwVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBSdWxlCisgICAgcHVibGljIFRpbWVvdXQgZ2xvYmFsVGltZW91dCA9IG5ldyBNZW1vcnlMZWFrU3VjY2VlZGluZ1RpbWVvdXQoMzAwXzAwMCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaGVMZWFrUmVzb3VyY2VPbmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYmVhbnBhcmFtL2ludm9rZSIpLnF1ZXJ5UGFyYW0oInEiLCAiaGVsbG8iKS5yZXF1ZXN0KCkucG9zdChudWxsKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhlTGVha0VuZGxlc3MoKSB7CisKKyAgICAgICAgZm9yIChsb25nIGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJcclJlcXVlc3RzIG1hZGU6ICIgKyBpKTsKKworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImJlYW5wYXJhbS9pbnZva2UiKS5xdWVyeVBhcmFtKCJxIiwgaSkucmVxdWVzdCgpLnBvc3QobnVsbCk7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgIT0gMjAwKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVGhlIHNlcnZlciB3YXMgdW5hYmxlIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QhIFRoaXMgbWF5IGluZGljYXRlIHRoYXQgT3V0T2ZNZW1vcnkgZXhjZXB0aW9uIG9jY3VycmVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudG9TdHJpbmcoaSksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9wb20ueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiN2Y3NmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3BvbS54bWwKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+bGVha2luZy10ZXN0LWFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1tZW1sZWFrLXRlc3RjYXNlLWxlYWtpbmctdGVzdC1hcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgdGVzdCBhcHBsaWNhdGlvbiBpcyB0byB0ZXN0IHRoZSB0ZXN0IGluZnJhc3RydWN0dXJlIHdoZXRoZXIgbWVtb3J5IGxlYWtzIGFyZSBjb3JyZWN0bHkgZGV0ZWN0ZWQgYW5kCisgICAgICAgIHJlcG9ydGVkLgorCisgICAgICAgIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHN0YW5kYXJkIHJlZ3Jlc3Npb24gdGVzdCBzdWl0ZSBzaW5jZSB0aGlzIGFwcGxpY2F0aW9uIGludGVudGlvbmFsbHkgY2F1c2VzIG1lbW9yeQorICAgICAgICBsZWFrcy4KKworICAgICAgICBJbiBvcmRlciB0byBpbmNsdWRlIHRlc3Qgb2YgdGhpcyBtb2R1bGUgcHJvZmlsZSAnbWVtbGVhay1sZWFraW5nLXRlc3QnIG11c3QgdG8gYmUgZW5hYmxlZC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxtZW1sZWFrLmp2bS5tYXhoZWFwPjI1Nm08L21lbWxlYWsuanZtLm1heGhlYXA+CisgICAgICAgIDxtZW1sZWFrLnRlc3QudGltZW91dD40MDAwMDwvbWVtbGVhay50ZXN0LnRpbWVvdXQ+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1lbWxlYWstdGVzdC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1lbWxlYWstbGVha2luZy10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvTWVtb3J5TGVha2luZ1Jlc291cmNlLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvTWVtb3J5TGVha2luZ1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjZTQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9NZW1vcnlMZWFraW5nUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRlc3RsZWFrOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogUmVzb3VyY2UgdGhhdCBjYXVzZXMge0BsaW5rIE91dE9mTWVtb3J5RXJyb3J9IGV4Y2VwdGlvbiB1cG9uIHJlcGV0aXRpdmUgY2FsbCBvZiB7QGxpbmsgI2ludm9rZShpbnQpfS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBNZW1vcnlMZWFraW5nUmVzb3VyY2UgeworCisgICAgZmluYWwgTGlzdDxPYmplY3Q+IGxlYWtpbmdMaXN0ID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgQFBPU1QKKyAgICBAUGF0aCgiaW52b2tlIikKKyAgICBwdWJsaWMgU3RyaW5nIGludm9rZShARGVmYXVsdFZhbHVlKCIxMDQ4NTc2IikgQFF1ZXJ5UGFyYW0oInNpemUiKSBpbnQgc2l6ZSkgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgbGVha2luZ0xpc3QuYWRkKGJ5dGVzKTsKKworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YobGVha2luZ0xpc3Quc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImhlbGxvIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgaGVsbG9Xb3JsZCgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIRUxMTyBXT1JMRCEiKTsKKyAgICAgICAgcmV0dXJuICJIRUxMTyBXT1JMRCEiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3Rlc3RsZWFrL1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3Rlc3RsZWFrL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDM1ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50ZXN0bGVhazsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihNZW1vcnlMZWFraW5nUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjkwYzlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIgorICAgICAgICBtZXRhZGF0YS1jb21wbGV0ZT0idHJ1ZSIgPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGxlYWsuVGVzdEFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorCisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXk8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvTWVtb3J5TGVha2luZ1Jlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvTWVtb3J5TGVha2luZ1Jlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3YjlhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9NZW1vcnlMZWFraW5nUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRlc3RsZWFrOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1lbWxlYWsuY29tbW9uLkFic3RyYWN0TWVtb3J5TGVha1dlYkFwcFRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tZW1sZWFrLmNvbW1vbi5NZW1vcnlMZWFrU3VjY2VlZGluZ1RpbWVvdXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UaW1lb3V0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogUGVyZm9ybXMgdGhlIHRlc3Qgb2YgYSBtZW1vcnkgbGVha2luZyBSRVNUZnVsIHJlc291cmNlLgorICogPHAvPgorICogVGhpcyB0ZXN0IGNsYXNzIHNob3VsZCBiZSB1c2VkIHRvIHRlc3QgdGhlIG1lbW9yeSBsZWFraW5nIHRlc3QgaW5mcmFzdHJ1Y3R1cmUuCisgKi8KK3B1YmxpYyBjbGFzcyBNZW1vcnlMZWFraW5nUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdE1lbW9yeUxlYWtXZWJBcHBUZXN0IHsKKworICAgIEBSdWxlCisgICAgcHVibGljIFRpbWVvdXQgZ2xvYmFsVGltZW91dCA9IG5ldyBNZW1vcnlMZWFrU3VjY2VlZGluZ1RpbWVvdXQoMTAwXzAwMCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBydW5zIGkgc2luZ2xlIHJlcXVlc3Q7IGFzIHN1Y2gsIGl0IG1heSBvciBtYXkgbm90IGNhdXNlIGEgbWVtb3J5IGxlYWsgKGFuZCBlbmQgd2l0aCBhIGZhaWx1cmUpLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRoZUxlYWsoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHdlYlRhcmdldCA9IHRhcmdldCgiaW52b2tlIikucXVlcnlQYXJhbSgic2l6ZSIsIDEwMjQgKiAxMDI0KTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHdlYlRhcmdldC5nZXRVcmkoKSk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViVGFyZ2V0LnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBzaG91bGQgZmFpbCBhZnRlciBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lIChkZXBlbmRpbmcgb24gdGhlIEpWTSBzZXR0aW5ncyB0b28pLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRoZUxlYWtFbmRsZXNzKCkgeworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIuIik7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiaW52b2tlIikucXVlcnlQYXJhbSgic2l6ZSIsIDEwMjQgKiAxMDI0KS5yZXF1ZXN0KCkucG9zdChudWxsKTsKKworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1cygpICE9IDIwMCkgeworICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBzZXJ2ZXIgd2FzIHVuYWJsZSB0byBmdWxmaWxsIHRoZSByZXF1ZXN0ISBUaGlzIG1heSBpbmRpY2F0ZSB0aGF0IE91dE9mTWVtb3J5IGV4Y2VwdGlvbiBvY2N1cnJlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvcG9tLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmY2U2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3BvbS54bWwKQEAgLTAsMCArMSwyODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1tZW1sZWFrLXRlc3RjYXNlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBNZW1vcnkgbGVha3MgdGVzdCBjYXNlcy4KKworICAgICAgICBUZXN0cyBpbiB0aGlzIG1hdmVuIHN1Ym1vZHVsZSBjYW4gYmUgZWl0aGVyOgorCisgICAgICAgIFsxXSBTaW1wbGUgdGVzdHMgZXhlY3V0ZWQgYnkgbWF2ZW4tc3VyZWZpcmUtcGx1Z2luIGluIGEgZGVkaWNhdGVkIEpWTS4gVGhlc2UgdGVzdHMgc2hvdWxkIGF0dGVtcHQgdG8gY2F1c2UgYSBtZW1vcnkgbGVhaworICAgICAgICBkaXJlY3RseS4gVGhlIGhlYXAgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgbWVhbnMgb2YgJ21lbWxlYWsuanZtLm1heGhlYXAnIHByb3BlcnR5LiBJdCBjYW4gYmUgY29tYmluZWQgd2l0aCBvdGhlcgorICAgICAgICBpbmZyYXN0cnVjdHVyZSB3aGljaCBpcyBkZXNjcmliZWQgYmVsbG93LgorCisgICAgICAgIFsyXSBJbnRlZ3JhdGlvbiB0ZXN0cyBleGVjdXRlZCBieSBtYXZlbi1zdXJlZmlyZS1wbHVnaW4uIFRoZXNlIHRlc3RzIHNob3VsZCB0ZXN0IGFnYWluc3QgSmVyc2V5IGFwcGxpY2F0aW9uIGRlcGxveWVkIHRvIGEKKyAgICAgICAgc2VydmxldCBjb250YWluZXIuIFRoZSBzdGF0ZSBvZiB0aGUgc2VydmxldCBjb250YWluZXIgKGUuZy4sIHdoZXRoZXIgT3V0T2ZNZW1vcnlFcnJvciBvY2N1cnJlZCkgc2hvdWxkIGJlIGluc3BlY3RlZCBieQorICAgICAgICBpbmZyYXN0cnVjdHVyZSBkZXNjcmliZWQgYmVsbG93LgorCisgICAgICAgIFRFU1QgSU5GUkFTVFJVQ1RVUkUKKworICAgICAgICBUaGUgdGVzdCBpbmZyYXN0cnVjdHVyZSBpcyBjb25maWd1cmVkIGZyb20gTWF2ZW4gYW5kIHRoZSB0ZXN0cyBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgTWF2ZW4uIE5vcm1hbGx5LCB0ZXN0LWNhc2VzIHNoYWxsCisgICAgICAgIG92ZXJyaWRlIG1hdmVuIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzIHBvbSBhbmQgZGVjbGFyZSByZXF1aXJlZCBtYXZlbiBwbHVnaW5zIGluIHRoZWlyIGJ1aWxkIHNlY3Rpb24uIEFsbCB0aGUgbWF2ZW4KKyAgICAgICAgcGx1Z2luIGV4ZWN1dGlvbnMgd2lsbCBiZSBjb25maWd1cmVkIGZyb20gdGhpcyBwb20uCisKKyAgICAgICAgW2FdIENvbnRhaW5lciBSdW5uZXJzIChvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjpjb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbikgZmVhdHVyZSBXZWJsb2dpYyBhbmQKKyAgICAgICAgR2xhc3NmaXNoNCB3aXRoIGZ1bmN0aW9uYWxpdHk6IGRvd25sb2FkLCBzdGFydCwgZGVwbG95IGFuZCBzdG9wLgorCisgICAgICAgIFtiXSBNYXZlbiBFbmZvcmNlIEN1c3RvbSBSdWxlcyAob3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW46Y3VzdG9tLWVuZm9yY2VyLXJ1bGVzKSB0aGF0IGNhbiBlbmZvcmNlCisgICAgICAgIG5vbi1leGlzdGVudCBKYXZhIEhlYXAgZHVtcHMgZmlsZXMgaW4gYSBjZXJ0YWluIHBhdGggb3Igbm8gT3V0T2ZNZW1vcnlFcnJvciBlcnJvcnMgaW4gYSBsb2cgZmlsZS4KKworICAgICAgICBbY10gSmV0dHkgZXhlY3V0aW9uIGluIGEgZGVkaWNhdGVkIEpWTSB3aXRoIGNvbmZpZ3VyZWQgdG8gZHVtcCBoZWFwIG9uIE91dE9mTWVtb3J5RXJyb3IgZXJyb3JzLgorCisgICAgICAgIFtkXSBDb21tb24gTWVtbGVhayBKVW5pdCB0ZXN0IGluZnJhc3RydWN0dXJlIHRoYXQgcHJvdmlkZXMgbWVhbnMgdG8gc3RvcCBhIHRlc3QgYWZ0ZXIgYSBjZXJ0YWluIHBlcmlvZCBvZiB0aW1lIGFuZCBtYXJrCisgICAgICAgIHRoZSB0ZXN0IGFzIHN1Y2Nlc3NmdWwgYXMgd2VsbCBhcyB0byBwZXJmb3JtIGhlYXAgZHVtcHMgZnJvbSB0aGUgSmF2YSBjb2RlIG9yIHRvIGluc3BlY3QgbG9nIGZpbGVzIGZvciBPdXRPZk1lbW9yeUVycm9yCisgICAgICAgIGVycm9ycy4KKworICAgICAgICBFWEFNUExFIE9GIEVYRUNVVElPTgorCisgICAgICAgIChleGVjdXRlcyBhbGwgbWVtbGVhayB0ZXN0IGNhc2VzKQorICAgICAgICBtdm4gY2xlYW4gaW5zdGFsbCAtYW1kIC1wbCB0ZXN0cy9tZW0tbGVha3MgLVAgZ2Y0LG1lbWxlYWstdGVzdC1jYXNlcyAtZmFlCisKKyAgICAgICAgKGV4ZWN1dGVzIHNodXRkb3duIGhvb2sgbGVhayBzaW5nbGUgdGVzdCBjYXNlKQorICAgICAgICBtdm4gY2xlYW4gaW5zdGFsbCAtYW0gLXBsIHRlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhayAtUCBnZjQsbWVtbGVhay10ZXN0LWNhc2VzIC1mYWUKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+YmVhbi1wYXJhbS1sZWFrPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2h1dGRvd24taG9vay1sZWFrPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2h1dGRvd24taG9vay1sZWFrLWNsaWVudDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmxlYWtpbmctdGVzdC1hcHA8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1lbWxlYWsudGVzdC50aW1lb3V0PjMwMDAwMDwvbWVtbGVhay50ZXN0LnRpbWVvdXQ+CisgICAgICAgIDxtZW1sZWFrLmpldHR5Lm1heGhlYXA+JHttZW1sZWFrLmp2bS5tYXhoZWFwfTwvbWVtbGVhay5qZXR0eS5tYXhoZWFwPgorCisgICAgICAgIDwhLS0gYnkgZGVmYXVsdCwgYm91bmQgdG8gJ25vbmUnIHBoYXNlOyBpZiAnbWVtbGVhay10ZXN0LWNhc2VzJyBwcm9maWxlIGFjdGl2ZSwgdGhleSdyZSBhY3RpdmF0ZWQgLS0+CisgICAgICAgIDxwaGFzZS5jb21tb24ucHJlLWludGVncmF0aW9uLXRlc3Q+JHtwaGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgPHBoYXNlLmNvbW1vbi5wb3N0LWludGVncmF0aW9uLXRlc3Q+JHtwaGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZS5jb21tb24ucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PgorCisgICAgICAgIDxwaGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT4ke3BoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3QuamV0dHk+CisgICAgICAgIDxwaGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3QuamV0dHk+JHtwaGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3QuamV0dHk+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5tZW1sZWFrLnRpbWVvdXQ+JHttZW1sZWFrLnRlc3QudGltZW91dH08L2plcnNleS5jb25maWcudGVzdC5tZW1sZWFrLnRpbWVvdXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHtleHRlcm5hbC5jb250YWluZXIucG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5jb250ZXh0Um9vdD4ke2V4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuY29udGV4dFJvb3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIubG9nZmlsZT4ke2V4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5sb2dmaWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgJ2RlZmF1bHQnIGlkIGlzIGJvdW5kIHRvICdub25lJyBiZWNhdXNlIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHNwbGl0IHRoZSBnb2FscyBhbmQgcmUtYmluZCB0aGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUga2VlcGluZyB0aGUgJ2RlZmF1bHQnIGlkIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5kZWZhdWx0PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+bm9uZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnJlLWJvdW5kLWludGVncmF0aW9uLXRlc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+aW50ZWdyYXRpb24tdGVzdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnRlc3RzLmludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cmUtYm91bmQtdmVyaWZ5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnZlcmlmeTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnRlc3RzLnZlcmlmeX08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QubWVtbGVhay50aW1lb3V0PiR7bWVtbGVhay50ZXN0LnRpbWVvdXR9PC9qZXJzZXkuY29uZmlnLnRlc3QubWVtbGVhay50aW1lb3V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QubWVtbGVhay5oZWFwRHVtcFBhdGg+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2plcnNleS5jb25maWcudGVzdC5tZW1sZWFrLmhlYXBEdW1wUGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke2V4dGVybmFsLmNvbnRhaW5lci5wb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmNvbnRleHRSb290PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5jb250ZXh0Um9vdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG14JHttZW1sZWFrLmp2bS5tYXhoZWFwfSAtWFg6K0hlYXBEdW1wT25PdXRPZk1lbW9yeUVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOkhlYXBEdW1wUGF0aD0ke21lbWxlYWsuanZtLmhlYXBkdW1wZGlyfSAtWFg6R0NUaW1lTGltaXQ9MjAgLVhYOkdDSGVhcEZyZWVMaW1pdD0zMAorICAgICAgICAgICAgICAgICAgICAgICAgPC9hcmdMaW5lPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC10ZXN0PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3Q8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS50ZXN0cy50ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay10ZXN0LWNhc2VzPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gc2V0IGFsbCB0aGUgcGhhc2VzIGZvciB0aGlzIHN1Yi1tb2R1bGUgdHJlZSBzbyB0aGF0IHRoZSBleGVjdXRpb25zIGFyZSB1bi1ib3VuZCBmcm9tIHRoZSAnbm9uZScgcGhhc2UgLS0+CisgICAgICAgICAgICAgICAgPHBoYXNlLnRlc3RzLnRlc3Q+dGVzdDwvcGhhc2UudGVzdHMudGVzdD4KKyAgICAgICAgICAgICAgICA8cGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3Q+cHJlLWludGVncmF0aW9uLXRlc3Q8L3BoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICAgICAgICAgIDxwaGFzZS50ZXN0cy5pbnRlZ3JhdGlvbi10ZXN0PmludGVncmF0aW9uLXRlc3Q8L3BoYXNlLnRlc3RzLmludGVncmF0aW9uLXRlc3Q+CisgICAgICAgICAgICAgICAgPHBoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdD5wb3N0LWludGVncmF0aW9uLXRlc3Q8L3BoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgICAgICAgICA8cGhhc2UudGVzdHMudmVyaWZ5PnZlcmlmeTwvcGhhc2UudGVzdHMudmVyaWZ5PgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD4ke3NraXAudGVzdHN9PC9za2lwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3BQb3J0Pjk5OTk8L3N0b3BQb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcEtleT5TVE9QPC9zdG9wS2V5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGV4dFBhdGg+LyR7ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290fTwvY29udGV4dFBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqdm1BcmdzPi1YbXM2NG0gLVhteCR7bWVtbGVhay5qZXR0eS5tYXhoZWFwfSAtWFg6UGVybVNpemU9MTI4bSAtWFg6TWF4UGVybVNpemU9MjU2bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOitIZWFwRHVtcE9uT3V0T2ZNZW1vcnlFcnJvciAtWFg6SGVhcER1bXBQYXRoPSR7bWVtbGVhay5qdm0uaGVhcGR1bXBkaXJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRGpldHR5LnBvcnQ9JHtleHRlcm5hbC5jb250YWluZXIucG9ydH0gLURqZXJzZXkuY29uZmlnLnRlc3QubWVtbGVhay5qZXR0eS5tYWdpY1J1bm5lcklkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1Eb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5sb2dGaWxlPSR7ZXh0ZXJuYWwuY29udGFpbmVyLmxvZ0ZpbGV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvanZtQXJncz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdhaXRGb3JDaGlsZD5mYWxzZTwvd2FpdEZvckNoaWxkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zdGFydC1qZXR0eTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdC5qZXR0eX08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bi1mb3JrZWQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zdG9wLWpldHR5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdC5qZXR0eX08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0b3A8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1zaW1wbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjcuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3VzdG9tLWVuZm9yY2VyLXJ1bGVzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS1vdXQtb2YtbWVtb3J5LWRpZC1ub3Qtb2NjdXI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmVuZm9yY2U8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlIGltcGxlbWVudGF0aW9uPSJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bGUuRmlsZVBhdHRlcm5Eb2VzTm90RXhpc3RSdWxlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZT4ke21lbWxlYWsuanZtLmhlYXBkdW1wZGlyfS9qYXZhX3BpZCouaHByb2Y8L2ZpbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3J1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlIGltcGxlbWVudGF0aW9uPSJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bGUuUGF0dGVybk5vdE1hdGNoZWRJbkZpbGVSdWxlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlPiR7ZXh0ZXJuYWwuY29udGFpbmVyLmxvZ0ZpbGV9PC9maWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+LipqYXZhXC5sYW5nXC5PdXRPZk1lbW9yeUVycm9yLio8L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3J1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYWlsPnRydWU8L2ZhaWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmdmNDwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8cGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3QuamV0dHk+bm9uZTwvcGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3QuamV0dHk+CisgICAgICAgICAgICAgICAgPHBoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT5ub25lPC9waGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3QuamV0dHk+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+d2xzPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxwaGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT5ub25lPC9waGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT4KKyAgICAgICAgICAgICAgICA8cGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5Pm5vbmU8L3BoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50b21jYXQ8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPHBoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5Pm5vbmU8L3BoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5PgorICAgICAgICAgICAgICAgIDxwaGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3QuamV0dHk+bm9uZTwvcGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5PgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrLWNsaWVudC9wb20ueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrLWNsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTRiMDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWstY2xpZW50L3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zaHV0ZG93bi1ob29rLWxlYWstY2xpZW50PC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1tZW1sZWFrLXRlc3RjYXNlLXNodXRkb3duLWhvb2stbGVhay1jbGllbnQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoaXMgd2ViIHByb2plY3QgcmVwcm9kdWNlcyB0aWNrZXRzOiBKRVJTRVktMjY4OCBKRVJTRVktMjc4NgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1lbWxlYWsuanZtLm1heGhlYXA+MTI4bTwvbWVtbGVhay5qdm0ubWF4aGVhcD4KKyAgICAgICAgPG1lbWxlYWsudGVzdC50aW1lb3V0PjMwMDAwPC9tZW1sZWFrLnRlc3QudGltZW91dD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWVtbGVhay10ZXN0LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLXJlcHJvZHVjZXI8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPG1lbWxlYWsuamVyc2V5LnZlcnNpb24+Mi4xNzwvbWVtbGVhay5qZXJzZXkudmVyc2lvbj4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9zaHV0ZG93bmxlYWsvY2xpZW50L0VuZGxlc3NTaHV0ZG93bkhvb2tMZWFrVGVzdC5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3dubGVhay9jbGllbnQvRW5kbGVzc1NodXRkb3duSG9va0xlYWtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwYjc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9zaHV0ZG93bmxlYWsvY2xpZW50L0VuZGxlc3NTaHV0ZG93bkhvb2tMZWFrVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3Muc2h1dGRvd25sZWFrLmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb24uQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tZW1sZWFrLmNvbW1vbi5BYnN0cmFjdE1lbW9yeUxlYWtTaW1wbGVUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWVtbGVhay5jb21tb24uTWVtb3J5TGVha1N1Y2NlZWRpbmdUaW1lb3V0OworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRpbWVvdXQ7CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI3ODYuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRW5kbGVzc1NodXRkb3duSG9va0xlYWtUZXN0IGV4dGVuZHMgQWJzdHJhY3RNZW1vcnlMZWFrU2ltcGxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihFbmRsZXNzU2h1dGRvd25Ib29rTGVha1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIFRpbWVvdXQgZ2xvYmFsVGltZW91dCA9IG5ldyBNZW1vcnlMZWFrU3VjY2VlZGluZ1RpbWVvdXQoKTsKKworICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vZXhhbXBsZS5jb20iKTsKKworICAgIHB1YmxpYyBFbmRsZXNzU2h1dGRvd25Ib29rTGVha1Rlc3QoKSB7CisgICAgICAgIExPR0dFUi5maW5lKCJQcmVwYXJpbmcuLi4iKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKyAgICAgICAgICAgIHNodXRkb3duSG9va0xlYWtJdGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNodXRkb3duSG9va0RvZXNOb3RMZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBzaHV0ZG93bkhvb2tMZWFrSXRlcmF0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2h1dGRvd25Ib29rTGVha0l0ZXJhdGlvbigpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLiIpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0MiA9IHRhcmdldC5wcm9wZXJ0eSgiV2FzaGluZ3RvbiIsICJJcnZpbmciKTsKKyAgICAgICAgQnVpbGRlciByZXEgPSB0YXJnZXQyLnJlcXVlc3QoKS5wcm9wZXJ0eSgiaG93IiwgIm5vdyIpOworICAgICAgICByZXEuYnVpbGRHZXQoKS5wcm9wZXJ0eSgiSXJ2aW5nIiwgIldhc2hpbmd0b24iKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9wb20ueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzODZiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9wb20ueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2h1dGRvd24taG9vay1sZWFrPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW1lbWxlYWstdGVzdGNhc2Utc2h1dGRvd24taG9vay1sZWFrPC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxtZW1sZWFrLmp2bS5tYXhoZWFwPjEyOG08L21lbWxlYWsuanZtLm1heGhlYXA+CisgICAgICAgIDxtZW1sZWFrLnRvbWNhdC5tYXhoZWFwPjEyOG08L21lbWxlYWsudG9tY2F0Lm1heGhlYXA+CisgICAgICAgIDxtZW1sZWFrLnRlc3QudGltZW91dD4xMjAwMDA8L21lbWxlYWsudGVzdC50aW1lb3V0PgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1lbWxlYWstdGVzdC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay1yZXByb2R1Y2VyPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLmplcnNleS52ZXJzaW9uPjIuMTU8L21lbWxlYWsuamVyc2V5LnZlcnNpb24+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9zaHV0ZG93bmhvb2svQ2xpZW50U2h1dGRvd25MZWFrUmVzb3VyY2UuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3duaG9vay9DbGllbnRTaHV0ZG93bkxlYWtSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmE4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9zaHV0ZG93bmhvb2svQ2xpZW50U2h1dGRvd25MZWFrUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnNodXRkb3duaG9vazsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBUaGlzIHJlc291cmNlIHJlcHJvZHVjZXMgSkVSU0VZLTI3ODYgd2hlbiB7QGxpbmsgI2ludm9rZUNsaWVudCgpfSBjYWxsZWQgcmVwZXRpdGl2ZWx5LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImNsaWVudCIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQ2xpZW50U2h1dGRvd25MZWFrUmVzb3VyY2UgeworCisgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9leGFtcGxlLmNvbSIpOworCisgICAgQFBPU1QKKyAgICBAUGF0aCgiaW52b2tlIikKKyAgICBwdWJsaWMgU3RyaW5nIGludm9rZUNsaWVudCgpIHsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0MiA9IHRhcmdldC5wcm9wZXJ0eSgiV2FzaGluZ3RvbiIsICJJcnZpbmciKTsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIHJlcSA9IHRhcmdldDIucmVxdWVzdCgpLnByb3BlcnR5KCJob3ciLCAibm93Iik7CisgICAgICAgIHJlcS5idWlsZEdldCgpLnByb3BlcnR5KCJJcnZpbmciLCAiV2FzaGluZ3RvbiIpOworCisgICAgICAgIHJldHVybiB0YXJnZXQudG9TdHJpbmcoKTsKKworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaGVsbG93b3JsZCIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGhlbGxvV29ybGQoKSB7CisgICAgICAgIHJldHVybiAiSEVMTE8gV09STEQhIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3duaG9vay9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3duaG9vay9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGRkYjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvc2h1dGRvd25ob29rL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3Muc2h1dGRvd25ob29rOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKENsaWVudFNodXRkb3duTGVha1Jlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWsvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNmE4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWsvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCIKKyAgICAgICAgbWV0YWRhdGEtY29tcGxldGU9InRydWUiID4KKworICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXk8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnNodXRkb3duaG9vay5UZXN0QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisKKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXk8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWsvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9zaHV0ZG93bmhvb2svU2h1dGRvd25MZWFrUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3duaG9vay9TaHV0ZG93bkxlYWtSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTU1NGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWsvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9zaHV0ZG93bmhvb2svU2h1dGRvd25MZWFrUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnNodXRkb3duaG9vazsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWVtbGVhay5jb21tb24uQWJzdHJhY3RNZW1vcnlMZWFrV2ViQXBwVGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1lbWxlYWsuY29tbW9uLk1lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUaGlzIGlzIGFuIGludGVncmF0aW9uIHRlc3QgdGhhdCByZXByb2R1Y2VzIEpFUlNFWS0yNzg2IGJ5IGNhbGxpbmcgUkVTVGZ1bCByZXNvdXJjZSB7QGxpbmsgQ2xpZW50U2h1dGRvd25MZWFrUmVzb3VyY2V9CisgKiByZXBldGl0aXZlbHkuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU2h1dGRvd25MZWFrUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdE1lbW9yeUxlYWtXZWJBcHBUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGltZW91dCBnbG9iYWxUaW1lb3V0ID0gbmV3IE1lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dCgyMF8wMDApOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhlTGVha1Jlc291cmNlT25jZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNsaWVudC9pbnZva2UiKS5yZXF1ZXN0KCkucG9zdChudWxsKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaGVMZWFrRW5kbGVzcygpIHsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLiIpOworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNsaWVudC9pbnZva2UiKS5yZXF1ZXN0KCkucG9zdChudWxsKTsKKworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1cygpICE9IDIwMCkgeworICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBzZXJ2ZXIgd2FzIHVuYWJsZSB0byBmdWxmaWxsIHRoZSByZXF1ZXN0ISBUaGlzIG1heSBpbmRpY2F0ZSB0aGF0IE91dE9mTWVtb3J5IGV4Y2VwdGlvbiBvY2N1cnJlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3BvbS54bWwgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWIxYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3BvbS54bWwKQEAgLTAsMCArMSw0MTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5vc2dpPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3RzLW9zZ2ktZnVuY3Rpb25hbDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1vc2dpLWZ1bmN0aW9uYWw8L25hbWU+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBGdW5jdGlvbmFsIEplcnNleSBPU0dpIHRlc3RzCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dGVzdC1jb21waWxlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3RDb21waWxlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy10ZXN0LXJlc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdFJlc291cmNlczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrQ291bnQ+MTwvZm9ya0NvdW50PgorICAgICAgICAgICAgICAgICAgICA8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4KKyAgICAgICAgICAgICAgICAgICAgPGVuYWJsZUFzc2VydGlvbnM+ZmFsc2U8L2VuYWJsZUFzc2VydGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnRlc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3Q8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3Q8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwhLS0gdXNlIHBheCBleGFtIG1hdmVuIHBsdWdpbiAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBheGV4YW0tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWNvbmZpZzwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Z2VuZXJhdGUtZGVwZW5kcy1maWxlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguZXhhbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC1leGFtPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW0tanVuaXQ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1jb250YWluZXItZm9ya2VkPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW0tanVuaXQtZXh0ZW5kZXItaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmZlbGl4LmZyYW1ld29yazwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguZXhhbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC1leGFtLWxpbmstbXZuPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC51cmw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtdXJsLWFldGhlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNi4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmdyaXp6bHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncml6emx5LWh0dHAtc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBkZXBlbmRlY2llcyBmb3IgT1NHaSB0ZXN0IHdpdGggQXBhY2hlIGNvbm5lY3RvciAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtbG9nZ2luZy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjguMzwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY29yZS1vc2dpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPHZlcnNpb24+NC40LjM8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNsaWVudC1vc2dpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtodHRwY2xpZW50LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb24xPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW1veHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLXByb2Nlc3Npbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1zc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktcHJveHktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmJ1bmRsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhycy1yaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpLTIuNTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oaWJlcm5hdGUtdmFsaWRhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmpib3NzLmxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYm9zcy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNsYXNzbWF0ZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWwtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4Lmpzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNvbnAtamF4cnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlLXJlcGFja2FnZWQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamF2YXNzaXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXNzaXN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5tb2R1bGU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLW1vZHVsZS1qYXhiLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmpheHJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1qYXhycy1iYXNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmpheHJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1qYXhycy1qc29uLXByb3ZpZGVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZS1hc2w8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tbWFwcGVyLWFzbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1qYXhyczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi14YzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gbG9nZ2luZyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS42LjQ8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+dGVzdHNTa2lwSmRrNjwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8amRrPjEuNjwvamRrPgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9QYWNrYWdlU2Nhbm5pbmdUZXN0LmphdmE8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2UgaXQncyBub3Qgd29ya2luZyB3aXRoIDxmb3JrTW9kZT5hbHdheXM8L2Zvcms+ICg8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4gcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2ppcmEuc29uYXJzb3VyY2UuY29tL2Jyb3dzZS9TT05BUkpBVkEtNzI4IChodHRwczovL2dpdGh1Yi5jb20vU29uYXJTb3VyY2Uvc29uYXItamF2YS9wdWxsLzMyNCkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzIGNvbWJpbmUuc2VsZj0ib3ZlcnJpZGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0Fic3RyYWN0SnNvbk9zZ2lJbnRlZ3JhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9BYnN0cmFjdEpzb25Pc2dpSW50ZWdyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzYTVkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9BYnN0cmFjdEpzb25Pc2dpSW50ZWdyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBBYnN0cmFjdCBKU09OIE9TR2kgaW50ZWdyYXRpb24gdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpzb25Pc2dpSW50ZWdyYXRpb25UZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIi9qZXJzZXkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikucG9ydChIZWxwZXIuZ2V0UG9ydCgpKS5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmVhdHVyZSBnZXRKc29uUHJvdmlkZXJGZWF0dXJlKCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZlYXR1cmUganNvblByb3ZpZGVyRmVhdHVyZSA9IGdldEpzb25Qcm92aWRlckZlYXR1cmUoKTsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEpzb25SZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgaWYgKGpzb25Qcm92aWRlckZlYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgY2xpZW50LnJlZ2lzdGVyKGpzb25Qcm92aWRlckZlYXR1cmUpOworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoanNvblByb3ZpZGVyRmVhdHVyZSk7CisgICAgICAgIH0KKworICAgICAgICBIdHRwU2VydmVyIHNlcnZlciA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBjbGllbnQudGFyZ2V0KGJhc2VVcmkpLnBhdGgoIi9qc29uIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUkVTVUxUID0gIiArIHJlc3VsdCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgY29udGFpbnNTdHJpbmcoIkppbSIpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0FwYWNoZU9zZ2lJbnRlZ3JhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9BcGFjaGVPc2dpSW50ZWdyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlMzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9BcGFjaGVPc2dpSW50ZWdyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsLkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK3B1YmxpYyBjbGFzcyBBcGFjaGVPc2dpSW50ZWdyYXRpb25UZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikucG9ydChIZWxwZXIuZ2V0UG9ydCgpKS5wYXRoKCIvamVyc2V5IikuYnVpbGQoKTsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBmaW5hbCBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLm9wczRqLnBheC5sb2dnaW5nIikuYXJ0aWZhY3RJZCgicGF4LWxvZ2dpbmctYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIikuYXJ0aWZhY3RJZCgiaHR0cGNvcmUtb3NnaSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cyIpLmFydGlmYWN0SWQoImh0dHBjbGllbnQtb3NnaSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9ycyIpLmFydGlmYWN0SWQoImplcnNleS1hcGFjaGUtY29ubmVjdG9yIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52ZXJzaW9uQXNJblByb2plY3QoKQorCisgICAgICAgICkpOworICAgICAgICByZXR1cm4gSGVscGVyLmFzQXJyYXkob3B0aW9ucyk7CisgICAgfQorCisgICAgQFBhdGgoIi9hcGFjaGVPc2dpVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcGFjaGVPc2dpVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEFwYWNoZU9zZ2lUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBjbGllbnRDb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBmaW5hbCBDbGllbnQgYyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjLnRhcmdldChiYXNlVXJpKS5wYXRoKCIvYXBhY2hlT3NnaVRlc3QiKS5yZXF1ZXN0KCkuYnVpbGRHZXQoKS5pbnZva2UoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzdWx0KTsKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0Jhc2ljT3NnaUludGVncmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0Jhc2ljT3NnaUludGVncmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDM0N2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvQmFzaWNPc2dpSW50ZWdyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK3B1YmxpYyBjbGFzcyBCYXNpY09zZ2lJbnRlZ3JhdGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiL2plcnNleSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgYmFzZVVyaSA9IFVyaUJ1aWxkZXIKKyAgICAgICAgICAgIC5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikKKyAgICAgICAgICAgIC5wb3J0KEhlbHBlci5nZXRQb3J0KCkpCisgICAgICAgICAgICAucGF0aChDT05URVhUKS5idWlsZCgpOworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3N1cGVyLXNpbXBsZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdXBlclNpbXBsZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFN1cGVyU2ltcGxlUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBDbGllbnQgYyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gYy50YXJnZXQoYmFzZVVyaSkucGF0aCgiL3N1cGVyLXNpbXBsZSIpLnJlcXVlc3QoKS5idWlsZEdldCgpLmludm9rZSgpOworCisgICAgICAgIFN0cmluZyByZXN1bHQgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUkVTVUxUID0gIiArIHJlc3VsdCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIHJlc3VsdCk7CisKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0JlYW5WYWxpZGF0aW9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9CZWFuVmFsaWRhdGlvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3ZDhkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9CZWFuVmFsaWRhdGlvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiYmVhbi12YWxpZGF0aW9uIikKK3B1YmxpYyBjbGFzcyBCZWFuVmFsaWRhdGlvblJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBwb3N0KEBOb3ROdWxsIEBGb3JtUGFyYW0oImZvcm1QYXJhbSIpIGZpbmFsIFN0cmluZyBmb3JtUGFyYW0pIHsKKyAgICAgICAgcmV0dXJuIGZvcm1QYXJhbTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvQmVhblZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvQmVhblZhbGlkYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4MDc2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9CZWFuVmFsaWRhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5WYWxpZGF0aW9uRmVhdHVyZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CisKKy8qKgorICogQmFzaWMgdGVzdCBvZiBCZWFuIFZhbGlkYXRpb24uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikKKyAgICAgICAgICAgIC5wb3J0KEhlbHBlci5nZXRQb3J0KCkpCisgICAgICAgICAgICAucGF0aChDT05URVhUKS5idWlsZCgpOworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyBmb3IgZGVidWcgcHVycG9zZXMKKyAgICAgICAgICAgICAgICAvLyBQYXhSdW5uZXJPcHRpb25zLnZtT3B0aW9uKCItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA1IiksCisKKyAgICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQiKS5hcnRpZmFjdElkKCJqZXJzZXktYmVhbi12YWxpZGF0aW9uIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuaGliZXJuYXRlIikuYXJ0aWZhY3RJZCgiaGliZXJuYXRlLXZhbGlkYXRvciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmpib3NzLmxvZ2dpbmciKS5hcnRpZmFjdElkKCJqYm9zcy1sb2dnaW5nIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJjb20uZmFzdGVyeG1sIikuYXJ0aWZhY3RJZCgiY2xhc3NtYXRlIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJqYXZheC5lbCIpLmFydGlmYWN0SWQoImphdmF4LmVsLWFwaSIpLnZlcnNpb25Bc0luUHJvamVjdCgpCisgICAgICAgICkpOworCisgICAgICAgIG9wdGlvbnMgPSBIZWxwZXIuYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkob3B0aW9ucyk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuVmFsaWRhdGlvblJlc291cmNlRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg0MDAsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuVmFsaWRhdGlvblJlc291cmNlQXV0b0Rpc2NvdmVyeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg0MDAsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhblZhbGlkYXRpb25SZXNvdXJjZU1hbnVhbFJlZ2lzdHJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg0MDAsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5WYWxpZGF0aW9uUmVzb3VyY2VOb1ZhbGlkYXRpb25GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEV2ZW4gdGhvdWdoIHByb3BlcnRpZXMgYXJlIGRpc2FibGVkIEJWIGlzIHJlZ2lzdGVyZWQuCisgICAgICAgIF90ZXN0KDQwMCwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIF90ZXN0KGZpbmFsIGludCBleHBlY3RlZFJlc3BvbnNlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlZ2lzdGVyRmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXApIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoQmVhblZhbGlkYXRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGlmIChyZWdpc3RlckZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFZhbGlkYXRpb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFLCBCb29sZWFuLlRSVUUpOworCisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwQ29udGFpbmVyUHJvdmlkZXIuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1WYWx1ZSA9ICJmb3JtVmFsdWUiOworICAgICAgICBmb3JtLmFzTWFwKCkuYWRkKCJmb3JtUGFyYW0iLCBmb3JtVmFsdWUpOworCisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gY2xpZW50LnRhcmdldChiYXNlVXJpKQorICAgICAgICAgICAgICAgIC5wYXRoKCIvYmVhbi12YWxpZGF0aW9uIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShmb3JtLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmb3JtVmFsdWUsIGVudGl0eSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KGJhc2VVcmkpCisgICAgICAgICAgICAgICAgLnBhdGgoIi9iZWFuLXZhbGlkYXRpb24iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBGb3JtKCksIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3BvbnNlQ29kZSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pheFJzUmlCdW5kbGVUZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSmF4UnNSaUJ1bmRsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGM5OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pheFJzUmlCdW5kbGVUZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsLkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uT3B0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5qdW5pdC5QYXhFeGFtOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCisvKioKKyAqIEJhc2ljIHRlc3Qgb2YgSkFYLVJTIFJJIGJ1bmRsZS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK3B1YmxpYyBjbGFzcyBKYXhSc1JpQnVuZGxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlcgorICAgICAgICAgICAgLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoZmFsc2UpOworCisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5leHBhbmRlZExpc3QoCisgICAgICAgICAgICAgICAgLy8gdm1PcHRpb24oIi1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPTUwMDUiKSwKKworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuYnVuZGxlcyIpLmFydGlmYWN0SWQoImpheHJzLXJpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5tb3J0YmF5LmpldHR5IikuYXJ0aWZhY3RJZCgic2VydmxldC1hcGktMi41IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmdyaXp6bHkiKS5hcnRpZmFjdElkKCJncml6emx5LWh0dHAtc2VydmxldCIpLnZlcnNpb25Bc0luUHJvamVjdCgpCisgICAgICAgICkpOworCisgICAgICAgIG9wdGlvbnMgPSBIZWxwZXIuYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkob3B0aW9ucyk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgcmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KGJhc2VVcmkpLnBhdGgoIi9zaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSRVNVTFQgPSAiICsgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UpOworCisgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25KYWNrc29uMVRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uSmFja3NvbjFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU1MmZjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uSmFja3NvbjFUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3NvbjEuSmFja3NvbjFGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsLkhlbHBlcjsKKworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEpzb25KYWNrc29uMVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25Pc2dpSW50ZWdyYXRpb25UZXN0IHsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBmaW5hbCBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucygpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyB2bU9wdGlvbigiLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNSIpLAorCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYSIpLmFydGlmYWN0SWQoImplcnNleS1tZWRpYS1qc29uLWphY2tzb24xIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAvLyBqZXJzZXktanNvbiBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5jb2RlaGF1cy5qYWNrc29uIikuYXJ0aWZhY3RJZCgiamFja3Nvbi1jb3JlLWFzbCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmNvZGVoYXVzLmphY2tzb24iKS5hcnRpZmFjdElkKCJqYWNrc29uLW1hcHBlci1hc2wiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5jb2RlaGF1cy5qYWNrc29uIikuYXJ0aWZhY3RJZCgiamFja3Nvbi1qYXhycyIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmNvZGVoYXVzLmphY2tzb24iKS5hcnRpZmFjdElkKCJqYWNrc29uLXhjIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGZWF0dXJlIGdldEpzb25Qcm92aWRlckZlYXR1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmFja3NvbjFGZWF0dXJlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25KYWNrc29uVGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25KYWNrc29uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NGQwNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvbkphY2tzb25UZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CisKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uT3B0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uSmFja3NvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25Pc2dpSW50ZWdyYXRpb25UZXN0IHsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBmaW5hbCBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucygpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyB2bU9wdGlvbigiLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNSIpLAorCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYSIpLmFydGlmYWN0SWQoImplcnNleS1tZWRpYS1qc29uLWphY2tzb24iKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dCIpLmFydGlmYWN0SWQoImplcnNleS1lbnRpdHktZmlsdGVyaW5nIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAvLyBqZXJzZXktanNvbiBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlIikuYXJ0aWZhY3RJZCgiamFja3Nvbi1jb3JlIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZSIpLmFydGlmYWN0SWQoImphY2tzb24tZGF0YWJpbmQiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlIikuYXJ0aWZhY3RJZCgiamFja3Nvbi1hbm5vdGF0aW9ucyIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiY29tLmZhc3RlcnhtbC5qYWNrc29uLmpheHJzIikuYXJ0aWZhY3RJZCgiamFja3Nvbi1qYXhycy1iYXNlIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJjb20uZmFzdGVyeG1sLmphY2tzb24uamF4cnMiKS5hcnRpZmFjdElkKCJqYWNrc29uLWpheHJzLWpzb24tcHJvdmlkZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiY29tLmZhc3RlcnhtbC5qYWNrc29uLm1vZHVsZSIpLmFydGlmYWN0SWQoImphY2tzb24tbW9kdWxlLWpheGItYW5ub3RhdGlvbnMiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpCisgICAgICAgICkpOworCisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmVhdHVyZSBnZXRKc29uUHJvdmlkZXJGZWF0dXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEphY2tzb25GZWF0dXJlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25KZXR0aXNvblRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uSmV0dGlzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhNWNjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uSmV0dGlzb25UZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsLkhlbHBlcjsKKworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEpzb25KZXR0aXNvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25Pc2dpSW50ZWdyYXRpb25UZXN0IHsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8T3B0aW9uPigpOworCisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucygpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyBqZXJzZXktanNvbiBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLWpzb24tamV0dGlzb24iKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5jb2RlaGF1cy5qZXR0aXNvbiIpLmFydGlmYWN0SWQoImpldHRpc29uIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGZWF0dXJlIGdldEpzb25Qcm92aWRlckZlYXR1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmV0dGlzb25GZWF0dXJlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25Nb3h5VGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25Nb3h5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YmMxZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvbk1veHlUZXN0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkJlYW5WYWxpZGF0aW9uTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLk1hcnNoYWxsZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5ib290RGVsZWdhdGlvblBhY2thZ2U7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEpzb25Nb3h5VGVzdCBleHRlbmRzIEFic3RyYWN0SnNvbk9zZ2lJbnRlZ3JhdGlvblRlc3QgeworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIGZpbmFsIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCkpOworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIHZtT3B0aW9uKCItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA1IiksCisKKyAgICAgICAgICAgICAgICBib290RGVsZWdhdGlvblBhY2thZ2UoImphdmF4LnhtbC5iaW5kIiksCisgICAgICAgICAgICAgICAgYm9vdERlbGVnYXRpb25QYWNrYWdlKCJqYXZheC54bWwuYmluZC4qIiksCisgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGlvbgorICAgICAgICAgICAgICAgIGJvb3REZWxlZ2F0aW9uUGFja2FnZSgiamF2YXgueG1sLnBhcnNlcnMiKSwKKyAgICAgICAgICAgICAgICBib290RGVsZWdhdGlvblBhY2thZ2UoImphdmF4LnhtbC5wYXJzZXJzLioiKSwKKworICAgICAgICAgICAgICAgIC8vIG1veHkgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYSIpLmFydGlmYWN0SWQoImplcnNleS1tZWRpYS1tb3h5IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQiKS5hcnRpZmFjdElkKCJqZXJzZXktZW50aXR5LWZpbHRlcmluZyIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UiKS5hcnRpZmFjdElkKCJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tb3h5IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZSIpLmFydGlmYWN0SWQoIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmUiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlIikuYXJ0aWZhY3RJZCgib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoIikuYXJ0aWZhY3RJZCgiamF2YXguanNvbiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGlvbgorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmhpYmVybmF0ZSIpLmFydGlmYWN0SWQoImhpYmVybmF0ZS12YWxpZGF0b3IiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5qYm9zcy5sb2dnaW5nIikuYXJ0aWZhY3RJZCgiamJvc3MtbG9nZ2luZyIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiY29tLmZhc3RlcnhtbCIpLmFydGlmYWN0SWQoImNsYXNzbWF0ZSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiamF2YXguZWwiKS5hcnRpZmFjdElkKCJqYXZheC5lbC1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKQorICAgICAgICApKTsKKworICAgICAgICByZXR1cm4gSGVscGVyLmFzQXJyYXkob3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZlYXR1cmUgZ2V0SnNvblByb3ZpZGVyRmVhdHVyZSgpIHsKKyAgICAgICAgLy8gVHVybiBvZmYgQlYgb3RoZXJ3aXNlIHRoZSB0ZXN0IGlzIG5vdCBzdGFibGUuCisgICAgICAgIHJldHVybiBuZXcgRmVhdHVyZSgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IE1veHlKc29uQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShNYXJzaGFsbGVyUHJvcGVydGllcy5CRUFOX1ZBTElEQVRJT05fTU9ERSwgQmVhblZhbGlkYXRpb25Nb2RlLk5PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZXIoKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvblByb2Nlc3NpbmdUZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvblByb2Nlc3NpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiNGM1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uUHJvY2Vzc2luZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IGphdmF4Lmpzb24uSnNvbjsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25PYmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBCYXNpYyB0ZXN0IG9mIEpzb24gUHJvY2Vzc2luZy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK3B1YmxpYyBjbGFzcyBKc29uUHJvY2Vzc2luZ1Rlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiL2plcnNleSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgYmFzZVVyaSA9IFVyaUJ1aWxkZXIKKyAgICAgICAgICAgIC5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikKKyAgICAgICAgICAgIC5wb3J0KEhlbHBlci5nZXRQb3J0KCkpCisgICAgICAgICAgICAucGF0aChDT05URVhUKS5idWlsZCgpOworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyB2bU9wdGlvbigiLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNSIpLAorCisgICAgICAgICAgICAgICAgLy8gSlNPTiBwcm9jZXNzaW5nLgorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEiKS5hcnRpZmFjdElkKCJqZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2giKS5hcnRpZmFjdElkKCJqYXZheC5qc29uIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoIikuYXJ0aWZhY3RJZCgianNvbnAtamF4cnMiKS52ZXJzaW9uQXNJblByb2plY3QoKQorICAgICAgICApKTsKKworICAgICAgICBvcHRpb25zID0gSGVscGVyLmFkZFBheEV4YW1NYXZlbkxvY2FsUmVwb3NpdG9yeVByb3BlcnR5KG9wdGlvbnMpOworICAgICAgICByZXR1cm4gSGVscGVyLmFzQXJyYXkob3B0aW9ucyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKc29uT2JqZWN0IHBvc3RKc29uT2JqZWN0KGZpbmFsIEpzb25PYmplY3QganNvbk9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIGpzb25PYmplY3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIGZpbmFsIEpzb25PYmplY3QganNvbk9iamVjdCA9IEpzb24uY3JlYXRlT2JqZWN0QnVpbGRlcigpLmFkZCgiZm9vIiwgImJhciIpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGZpbmFsIEpzb25PYmplY3QgZW50aXR5ID0gY2xpZW50CisgICAgICAgICAgICAgICAgLnRhcmdldChiYXNlVXJpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oanNvbk9iamVjdCksIEpzb25PYmplY3QuY2xhc3MpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUkVTVUxUID0gIiArIGVudGl0eSk7CisgICAgICAgIGFzc2VydEVxdWFscyhqc29uT2JqZWN0LCBlbnRpdHkpOworCisgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWMzYmRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LmJhc2ljOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJqc29uIikKK3B1YmxpYyBjbGFzcyBKc29uUmVzb3VyY2UgeworCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lQmVhbiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lID0gIkhhcnJpc29uIjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIHB1YmxpYyBOYW1lQmVhbiBnZXRCZWFuKCkgeworICAgICAgICBOYW1lQmVhbiByZXN1bHQgPSBuZXcgTmFtZUJlYW4oKTsKKyAgICAgICAgcmVzdWx0Lm5hbWUgPSAiSmltIjsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9NdWx0aVBhcnRUZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvTXVsdGlQYXJ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTdjYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvTXVsdGlQYXJ0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuQm9keVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkJvZHlQYXJ0RW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBheEV4YW0uY2xhc3MpCitwdWJsaWMgY2xhc3MgTXVsdGlQYXJ0VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlcgorICAgICAgICAgICAgLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKTsKKworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIGplcnNleS1tdWx0aXBhcnQgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYSIpLmFydGlmYWN0SWQoImplcnNleS1tZWRpYS1tdWx0aXBhcnQiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5qdm5ldC5taW1lcHVsbCIpLmFydGlmYWN0SWQoIm1pbWVwdWxsIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkpKTsKKworICAgICAgICBvcHRpb25zID0gSGVscGVyLmFkZFBheEV4YW1NYXZlbkxvY2FsUmVwb3NpdG9yeVByb3BlcnR5KG9wdGlvbnMpOworICAgICAgICByZXR1cm4gSGVscGVyLmFzQXJyYXkob3B0aW9ucyk7CisgICAgfQorCisgICAgQFBhdGgoIi9tdWx0aXBhcnQtc2ltcGxlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE11bHRpUGFydFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygibXVsdGlwYXJ0L21peGVkIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIG9uZSgpIHsKKyAgICAgICAgICAgIE11bHRpUGFydCBlbnRpdHkgPSBuZXcgTXVsdGlQYXJ0KCk7CisgICAgICAgICAgICBCb2R5UGFydCBwYXJ0ID0gbmV3IEJvZHlQYXJ0KCJUaGlzIGlzIHRoZSBvbmx5IHNlZ21lbnQiLCBuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInBsYWluIikpOworICAgICAgICAgICAgZW50aXR5LmdldEJvZHlQYXJ0cygpLmFkZChwYXJ0KTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhlbnRpdHkpLnR5cGUoIm11bHRpcGFydC9taXhlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpUGFydFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKE11bHRpUGFydFJlc291cmNlLmNsYXNzKS5yZWdpc3RlcihuZXcgTXVsdGlQYXJ0RmVhdHVyZSgpKTsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgQ2xpZW50IGMgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKCkucmVnaXN0ZXIoTXVsdGlQYXJ0RmVhdHVyZS5jbGFzcykpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGMudGFyZ2V0KGJhc2VVcmkpLnBhdGgoIi9tdWx0aXBhcnQtc2ltcGxlIikucmVxdWVzdCgpLmJ1aWxkR2V0KCkuaW52b2tlKCk7CisKKyAgICAgICAgTXVsdGlQYXJ0IHJlc3VsdCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoTXVsdGlQYXJ0LmNsYXNzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSRVNVTFQgPSAiICsgcmVzdWx0KTsKKworICAgICAgICBjaGVja0VudGl0eSgiVGhpcyBpcyB0aGUgb25seSBzZWdtZW50IiwgKEJvZHlQYXJ0RW50aXR5KSByZXN1bHQuZ2V0Qm9keVBhcnRzKCkuZ2V0KDApLmdldEVudGl0eSgpKTsKKworICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFbnRpdHkoU3RyaW5nIGV4cGVjdGVkLCBCb2R5UGFydEVudGl0eSBlbnRpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIENvbnZlcnQgdGhlIHJhdyBieXRlcyBpbnRvIGEgU3RyaW5nCisgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIHNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGNoID0gc3IucmVhZCgpOworICAgICAgICAgICAgaWYgKGNoIDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3cuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUGVyZm9ybSB0aGUgY29tcGFyaXNvbgorICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHN3LnRvU3RyaW5nKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1BhY2thZ2VTY2FubmluZ1Rlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9QYWNrYWdlU2Nhbm5pbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0ODBiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9QYWNrYWdlU2Nhbm5pbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LmJhc2ljOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLnNlcnZsZXQuR3JpenpseVdlYkNvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uT3B0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5qdW5pdC5QYXhFeGFtOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCisvKioKKyAqIE5PVEU6IFRoaXMgdGVzdCBpcyBleGNsdWRlZCBvbiBKREs2IGFzIGl0IHJlcXVpcmVzIFNlcnZsZXQgMy4xIEFQSSB0aGF0IGlzIGJ1aWx0IGFnYWluc3QgSkRLIDcuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIFBhY2thZ2VTY2FubmluZ1Rlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiL2plcnNleSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgYmFzZVVyaSA9IFVyaUJ1aWxkZXIKKyAgICAgICAgICAgIC5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikKKyAgICAgICAgICAgIC5wb3J0KEhlbHBlci5nZXRQb3J0KCkpCisgICAgICAgICAgICAucGF0aChDT05URVhUKS5idWlsZCgpOworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyB2bU9wdGlvbigiLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNSIpLAorCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYSIpLmFydGlmYWN0SWQoImplcnNleS1tZWRpYS1zc2UiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiamF2YXguc2VydmxldCIpLmFydGlmYWN0SWQoImphdmF4LnNlcnZsZXQtYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmdyaXp6bHkiKS5hcnRpZmFjdElkKCJncml6emx5LWh0dHAtc2VydmxldCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyIpLmFydGlmYWN0SWQoImplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMiKS5hcnRpZmFjdElkKCJqZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLXNlcnZsZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gTUJSL01CVyBmb3IgSlNPTi1QIGlzIG9uIHRoZSBjbGFzc3BhdGguCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoIikuYXJ0aWZhY3RJZCgiamF2YXguanNvbiIpLnZlcnNpb25Bc0luUHJvamVjdCgpCisgICAgICAgICkpOworCisgICAgICAgIG9wdGlvbnMgPSBIZWxwZXIuYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkob3B0aW9ucyk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpLnBhY2thZ2VzKFNpbXBsZVJlc291cmNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBfdGVzdFNjYW5uZWRSZXNvdXJjZXMoc2VydmVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVSZXNvdXJjZUluaXRQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdFBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBpbml0UGFyYW1zLnB1dCgKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLlBST1ZJREVSX1BBQ0tBR0VTLAorICAgICAgICAgICAgICAgIFNpbXBsZVJlc291cmNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworCisgICAgICAgIC8vIFRPRE8gLSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZAorICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCByZWxhdGVkIHRvIGlzc3VlIEpFUlNFWS0yMDkzOyBncml6emx5ICgxLjkuNSkgbmVlZHMgdG8gaGF2ZSB0aGUgY29ycmVjdCBjb250ZXh0CisgICAgICAgIC8vIGNsYXNzbG9hZGVyIHNldAorICAgICAgICBDbGFzc0xvYWRlciBteUNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICBDbGFzc0xvYWRlciBvcmlnaW5hbENvbnRleHRDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgIEh0dHBTZXJ2ZXIgc2VydmVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG15Q2xhc3NMb2FkZXIpOworICAgICAgICAgICAgc2VydmVyID0gR3JpenpseVdlYkNvbnRhaW5lckZhY3RvcnkuY3JlYXRlKGJhc2VVcmksIFNlcnZsZXRDb250YWluZXIuY2xhc3MsIGluaXRQYXJhbXMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob3JpZ2luYWxDb250ZXh0Q2xhc3NMb2FkZXIpOworICAgICAgICB9CisgICAgICAgIC8vIEVORCBvZiB3b3JrYXJvdW5kIC0gd2hlbiBncml6emx5IHVwZGF0ZWQgdG8gbW9yZSByZWNlbnQgdmVyc2lvbiwgb25seSB0aGUgaW5uZXIgbGluZSBvZiB0cnkgY2xhdXNlIHNob3VsZCByZW1haW46CisKKyAgICAgICAgX3Rlc3RTY2FubmVkUmVzb3VyY2VzKHNlcnZlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0U2Nhbm5lZFJlc291cmNlcyhmaW5hbCBIdHRwU2VydmVyIHNlcnZlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCBjbGllbnQudGFyZ2V0KGJhc2VVcmkpLnBhdGgoIi9zaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAvLyByZXNvdXJjZXMgaW4gc3VicGFja2FnZXMgYXJlbid0IHN1cHBvcnRlZCB5ZXQgYmVjYXVzZSB0aGUgb3NnaSByZWN1cnNpdmUgc2Nhbm5pbmcgaXMgc2V0IHRvIGZhbHNlCisvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWItT0siLCBjbGllbnQudGFyZ2V0KGJhc2VVcmkpLnBhdGgoIi9zdWItcGFja2FnZWQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1Jlc291cmNlQnVuZGxlVGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1Jlc291cmNlQnVuZGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNmM2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvUmVzb3VyY2VCdW5kbGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LmJhc2ljOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ01hbmFnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuU2ltcGxlRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLlN0cmVhbUhhbmRsZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5FcnJvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CisKKy8qKgorICogRW5zdXJlcyBzZXJ2ZXIgbG9jYWxpemF0aW9uIHJlc291cmNlIGJ1bmRsZSBnZXRzIGxvYWRlZCBmaW5lIGluIE9TR2kgcnVudGltZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlcgorICAgICAgICAgICAgLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKTsKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyBQYXhSdW5uZXJPcHRpb25zLnZtT3B0aW9uKCItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA1IikKKyAgICAgICAgKSk7CisKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBQYXRoKCIvbm9uLWRlcGxveWFibGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFkUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIm5vIHdheSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhCYWRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGxvZ091dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgSGFuZGxlciBsb2dIYW5kbGVyID0gbmV3IFN0cmVhbUhhbmRsZXIobG9nT3V0cHV0LCBuZXcgU2ltcGxlRm9ybWF0dGVyKCkpOworCisgICAgICAgIEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnLCBmYWxzZSk7CisKKyAgICAgICAgLy8gVE9ETzogdGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheSB0byBnZXQgdGhlIGxvZyBvdXRwdXQhCisgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uPFN0cmluZz4gbG9nZ2VyTmFtZXMgPSBMb2dNYW5hZ2VyLmdldExvZ01hbmFnZXIoKS5nZXRMb2dnZXJOYW1lcygpOworICAgICAgICB3aGlsZSAobG9nZ2VyTmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbG9nZ2VyTmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIm9yZy5nbGFzc2Zpc2giKSkgeworICAgICAgICAgICAgICAgIExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldExvZ2dlcihFcnJvcnMuY2xhc3MuZ2V0TmFtZSgpKS5hZGRIYW5kbGVyKGxvZ0hhbmRsZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnLCBmYWxzZSk7CisgICAgICAgIGxvZ091dHB1dC5mbHVzaCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9nT3V0cHV0QXNTdHJpbmcgPSBsb2dPdXRwdXQudG9TdHJpbmcoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobG9nT3V0cHV0QXNTdHJpbmcuY29udGFpbnMoIltmYWlsZWQgdG8gbG9jYWxpemVdIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsb2dPdXRwdXRBc1N0cmluZy5jb250YWlucygiQmFkUmVzb3VyY2UiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1NpbXBsZVJlc291cmNlLmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvU2ltcGxlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjY3MmNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1NpbXBsZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL3NpbXBsZSIpCitwdWJsaWMgY2xhc3MgU2ltcGxlUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoKSB7CisgICAgICAgIHJldHVybiAiT0siOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Tc2VUZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvU3NlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NThmMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvU3NlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRPdXRwdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50U291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5JbmJvdW5kRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLk91dGJvdW5kRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBCYXNpYyB0ZXN0IGZvciBTU0UgbW9kdWxlIE9TR2lmaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIFNzZVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiL2plcnNleSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgYmFzZVVyaSA9IFVyaUJ1aWxkZXIKKyAgICAgICAgICAgIC5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikKKyAgICAgICAgICAgIC5wb3J0KEhlbHBlci5nZXRQb3J0KCkpCisgICAgICAgICAgICAucGF0aChDT05URVhUKS5idWlsZCgpOworCisgICAgQEluamVjdAorICAgIHByb3RlY3RlZCBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKTsKKworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIEplcnNleSBTU0UgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYSIpLmFydGlmYWN0SWQoImplcnNleS1tZWRpYS1zc2UiKS52ZXJzaW9uQXNJblByb2plY3QoKSkpOworCisgICAgICAgIG9wdGlvbnMgPSBIZWxwZXIuYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkob3B0aW9ucyk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3NzZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTc2VSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoU3NlRmVhdHVyZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgICAgIHB1YmxpYyBFdmVudE91dHB1dCBnZXRJdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBFdmVudE91dHB1dCByZXN1bHQgPSBuZXcgRXZlbnRPdXRwdXQoKTsKKyAgICAgICAgICAgIHJlc3VsdC53cml0ZShuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkubmFtZSgiZXZlbnQxIikuZGF0YShTdHJpbmcuY2xhc3MsICJwaW5nIikuYnVpbGQoKSk7CisgICAgICAgICAgICByZXN1bHQud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImV2ZW50MiIpLmRhdGEoU3RyaW5nLmNsYXNzLCAicG9uZyIpLmJ1aWxkKCkpOworICAgICAgICAgICAgcmVzdWx0LmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFNzZVJlc291cmNlLmNsYXNzLCBTc2VGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgQ2xpZW50IGMgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBjLnJlZ2lzdGVyKFNzZUZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBkYXRhID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKworICAgICAgICBmaW5hbCBFdmVudFNvdXJjZSBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZShjLnRhcmdldChiYXNlVXJpKS5wYXRoKCIvc3NlIikpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEluYm91bmRFdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRhdGEuYWRkKGV2ZW50LnJlYWREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoMiwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBkYXRhLnNpemUoKSk7CisKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1dlYlJlc291cmNlRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9XZWJSZXNvdXJjZUZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5OTM5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9XZWJSZXNvdXJjZUZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LmJhc2ljOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5wcm94eS5XZWJSZXNvdXJjZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBheEV4YW0uY2xhc3MpCitwdWJsaWMgY2xhc3MgV2ViUmVzb3VyY2VGYWN0b3J5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlcgorICAgICAgICAgICAgLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKTsKKworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIGplcnNleS1tdWx0aXBhcnQgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQiKS5hcnRpZmFjdElkKCJqZXJzZXktcHJveHktY2xpZW50IikudmVyc2lvbkFzSW5Qcm9qZWN0KCkpKTsKKworICAgICAgICBvcHRpb25zID0gSGVscGVyLmFkZFBheEV4YW1NYXZlbkxvY2FsUmVwb3NpdG9yeVByb3BlcnR5KG9wdGlvbnMpOworICAgICAgICByZXR1cm4gSGVscGVyLmFzQXJyYXkob3B0aW9ucyk7CisgICAgfQorCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUJlYW4geworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgfQorCisgICAgQFBhdGgoIm15cmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE15UmVzb3VyY2VJZmMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBTdHJpbmcgZ2V0SXQoKTsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUx9KQorICAgICAgICBAUHJvZHVjZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUx9KQorICAgICAgICBMaXN0PE15QmVhbj4gcG9zdEl0KExpc3Q8TXlCZWFuPiBlbnRpdHkpOworCisgICAgICAgIEBQYXRoKCJ7aWR9IikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIFN0cmluZyBnZXRJZChAUGF0aFBhcmFtKCJpZCIpIFN0cmluZyBpZCk7CisKKyAgICAgICAgQFBhdGgoInF1ZXJ5IikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIFN0cmluZyBnZXRCeU5hbWUoQFF1ZXJ5UGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSk7CisKKyAgICAgICAgQFBhdGgoInN1YnJlc291cmNlIikKKyAgICAgICAgTXlTdWJSZXNvdXJjZUlmYyBnZXRTdWJSZXNvdXJjZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSBpbXBsZW1lbnRzIE15UmVzb3VyY2VJZmMgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEl0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHb3QgaXQhIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxNeUJlYW4+IHBvc3RJdChMaXN0PE15QmVhbj4gZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoU3RyaW5nIGlkKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNeVN1YlJlc291cmNlSWZjIGdldFN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNeVN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U3ViUmVzb3VyY2UgaW1wbGVtZW50cyBNeVN1YlJlc291cmNlSWZjIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE15QmVhbiBnZXRNeUJlYW4oKSB7CisgICAgICAgICAgICBNeUJlYW4gYmVhbiA9IG5ldyBNeUJlYW4oKTsKKyAgICAgICAgICAgIGJlYW4ubmFtZSA9ICJHb3QgaXQhIjsKKyAgICAgICAgICAgIHJldHVybiBiZWFuOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTXlTdWJSZXNvdXJjZUlmYyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKKyAgICAgICAgcHVibGljIE15QmVhbiBnZXRNeUJlYW4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEh0dHBTZXJ2ZXIgc2VydmVyOworICAgIHByaXZhdGUgTXlSZXNvdXJjZUlmYyByZXNvdXJjZTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgcmVzb3VyY2VDb25maWcpOworICAgICAgICByZXNvdXJjZSA9IFdlYlJlc291cmNlRmFjdG9yeS5uZXdSZXNvdXJjZShNeVJlc291cmNlSWZjLmNsYXNzLCBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnRhcmdldChiYXNlVXJpKSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SXQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiR290IGl0ISIsIHJlc291cmNlLmdldEl0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RJdCgpIHsKKyAgICAgICAgTXlCZWFuIGJlYW4gPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIGJlYW4ubmFtZSA9ICJGb28iOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlLnBvc3RJdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGJlYW4pKS5nZXQoMCkubmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFBhcmFtKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkJhciIsIHJlc291cmNlLmdldElkKCJCYXIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKZXJzZXkyIiwgcmVzb3VyY2UuZ2V0QnlOYW1lKCJKZXJzZXkyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCBpdCEiLCByZXNvdXJjZS5nZXRTdWJSZXNvdXJjZSgpLmdldE15QmVhbigpLm5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9zdWJwYWNrYWdlL1NpbXBsZVJlc291cmNlU3VicGFja2FnZWQuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9zdWJwYWNrYWdlL1NpbXBsZVJlc291cmNlU3VicGFja2FnZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQzNGViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL3N1YnBhY2thZ2UvU2ltcGxlUmVzb3VyY2VTdWJwYWNrYWdlZC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LmJhc2ljLnN1YnBhY2thZ2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvc3ViLXBhY2thZ2VkIikKK3B1YmxpYyBjbGFzcyBTaW1wbGVSZXNvdXJjZVN1YnBhY2thZ2VkIHsKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgcmV0dXJuICJzdWItT0siOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC91dGlsL0hlbHBlci5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L3V0aWwvSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkOTY3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC91dGlsL0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5qdW5pdEJ1bmRsZXM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm9wdGlvbnM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5zeXN0ZW1QYWNrYWdlOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMuc3lzdGVtUHJvcGVydHk7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGJlIHVzZWQgYnkgaW5kaXZpZHVhbCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxwZXIgeworCisgICAgLyoqCisgICAgICogSmVyc2V5IEhUVFAgcG9ydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcG9ydCA9IGdldEVudlZhcmlhYmxlKFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QT1JULCA4MDgwKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSBvZiBnaXZlbiBzeXN0ZW0gcHJvcGVydHksIG9yIGEgZGVmYXVsdCB2YWx1ZQorICAgICAqIGFzIGRlZmluZWQgYnkgdGhlIG90aGVyIG1ldGhvZCBwYXJhbWV0ZXIsIGlmIHRoZSBzeXN0ZW0gcHJvcGVydHkgY2FuCisgICAgICogbm90IGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFyTmFtZSAgICAgIG5hbWUgb2YgdGhlIHN5c3RlbSB2YXJpYWJsZS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGUgc3lzdGVtIHZhcmlhYmxlIGlzIG1pc3Npbmcgb3IgY2FuIG5vdCBiZSBwYXJzZWQgYXMgYW4gaW50ZWdlci4KKyAgICAgKiBAcmV0dXJuIGFuIGludGVnZXIgdmFsdWUgdGFrZW4gZWl0aGVyIGZyb20gdGhlIHN5c3RlbSBwcm9wZXJ0eSBvciB0aGUgZGVmYXVsdCB2YWx1ZSBhcyBkZWZpbmVkIGJ5IHRoZSBkZWZhdWx0VmFsdWUgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldEVudlZhcmlhYmxlKGZpbmFsIFN0cmluZyB2YXJOYW1lLCBpbnQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIGlmIChudWxsID09IHZhck5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZhclZhbHVlID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUHJvcGVydGllc0hlbHBlci5nZXRTeXN0ZW1Qcm9wZXJ0eSh2YXJOYW1lKSk7CisgICAgICAgIGlmIChudWxsICE9IHZhclZhbHVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhclZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gd2lsbCByZXR1cm4gZGVmYXVsdCB2YWx1ZSBiZWxvdworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZhbHVlIG9mIHtAdmFsdWUgVGVzdFByb3BlcnRpZXMjQ09OVEFJTkVSX1BPUlR9IHByb3BlcnR5IHdoaWNoIHNob3VsZCBiZSB1c2VkIGFzIHBvcnQgbnVtYmVyIGZvciB0ZXN0IGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9ydCBudW1iZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIHN5c3RlbSBwcm9wZXJ0eSBmb3IgTWF2ZW4gbG9jYWwgcmVwb3NpdG9yeSBsb2NhdGlvbiB0byB0aGUgUGF4RXhhbSBPU0dpIHJ1bnRpbWUgaWYgYSAibG9jYWxSZXBvc2l0b3J5IiBwcm9wZXJ0eQorICAgICAqIGlzIHByZXNlbnQgaW4gdGhlIG1hcCBvZiB0aGUgc3lzdGVtIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBsaXN0IG9mIG9wdGlvbnMgdG8gYWRkIHRoZSBsb2NhbCByZXBvc2l0b3J5IHByb3BlcnR5IHRvLgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBvcHRpb25zIGVuaGFuY2VkIGJ5IHRoZSBsb2NhbCByZXBvc2l0b3J5IHByb3BlcnR5IGlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IG9yIHRoZSBnaXZlbiBsaXN0IGlmIHRoZQorICAgICAqICAgICAgICAgcHJldmlvdXMgY29uZGl0aW9uIGlzIG5vdCBtZXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9wdGlvbj4gYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkoTGlzdDxPcHRpb24+IG9wdGlvbnMpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsUmVwb3NpdG9yeSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImxvY2FsUmVwb3NpdG9yeSIpKTsKKworICAgICAgICBpZiAobG9jYWxSZXBvc2l0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkQWxsKGV4cGFuZGVkTGlzdChzeXN0ZW1Qcm9wZXJ0eSgib3JnLm9wczRqLnBheC51cmwubXZuLmxvY2FsUmVwb3NpdG9yeSIpLnZhbHVlKGxvY2FsUmVwb3NpdG9yeSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgbGlzdCBvZiBPU0dpIG9wdGlvbnMgdG8gYW4gYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBsaXN0IG9mIE9TR2kgb3B0aW9ucy4KKyAgICAgKiBAcmV0dXJuIGFycmF5IG9mIE9TR2kgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGFzQXJyYXkoZmluYWwgTGlzdDxPcHRpb24+IG9wdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIG9wdGlvbnMudG9BcnJheShuZXcgT3B0aW9uW29wdGlvbnMuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBsaXN0IG9mIGNvbW1vbiBPU0dpIGludGVncmF0aW9uIHRlc3Qgb3B0aW9ucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBjb21tb24gT1NHaSBpbnRlZ3JhdGlvbiB0ZXN0IG9wdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9wdGlvbj4gZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBnZXRDb21tb25Pc2dpT3B0aW9ucyh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGxpc3Qgb2YgY29tbW9uIE9TR2kgaW50ZWdyYXRpb24gdGVzdCBvcHRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGVKZXJzZXlKYXhSc0xpYnMgaW5kaWNhdGVzIHdoZXRoZXIgSmF4UnMgYW5kIEplcnNleSBidW5kbGVzIHNob3VsZCBiZSBhZGRlZCBpbnRvIHRoZSByZXN1bHRpbmcgbGlzdCBvZgorICAgICAqIG9wdGlvbnMuCisgICAgICogQHJldHVybiBsaXN0IG9mIGNvbW1vbiBPU0dpIGludGVncmF0aW9uIHRlc3Qgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T3B0aW9uPiBnZXRDb21tb25Pc2dpT3B0aW9ucyhmaW5hbCBib29sZWFuIGluY2x1ZGVKZXJzZXlKYXhSc0xpYnMpIHsKKyAgICAgICAgZmluYWwgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBuZXcgTGlua2VkTGlzdDxPcHRpb24+KGV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW1Qcm9wZXJ0eSgib3JnLm9wczRqLnBheC5sb2dnaW5nLkRlZmF1bHRTZXJ2aWNlTG9nLmxldmVsIikudmFsdWUoIkZJTkVTVCIpLAorICAgICAgICAgICAgICAgIHN5c3RlbVByb3BlcnR5KCJvcmcub3NnaS5zZXJ2aWNlLmh0dHAucG9ydCIpLnZhbHVlKFN0cmluZy52YWx1ZU9mKHBvcnQpKSwKKyAgICAgICAgICAgICAgICBzeXN0ZW1Qcm9wZXJ0eShUZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVCkudmFsdWUoU3RyaW5nLnZhbHVlT2YocG9ydCkpLAorICAgICAgICAgICAgICAgIHN5c3RlbVByb3BlcnR5KCJvcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzLmV4dHJhIikudmFsdWUoImphdmF4LmFubm90YXRpb24iKSwKKworICAgICAgICAgICAgICAgIC8vIGphdmF4LmFubm90YXRpb24gaGFzIHRvIGdvIGZpcnN0IQorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiamF2YXguYW5ub3RhdGlvbiIpLmFydGlmYWN0SWQoImphdmF4LmFubm90YXRpb24tYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICBqdW5pdEJ1bmRsZXMoKSwKKworICAgICAgICAgICAgICAgIC8vIEhLMgorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIiKS5hcnRpZmFjdElkKCJoazItYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMiIpLmFydGlmYWN0SWQoIm9zZ2ktcmVzb3VyY2UtbG9jYXRvciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIiKS5hcnRpZmFjdElkKCJoazItbG9jYXRvciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIiKS5hcnRpZmFjdElkKCJoazItdXRpbHMiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsIikuYXJ0aWZhY3RJZCgiamF2YXguaW5qZWN0IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbCIpLmFydGlmYWN0SWQoImFvcGFsbGlhbmNlLXJlcGFja2FnZWQiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5qYXZhc3Npc3QiKS5hcnRpZmFjdElkKCJqYXZhc3Npc3QiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIC8vIEdyaXp6bHkKKyAgICAgICAgICAgICAgICBzeXN0ZW1QYWNrYWdlKCJzdW4ubWlzYyIpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5ncml6emx5IikuYXJ0aWZhY3RJZCgiZ3JpenpseS1mcmFtZXdvcmsiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guZ3JpenpseSIpLmFydGlmYWN0SWQoImdyaXp6bHktaHR0cCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5ncml6emx5IikuYXJ0aWZhY3RJZCgiZ3JpenpseS1odHRwLXNlcnZlciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gamF2YXgudmFsaWRhdGlvbgorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiamF2YXgudmFsaWRhdGlvbiIpLmFydGlmYWN0SWQoInZhbGlkYXRpb24tYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAvLyBKZXJzZXkgR3JpenpseQorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyIpLmFydGlmYWN0SWQoImplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cCIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgaWYgKGluY2x1ZGVKZXJzZXlKYXhSc0xpYnMpIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkQWxsKGV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgLy8gSkFYLVJTIEFQSQorICAgICAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImphdmF4LndzLnJzIikuYXJ0aWZhY3RJZCgiamF2YXgud3MucnMtYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAgICAgLy8gSmVyc2V5IGJ1bmRsZXMKKyAgICAgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlIikuYXJ0aWZhY3RJZCgiamVyc2V5LWNvbW1vbiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLWpheGIiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlIikuYXJ0aWZhY3RJZCgiamVyc2V5LXNlcnZlciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUiKS5hcnRpZmFjdElkKCJqZXJzZXktY2xpZW50IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAgICAgLy8gSmVyc2V5IEluamVjdGlvbiBwcm92aWRlcgorICAgICAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdCIpLmFydGlmYWN0SWQoImplcnNleS1oazIiKS52ZXJzaW9uQXNJblByb2plY3QoKQorICAgICAgICAgICAgKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkob3B0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGV4cGFuZGVkIG9wdGlvbnMgbGlzdCBmcm9tIHRoZSBzdXBwbGllZCBvcHRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9ucyB0byBiZSBleHBhbmRlZCBpbnRvIHRoZSBvcHRpb24gbGlzdC4KKyAgICAgKiBAcmV0dXJuIGV4cGFuZGVkIG9wdGlvbnMgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T3B0aW9uPiBleHBhbmRlZExpc3QoT3B0aW9uLi4uIG9wdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qob3B0aW9ucyhvcHRpb25zKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDU2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitsb2c0ai5yb290Q2F0ZWdvcnk9RVJST1IsIHN0ZG91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPVslMzAuMzBjezF9XSAtICVtJW4KK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL3BvbS54bWwgYi90ZXN0cy9vc2dpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1ZmM4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvcG9tLnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMub3NnaTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW9zZ2k8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRlc3QgbW9kdWxlcyBjb250YWluaW5nIHRlc3Qgc2NlbmFyaW8gdHlwZXMgdGhhdCBjb3ZlciBPU0dpLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5mdW5jdGlvbmFsPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9SRUFETUUubWQgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjE2ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9SRUFETUUubWQKQEAgLTAsMCArMSwyOSBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuICIKK1svL106ICMgIiAgIgorWy8vXTogIyAiIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkgIgorWy8vXTogIyAiIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUgIgorWy8vXTogIyAiIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCAiCitbLy9dOiAjICIgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4gIgorWy8vXTogIyAiICAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wICIKKworIyMgSG93IHRvIHJ1bj8KKworVG8gcnVuIGFsbCBiZW5jaG1hcmtzIGV4ZWN1dGU6CisKK2Btdm4gY2xlYW4gaW5zdGFsbCBleGVjOmV4ZWNgIG9yIGBtdm4gY2xlYW4gaW5zdGFsbCAmJiBqYXZhIC1qYXIgdGFyZ2V0L2JlbmNobWFya3MuamFyYAorCitUbyBydW4gc3BlY2lmaWMgYmVuY2htYXJrLCBlLmcuIGBKYWNrc29uQmVuY2htYXJrYDoKKworYG12biBjbGVhbiBpbnN0YWxsICYmIGphdmEgLWNwIHRhcmdldC9iZW5jaG1hcmtzLmphciBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuSmFja3NvbkJlbmNobWFya2AKKworIyMgV2hlcmUgdG8gZmluZCBtb3JlIGluZm8vZXhhbXBsZXM/CisKK0pNSCBwYWdlOiBodHRwOi8vb3Blbmpkay5qYXZhLm5ldC9wcm9qZWN0cy9jb2RlLXRvb2xzL2ptaC8KKworSk1IIGV4YW1wbGVzOiBodHRwOi8vaGcub3Blbmpkay5qYXZhLm5ldC9jb2RlLXRvb2xzL2ptaC9maWxlL3RpcC9qbWgtc2FtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9vcGVuamRrL2ptaC9zYW1wbGVzLwpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzE0YTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3BvbS54bWwKQEAgLTAsMCArMSwxNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2U8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5wZXJmb3JtYW5jZS10ZXN0LWJlbmNobWFya3M8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5wZXJmb3JtYW5jZS10ZXN0LWJlbmNobWFya3M8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+TWljcm8tYmVuY2htYXJrcyB0byBzZWUgcGVyZm9ybWFuY2Ugb2YgSmVyc2V5IGFuZCBpdCdzIGZlYXR1cmVzPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3Blbmpkay5qbWg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qbWgtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcGVuamRrLmptaDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmptaC1nZW5lcmF0b3ItYW5ucHJvY2VzczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0YWJsZT5qYXZhPC9leGVjdXRhYmxlPgorICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50Pi1jbGFzc3BhdGg8L2FyZ3VtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aCAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFyZ3VtZW50Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5BbGxCZW5jaG1hcmtzPC9hcmd1bWVudD4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaGFkZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtaW5pbWl6ZUphcj5mYWxzZTwvbWluaW1pemVKYXI+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNoYWRlLWFyY2hpdmU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNoYWRlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+JHt1YmVyamFyLm5hbWV9PC9maW5hbE5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyYW5zZm9ybWVycz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyYW5zZm9ybWVyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuc2hhZGUucmVzb3VyY2UuTWFuaWZlc3RSZXNvdXJjZVRyYW5zZm9ybWVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLkFsbEJlbmNobWFya3M8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cmFuc2Zvcm1lcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWVycz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVycz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkaW5nIHNpZ25lZCBKQVJzIHdpbGwgZmFpbCB3aXRob3V0IHRoaXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85OTk0ODkvaW52YWxpZC1zaWduYXR1cmUtZmlsZS13aGVuLWF0dGVtcHRpbmctdG8tcnVuLWEtamFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdD4qOio8L2FydGlmYWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GLyouU0Y8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvKi5EU0E8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvKi5SU0E8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Zm9ya01vZGU+YWx3YXlzPC9mb3JrTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgPGVuYWJsZUFzc2VydGlvbnM+ZmFsc2U8L2VuYWJsZUFzc2VydGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2UgaXQncyBub3Qgd29ya2luZyB3aXRoIDxmb3JrTW9kZT5hbHdheXM8L2Zvcms+ICg8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4gcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2ppcmEuc29uYXJzb3VyY2UuY29tL2Jyb3dzZS9TT05BUkpBVkEtNzI4IChodHRwczovL2dpdGh1Yi5jb20vU29uYXJTb3VyY2Uvc29uYXItamF2YS9wdWxsLzMyNCkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzIGNvbWJpbmUuc2VsZj0ib3ZlcnJpZGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8dWJlcmphci5uYW1lPmJlbmNobWFyazwvdWJlcmphci5uYW1lPgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvQWxsQmVuY2htYXJrcy5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9BbGxCZW5jaG1hcmtzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkYzNlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvQWxsQmVuY2htYXJrcy5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLlJ1bm5lcjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuT3B0aW9uc0J1aWxkZXI7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLnJ1bm5lci5vcHRpb25zLlRpbWVWYWx1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFsbEJlbmNobWFya3MgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9wdGlvbnMgb3B0ID0gbmV3IE9wdGlvbnNCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBvdXIgYmVuY2htYXJrcy4KKyAgICAgICAgICAgICAgICAuaW5jbHVkZShDbGllbnRCZW5jaG1hcmsuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQorICAgICAgICAgICAgICAgIC5pbmNsdWRlKEphY2tzb25CZW5jaG1hcmsuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQorICAgICAgICAgICAgICAgIC5pbmNsdWRlKExvY2F0b3JCZW5jaG1hcmsuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQorICAgICAgICAgICAgICAgIC5pbmNsdWRlKEplcnNleVVyaUJ1aWxkZXJCZW5jaG1hcmsuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQorICAgICAgICAgICAgICAgIC8vIE1lYXN1cmUgdGhyb3VnaHB1dCBpbiBzZWNvbmRzIChvcHMvcykuCisgICAgICAgICAgICAgICAgLm1vZGUoTW9kZS5UaHJvdWdocHV0KQorICAgICAgICAgICAgICAgIC50aW1lVW5pdChUaW1lVW5pdC5TRUNPTkRTKQorICAgICAgICAgICAgICAgIC8vIFdhcm0tdXAgc2V0dXAuCisgICAgICAgICAgICAgICAgLndhcm11cEl0ZXJhdGlvbnMoMTYpCisgICAgICAgICAgICAgICAgLndhcm11cFRpbWUoVGltZVZhbHVlLm1pbGxpc2Vjb25kcygyNTAwKSkKKyAgICAgICAgICAgICAgICAvLyBNZWFzdXJlbWVudCBzZXR1cC4KKyAgICAgICAgICAgICAgICAubWVhc3VyZW1lbnRJdGVyYXRpb25zKDE2KQorICAgICAgICAgICAgICAgIC5tZWFzdXJlbWVudFRpbWUoVGltZVZhbHVlLm1pbGxpc2Vjb25kcygyNTAwKSkKKyAgICAgICAgICAgICAgICAvLyBGb3JrISAoSW52b2tlIGJlbmNobWFya3MgaW4gc2VwYXJhdGUgSlZNKQorICAgICAgICAgICAgICAgIC5mb3JrcygxKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIG5ldyBSdW5uZXIob3B0KS5ydW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0NsaWVudEJlbmNobWFyay5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9DbGllbnRCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjU1ZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9DbGllbnRCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLmNsaWVudC5Mb29wQmFja0Nvbm5lY3RvclByb3ZpZGVyOworCitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFyazsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuRm9yazsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk91dHB1dFRpbWVVbml0OworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TY29wZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2V0dXA7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlN0YXRlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5UZWFyRG93bjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuV2FybXVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIuUnVubmVyOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zQnVpbGRlcjsKKworLyoqCisgKiBMb2NhdG9yIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyfSBiZW5jaG1hcmsuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BCZW5jaG1hcmtNb2RlKE1vZGUuVGhyb3VnaHB1dCkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gMTYsIHRpbWUgPSAxLCB0aW1lVW5pdCA9IFRpbWVVbml0LlNFQ09ORFMpCitATWVhc3VyZW1lbnQoaXRlcmF0aW9ucyA9IDE2LCB0aW1lID0gMSwgdGltZVVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTKQorQEZvcmsoMSkKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgQ2xpZW50QmVuY2htYXJrIHsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgQ2xpZW50IGNsaWVudDsKKworICAgIEBTZXR1cAorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KExvb3BCYWNrQ29ubmVjdG9yUHJvdmlkZXIuZ2V0Q2xpZW50Q29uZmlnKCkpOworICAgIH0KKworICAgIEBUZWFyRG93bgorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xpZW50LnRhcmdldCgiZm9vIikucmVxdWVzdCgpLmdldCgpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xpZW50LnRhcmdldCgiZm9vIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoImJhciIpKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgIHB1YmxpYyBSZXNwb25zZSBhc3luY0Jsb2NrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjbGllbnQudGFyZ2V0KCJmb28iKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKS5nZXQoKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIEZ1dHVyZTxSZXNwb25zZT4gYXN5bmNJZ25vcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudC50YXJnZXQoImZvbyIpLnJlcXVlc3QoKS5hc3luYygpLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPFJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgLy8gTk9PUAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gTk9PUAorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIEZ1dHVyZTxSZXNwb25zZT4gYXN5bmNFbnRpdHlJZ25vcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudC50YXJnZXQoImZvbyIpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoImJhciIpLCBuZXcgSW52b2NhdGlvbkNhbGxiYWNrPFJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgLy8gTk9PUAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgLy8gTk9PUAorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT3B0aW9ucyBvcHQgPSBuZXcgT3B0aW9uc0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG91ciBiZW5jaG1hcmtzLgorICAgICAgICAgICAgICAgIC5pbmNsdWRlKENsaWVudEJlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgbmV3IFJ1bm5lcihvcHQpLnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvSmFja3NvbkJlbmNobWFyay5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9KYWNrc29uQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MjdmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvSmFja3NvbkJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwuc2VydmVyLkNvbnRhaW5lclJlcXVlc3RCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5lbnRpdHkuanNvbi5KYWNrc29uQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcmtNb2RlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Gb3JrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5MZXZlbDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk91dHB1dFRpbWVVbml0OworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2NvcGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNldHVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuVGVhckRvd247CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLldhcm11cDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLlJ1bm5lcjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuT3B0aW9uc0J1aWxkZXI7CisKKy8qKgorICogSmFja3NvbiBFbnRpdHkgRmlsdGVyaW5nIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyfSBiZW5jaG1hcmsuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BCZW5jaG1hcmtNb2RlKE1vZGUuVGhyb3VnaHB1dCkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gMTYsIHRpbWUgPSAyNTAwLCB0aW1lVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gMTYsIHRpbWUgPSAyNTAwLCB0aW1lVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BGb3JrKDEpCitAU3RhdGUoU2NvcGUuQmVuY2htYXJrKQorcHVibGljIGNsYXNzIEphY2tzb25CZW5jaG1hcmsgeworCisgICAgQFBhcmFtKHZhbHVlID0geyJwcm9qZWN0cy9iYXNpYyIsICJwcm9qZWN0cy9kZXRhaWxlZCJ9KQorICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisKKyAgICBAUGFyYW0odmFsdWUgPSB7ImZhbHNlIiwgInRydWUifSkKKyAgICBwcml2YXRlIFN0cmluZyBmaWx0ZXJpbmc7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyOworICAgIHByaXZhdGUgdm9sYXRpbGUgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworCisgICAgQFNldHVwCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IEphY2tzb25BcHBsaWNhdGlvbihCb29sZWFuLnZhbHVlT2YoZmlsdGVyaW5nKSkpOworICAgIH0KKworICAgIEBTZXR1cChMZXZlbC5JdGVyYXRpb24pCisgICAgcHVibGljIHZvaWQgcmVxdWVzdCgpIHsKKyAgICAgICAgcmVxdWVzdCA9IENvbnRhaW5lclJlcXVlc3RCdWlsZGVyCisgICAgICAgICAgICAgICAgLmZyb20ocGF0aCwgIkdFVCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlYXJEb3duCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBDb250YWluZXJSZXNwb25zZSBtZWFzdXJlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXIuYXBwbHkocmVxdWVzdCkuZ2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9wdGlvbnMgb3B0ID0gbmV3IE9wdGlvbnNCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBvdXIgYmVuY2htYXJrcy4KKyAgICAgICAgICAgICAgICAuaW5jbHVkZShKYWNrc29uQmVuY2htYXJrLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBuZXcgUnVubmVyKG9wdCkucnVuKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9KZXJzZXlVcmlCdWlsZGVyQmVuY2htYXJrLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0plcnNleVVyaUJ1aWxkZXJCZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDI1NzBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9KZXJzZXlVcmlCdWlsZGVyQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbC5KZXJzZXlVcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFyazsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuRm9yazsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk91dHB1dFRpbWVVbml0OworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2NvcGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNldHVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuV2FybXVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIuUnVubmVyOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zQnVpbGRlcjsKKworLyoqCisgKiB7QGxpbmsgSmVyc2V5VXJpQnVpbGRlcn0gYmVuY2htYXJrIGZvciBwYXJzaW5nIHRlbXBsYXRlcy4KKyAqCisgKiBAYXV0aG9yIERhdmlkIFNjaGxvc25hZ2xlCisgKi8KK0BCZW5jaG1hcmtNb2RlKE1vZGUuVGhyb3VnaHB1dCkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gMTYsIHRpbWUgPSAyNTAwLCB0aW1lVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gMTYsIHRpbWUgPSAyNTAwLCB0aW1lVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BGb3JrKDEpCitAU3RhdGUoU2NvcGUuQmVuY2htYXJrKQorcHVibGljIGNsYXNzIEplcnNleVVyaUJ1aWxkZXJCZW5jaG1hcmsgeworCisgICAgQFBhcmFtKHZhbHVlID0geyJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiLCAiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzL3thfS97Yn0ve2M6Lit9In0pCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJpVGVtcGxhdGU7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEplcnNleVVyaUJ1aWxkZXIgdXJpQnVpbGRlcjsKKworICAgIEBTZXR1cAorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHVyaUJ1aWxkZXIgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciB1cmkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHVyaUJ1aWxkZXIudXJpKHVyaVRlbXBsYXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT3B0aW9ucyBvcHQgPSBuZXcgT3B0aW9uc0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG91ciBiZW5jaG1hcmtzLgorICAgICAgICAgICAgICAgIC5pbmNsdWRlKEplcnNleVVyaUJ1aWxkZXJCZW5jaG1hcmsuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIG5ldyBSdW5uZXIob3B0KS5ydW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0xvY2F0b3JCZW5jaG1hcmsuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvTG9jYXRvckJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YzlkYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0xvY2F0b3JCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyazsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLnNlcnZlci5Mb2NhdG9yQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcmtNb2RlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Gb3JrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5MZXZlbDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk91dHB1dFRpbWVVbml0OworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2NvcGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNldHVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuVGVhckRvd247CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLldhcm11cDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLlJ1bm5lcjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuT3B0aW9uc0J1aWxkZXI7CisKKy8qKgorICogTG9jYXRvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcn0gYmVuY2htYXJrLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQmVuY2htYXJrTW9kZShNb2RlLlRocm91Z2hwdXQpCitAT3V0cHV0VGltZVVuaXQoVGltZVVuaXQuU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDE2LCB0aW1lID0gMjUwMCwgdGltZVVuaXQgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCitATWVhc3VyZW1lbnQoaXRlcmF0aW9ucyA9IDE2LCB0aW1lID0gMjUwMCwgdGltZVVuaXQgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCitARm9yaygxKQorQFN0YXRlKFNjb3BlLkJlbmNobWFyaykKK3B1YmxpYyBjbGFzcyBMb2NhdG9yQmVuY2htYXJrIHsKKworICAgIEBQYXJhbSh2YWx1ZSA9IHsiaGVsbG93b3JsZCIsICJoZWxsb3dvcmxkL2xvY2F0b3IifSkKKyAgICBwcml2YXRlIFN0cmluZyBwYXRoOworCisgICAgQFBhcmFtKHZhbHVlID0geyJHRVQiLCAiUE9TVCIsICJQVVQifSkKKyAgICBwcml2YXRlIFN0cmluZyBtZXRob2Q7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyOworICAgIHByaXZhdGUgdm9sYXRpbGUgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworCisgICAgQFNldHVwCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IExvY2F0b3JBcHBsaWNhdGlvbigpKTsKKyAgICB9CisKKyAgICBAU2V0dXAoTGV2ZWwuSXRlcmF0aW9uKQorICAgIHB1YmxpYyB2b2lkIHJlcXVlc3QoKSB7CisgICAgICAgIHJlcXVlc3QgPSBDb250YWluZXJSZXF1ZXN0QnVpbGRlcgorICAgICAgICAgICAgICAgIC5mcm9tKHBhdGgsIG1ldGhvZCkKKyAgICAgICAgICAgICAgICAuZW50aXR5KCJHRVQiLmVxdWFscyhtZXRob2QpID8gbnVsbCA6ICJIZWxsbyBXb3JsZCEiLCBoYW5kbGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBUZWFyRG93bgorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgRnV0dXJlPENvbnRhaW5lclJlc3BvbnNlPiBtZWFzdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBoYW5kbGVyLmFwcGx5KHJlcXVlc3QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPcHRpb25zIG9wdCA9IG5ldyBPcHRpb25zQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgb3VyIGJlbmNobWFya3MuCisgICAgICAgICAgICAgICAgLmluY2x1ZGUoTG9jYXRvckJlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgbmV3IFJ1bm5lcihvcHQpLnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vSmFja3NvbkFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL0phY2tzb25BcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyY2UwMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL0phY2tzb25BcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLmVudGl0eS5qc29uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEphY2tzb25BcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKYWNrc29uQXBwbGljYXRpb24oZmluYWwgYm9vbGVhbiBlbnRpdHlGaWx0ZXJpbmdFbmFibGVkKSB7CisgICAgICAgIHJlZ2lzdGVyKFByb2plY3RzUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIGlmIChlbnRpdHlGaWx0ZXJpbmdFbmFibGVkKSB7CisgICAgICAgICAgICByZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICByZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgTW9uaXRvcmluZyB0byBub3QgYWZmZWN0IGJlbmNobWFya3MuCisgICAgICAgIHByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19FTkFCTEVELCBmYWxzZSk7CisgICAgICAgIHByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Byb2plY3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vUHJvamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzNkOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Byb2plY3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5lbnRpdHkuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBQcm9qZWN0IGVudGl0eSBjbGFzcy4gRmllbGRzIHtAY29kZSB0YXNrc30gYW5kIHtAY29kZSB1c2Vyc30gYXJlIGF2YWlsYWJsZSBvbmx5IGluIGRldGFpbGVkIHZpZXcgKGRlZmluZWQgdmlhCisgKiB7QGxpbmsgUHJvamVjdERldGFpbGVkVmlld30pLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFEb2MiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFByb2plY3QgeworCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgICAgQFByb2plY3REZXRhaWxlZFZpZXcKKyAgICBwcml2YXRlIExpc3Q8VGFzaz4gdGFza3M7CisKKyAgICBAUHJvamVjdERldGFpbGVkVmlldworICAgIHByaXZhdGUgTGlzdDxVc2VyPiB1c2VyczsKKworICAgIHB1YmxpYyBQcm9qZWN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBQcm9qZWN0KGZpbmFsIExvbmcgaWQsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChmaW5hbCBMb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUYXNrPiBnZXRUYXNrcygpIHsKKyAgICAgICAgcmV0dXJuIHRhc2tzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhc2tzKGZpbmFsIExpc3Q8VGFzaz4gdGFza3MpIHsKKyAgICAgICAgdGhpcy50YXNrcyA9IHRhc2tzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFVzZXI+IGdldFVzZXJzKCkgeworICAgICAgICByZXR1cm4gdXNlcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlcnMoZmluYWwgTGlzdDxVc2VyPiB1c2VycykgeworICAgICAgICB0aGlzLnVzZXJzID0gdXNlcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Qcm9qZWN0RGV0YWlsZWRWaWV3LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Byb2plY3REZXRhaWxlZFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBlZGVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Qcm9qZWN0RGV0YWlsZWRWaWV3LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuZW50aXR5Lmpzb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZzsKKworLyoqCisgKiBFbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb24gdXNlZCB0byBkZWZpbmUgZGV0YWlsZWQgdmlldyBvbiByZXR1cm5lZCB7QGxpbmsgUHJvamVjdH0gZW50aXRpZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitARW50aXR5RmlsdGVyaW5nCitwdWJsaWMgQGludGVyZmFjZSBQcm9qZWN0RGV0YWlsZWRWaWV3IHsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiB7QGNvZGUgUHJvamVjdERldGFpbGVkVmlld30gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxQcm9qZWN0RGV0YWlsZWRWaWV3PiBpbXBsZW1lbnRzIFByb2plY3REZXRhaWxlZFZpZXcgeworCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdERldGFpbGVkVmlldyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vUHJvamVjdHNSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Qcm9qZWN0c1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1MGY0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vUHJvamVjdHNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLmVudGl0eS5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFJlc291cmNlIGNsYXNzIGZvciB7QGxpbmsgUHJvamVjdCBwcm9qZWN0c30uIFByb3ZpZGVzIG1ldGhvZHMgdG8gcmV0cmlldmUgcHJvamVjdHMgaW4gImRlZmF1bHQiIHZpZXcgKHtAbGluayAjZ2V0UHJvamVjdHMoKX0KKyAqIGFuZCBpbiAiZGV0YWlsZWQiIHZpZXcgKHtAbGluayAjZ2V0RGV0YWlsZWRQcm9qZWN0cygpfS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoInByb2plY3RzIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCitwdWJsaWMgY2xhc3MgUHJvamVjdHNSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFByb2plY3Q+IHByb2plY3RzOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZmluYWwgUHJvamVjdCBwcm9qZWN0ID0gbmV3IFByb2plY3QoMUwsICJmb28iLCAiYmFyIik7CisgICAgICAgIGZpbmFsIFVzZXIgdXNlciA9IG5ldyBVc2VyKDFMLCAiZm9vIiwgImZvb0BiYXIuYmF6Iik7CisgICAgICAgIGZpbmFsIFRhc2sgdGFzayA9IG5ldyBUYXNrKDFMLCAiZm9vIiwgImJhciIpOworCisgICAgICAgIHByb2plY3Quc2V0VXNlcnMoQXJyYXlzLmFzTGlzdCh1c2VyKSk7CisgICAgICAgIHByb2plY3Quc2V0VGFza3MoQXJyYXlzLmFzTGlzdCh0YXNrLCB0YXNrKSk7CisKKyAgICAgICAgcHJvamVjdHMgPSBBcnJheXMuYXNMaXN0KHByb2plY3QsIHByb2plY3QpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYmFzaWMiKQorICAgIHB1YmxpYyBMaXN0PFByb2plY3Q+IGdldFByb2plY3RzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV0YWlsZWRQcm9qZWN0cygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZGV0YWlsZWQiKQorICAgIEBQcm9qZWN0RGV0YWlsZWRWaWV3CisgICAgcHVibGljIExpc3Q8UHJvamVjdD4gZ2V0RGV0YWlsZWRQcm9qZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3RzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vVGFzay5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9UYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhMmY1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vVGFzay5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLmVudGl0eS5qc29uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBUYXNrIGVudGl0eSBjbGFzcy4gRmllbGRzIHtAY29kZSBwcm9qZWN0fSBhbmQge0Bjb2RlIHVzZXJ9IGFyZSBhdmFpbGFibGUgb25seSBpbiBkZXRhaWxlZCB2aWV3IChkZWZpbmVkIHZpYQorICoge0BsaW5rIFRhc2tEZXRhaWxlZFZpZXd9KS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJKYXZhRG9jIn0pCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBUYXNrIHsKKworICAgIHByaXZhdGUgTG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgIEBUYXNrRGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICBAVGFza0RldGFpbGVkVmlldworICAgIHByaXZhdGUgVXNlciB1c2VyOworCisgICAgcHVibGljIFRhc2soKSB7CisgICAgfQorCisgICAgcHVibGljIFRhc2soZmluYWwgTG9uZyBpZCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKGZpbmFsIExvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoZmluYWwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgfQorCisgICAgcHVibGljIFVzZXIgZ2V0VXNlcigpIHsKKyAgICAgICAgcmV0dXJuIHVzZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlcihmaW5hbCBVc2VyIHVzZXIpIHsKKyAgICAgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Rhc2tEZXRhaWxlZFZpZXcuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vVGFza0RldGFpbGVkVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYWYwMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Rhc2tEZXRhaWxlZFZpZXcuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5lbnRpdHkuanNvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nOworCisvKioKKyAqIEVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbiB1c2VkIHRvIGRlZmluZSBkZXRhaWxlZCB2aWV3IG9uIHJldHVybmVkIHtAbGluayBUYXNrfSBlbnRpdGllcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5GSUVMRH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK0BFbnRpdHlGaWx0ZXJpbmcKK3B1YmxpYyBAaW50ZXJmYWNlIFRhc2tEZXRhaWxlZFZpZXcgeworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIHtAY29kZSBUYXNrRGV0YWlsZWRWaWV3fSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPFRhc2tEZXRhaWxlZFZpZXc+IGltcGxlbWVudHMgVGFza0RldGFpbGVkVmlldyB7CisKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUYXNrRGV0YWlsZWRWaWV3IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Vc2VyLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjUyYjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Vc2VyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuZW50aXR5Lmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogVXNlciBlbnRpdHkgY2xhc3MuIEZpZWxkcyB7QGNvZGUgcHJvamVjdHN9IGFuZCB7QGNvZGUgdGFza3N9IGFyZSBhdmFpbGFibGUgb25seSBpbiBkZXRhaWxlZCB2aWV3IChkZWZpbmVkIHZpYQorICoge0BsaW5rIFVzZXJEZXRhaWxlZFZpZXd9IG9uIGdldHRlcnMpLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIiwgIkphdmFEb2MifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFVzZXIgeworCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgcHJpdmF0ZSBMaXN0PFByb2plY3Q+IHByb2plY3RzOworCisgICAgcHJpdmF0ZSBMaXN0PFRhc2s+IHRhc2tzOworCisgICAgcHVibGljIFVzZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIFVzZXIoZmluYWwgTG9uZyBpZCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBlbWFpbCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKGZpbmFsIExvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKSB7CisgICAgICAgIHJldHVybiBlbWFpbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChmaW5hbCBTdHJpbmcgZW1haWwpIHsKKyAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgIH0KKworICAgIEBVc2VyRGV0YWlsZWRWaWV3CisgICAgcHVibGljIExpc3Q8UHJvamVjdD4gZ2V0UHJvamVjdHMoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0cyhmaW5hbCBMaXN0PFByb2plY3Q+IHByb2plY3RzKSB7CisgICAgICAgIHRoaXMucHJvamVjdHMgPSBwcm9qZWN0czsKKyAgICB9CisKKyAgICBAVXNlckRldGFpbGVkVmlldworICAgIHB1YmxpYyBMaXN0PFRhc2s+IGdldFRhc2tzKCkgeworICAgICAgICByZXR1cm4gdGFza3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFza3MoZmluYWwgTGlzdDxUYXNrPiB0YXNrcykgeworICAgICAgICB0aGlzLnRhc2tzID0gdGFza3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Vc2VyRGV0YWlsZWRWaWV3LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1VzZXJEZXRhaWxlZFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzNmZThmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Vc2VyRGV0YWlsZWRWaWV3LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuZW50aXR5Lmpzb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZzsKKworLyoqCisgKiBFbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb24gdXNlZCB0byBkZWZpbmUgZGV0YWlsZWQgdmlldyBvbiByZXR1cm5lZCB7QGxpbmsgVXNlcn0gZW50aXRpZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitARW50aXR5RmlsdGVyaW5nCitwdWJsaWMgQGludGVyZmFjZSBVc2VyRGV0YWlsZWRWaWV3IHsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiB7QGNvZGUgVXNlckRldGFpbGVkVmlld30gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxVc2VyRGV0YWlsZWRWaWV3PiBpbXBsZW1lbnRzIFVzZXJEZXRhaWxlZFZpZXcgeworCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVXNlckRldGFpbGVkVmlldyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvc2VydmVyL0xvY2F0b3JBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9zZXJ2ZXIvTG9jYXRvckFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyNGNiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvc2VydmVyL0xvY2F0b3JBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLnNlcnZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIExvY2F0b3JBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBMb2NhdG9yQXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKExvY2F0b3JSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgLy8gVHVybiBvZmYgTW9uaXRvcmluZyB0byBub3QgYWZmZWN0IGJlbmNobWFya3MuCisgICAgICAgIHByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19FTkFCTEVELCBmYWxzZSk7CisgICAgICAgIHByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIGZhbHNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9Mb2NhdG9yUmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvc2VydmVyL0xvY2F0b3JSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjI4YTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9Mb2NhdG9yUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoInJlc291cmNlIikKK0BQcm9kdWNlcygidGV4dC9wbGFpbiIpCitwdWJsaWMgY2xhc3MgTG9jYXRvclJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEiOworICAgIH0KKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgLy8gTk9PUAorICAgIH0KKworICAgIEBQYXRoKCJsb2NhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gbG9jYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIExvY2F0b3JSZXNvdXJjZS5jbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9KYWNrc29uVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9zZXJ2ZXIvSmFja3NvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjExZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9zZXJ2ZXIvSmFja3NvblRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5lbnRpdHkuanNvbi5KYWNrc29uQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmFja3NvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBKYWNrc29uQXBwbGljYXRpb24oZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTWV0aG9kKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInByb2plY3RzL2Jhc2ljIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQoIldyb25nIEhUVFAgcmVzcG9uc2UgY29kZSByZXR1cm5lZC4iLCByZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VNZXRob2QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicHJvamVjdHMvZGV0YWlsZWQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiV3JvbmcgSFRUUCByZXNwb25zZSBjb2RlIHJldHVybmVkLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9Mb2NhdG9yVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9zZXJ2ZXIvTG9jYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTcwMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9zZXJ2ZXIvTG9jYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTG9jYXRvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhdG9yQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU1ldGhvZCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJIZWxsbyBXb3JsZCEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VNZXRob2QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJsb2NhdG9yIikucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQoIldyb25nIEhUVFAgcmVzcG9uc2UgY29kZSByZXR1cm5lZC4iLCByZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5LiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIkhlbGxvIFdvcmxkISIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LnRleHQoIkhlbGxvIFdvcmxkISIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJIZWxsbyBXb3JsZCEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdExvY2F0b3IoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJsb2NhdG9yIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LnRleHQoIkhlbGxvIFdvcmxkISIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJIZWxsbyBXb3JsZCEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgLnB1dChFbnRpdHkudGV4dCgiSGVsbG8gV29ybGQhIikpOworCisgICAgICAgIGFzc2VydFRoYXQoIldyb25nIEhUVFAgcmVzcG9uc2UgY29kZSByZXR1cm5lZC4iLCByZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjA0KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0TG9jYXRvcigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImxvY2F0b3IiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucHV0KEVudGl0eS50ZXh0KCJIZWxsbyBXb3JsZCEiKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiV3JvbmcgSFRUUCByZXNwb25zZSBjb2RlIHJldHVybmVkLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2pzb24tcG9zdC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2pzb24tcG9zdC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiNTA0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvanNvbi1wb3N0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBPU1QiCitpby5pbnB1dCgianNvbi5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9qc29uLXB1dC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2pzb24tcHV0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzJkNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9qc29uLXB1dC5sdWEKQEAgLTAsMCArMSwyMSBAQAorLS1bWworCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS1dXQord3JrLm1ldGhvZCA9ICJQVVQiCitpby5pbnB1dCgianNvbi5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9qc29uIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9qc29uLmRhdCBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvanNvbi5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxYzkzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvanNvbi5kYXQKQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiV29sZmdhbmciLCJhZ2UiOjIxLCJhZGRyZXNzIjoiU2FsemJ1cmcifQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9rcnlvLXBvc3QubHVhIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9rcnlvLXBvc3QubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YzRmYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8tcG9zdC5sdWEKQEAgLTAsMCArMSwyMSBAQAorLS1bWworCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS1dXQord3JrLm1ldGhvZCA9ICJQT1NUIgoraW8uaW5wdXQoImtyeW8uZGF0IikKK3dyay5ib2R5ID0gaW8ucmVhZCgiKmFsbCIpCit3cmsuaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24veC1rcnlvIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9rcnlvLXB1dC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8tcHV0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQ5NmZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9rcnlvLXB1dC5sdWEKQEAgLTAsMCArMSwyMSBAQAorLS1bWworCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS1dXQord3JrLm1ldGhvZCA9ICJQVVQiCitpby5pbnB1dCgia3J5by5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi94LWtyeW8iCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8uZGF0IGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9rcnlvLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQ1YmMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9rcnlvLmRhdApAQCAtMCwwICsxIEBACisBAVBhcmnzGAFKdWxl8wpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvcGVyc29uLXBvc3QubHVhIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24tcG9zdC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1NjYzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvcGVyc29uLXBvc3QubHVhCkBAIC0wLDAgKzEsMjEgQEAKKy0tW1sKKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tXV0KK3dyay5tZXRob2QgPSAiUE9TVCIKK2lvLmlucHV0KCJwZXJzb24uZGF0IikKK3dyay5ib2R5ID0gaW8ucmVhZCgiKmFsbCIpCit3cmsuaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vcGVyc29uIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24tcHV0Lmx1YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvcGVyc29uLXB1dC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmYzRiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvcGVyc29uLXB1dC5sdWEKQEAgLTAsMCArMSwyMSBAQAorLS1bWworCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS1dXQord3JrLm1ldGhvZCA9ICJQVVQiCitpby5pbnB1dCgicGVyc29uLmRhdCIpCit3cmsuYm9keSA9IGlvLnJlYWQoIiphbGwiKQord3JrLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL3BlcnNvbiIKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvcGVyc29uLmRhdCBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvcGVyc29uLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA5NTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24uZGF0CkBAIC0wLDAgKzEsNCBAQAorbmFtZTogTW96YXJ0CithZ2U6IDIxCithZGRyZXNzOiBTYWx6YnVyZworCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3RleHQtcG9zdC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3RleHQtcG9zdC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNmZhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvdGV4dC1wb3N0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBPU1QiCitpby5pbnB1dCgidGV4dC5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJ0ZXh0L3BsYWluIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC90ZXh0LXB1dC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3RleHQtcHV0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjkxMDAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC90ZXh0LXB1dC5sdWEKQEAgLTAsMCArMSwyMSBAQAorLS1bWworCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS1dXQord3JrLm1ldGhvZCA9ICJQVVQiCitpby5pbnB1dCgidGV4dC5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJ0ZXh0L3BsYWluIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC90ZXh0LmRhdCBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvdGV4dC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0M2NhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvdGV4dC5kYXQKQEAgLTAsMCArMSBAQAorUHJhZ3VlICggL8uIcHLJkcuQyaEvOyBDemVjaDogUHJhaGEgcHJvbm91bmNlZCBby4hwcmHJpmFdICggbGlzdGVuKSkgaXMgdGhlIGNhcGl0YWwgYW5kIGxhcmdlc3QgY2l0eSBvZiB0aGUgQ3plY2ggUmVwdWJsaWMuIEl0IGlzIHRoZSBmb3VydGVlbnRoLWxhcmdlc3QgY2l0eSBpbiB0aGUgRXVyb3BlYW4gVW5pb24uWzVdIEl0IGlzIGFsc28gdGhlIGhpc3RvcmljYWwgY2FwaXRhbCBvZiBCb2hlbWlhIHByb3Blci4gU2l0dWF0ZWQgaW4gdGhlIG5vcnRoLXdlc3Qgb2YgdGhlIGNvdW50cnkgb24gdGhlIFZsdGF2YSByaXZlciwgdGhlIGNpdHkgaXMgaG9tZSB0byBhYm91dCAxLjMgbWlsbGlvbiBwZW9wbGUsIHdoaWxlIGl0cyBsYXJnZXIgdXJiYW4gem9uZSBpcyBlc3RpbWF0ZWQgdG8gaGF2ZSBhIHBvcHVsYXRpb24gb2YgbmVhcmx5IDIgbWlsbGlvbi5bM10gVGhlIGNpdHkgaGFzIGEgdGVtcGVyYXRlIG9jZWFuaWMgY2xpbWF0ZSwgd2l0aCB3YXJtIHN1bW1lcnMgYW5kIGNoaWxseSB3aW50ZXJzLgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC94bWwtcG9zdC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC1wb3N0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY1ZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC94bWwtcG9zdC5sdWEKQEAgLTAsMCArMSwyMSBAQAorLS1bWworCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS1dXQord3JrLm1ldGhvZCA9ICJQT1NUIgoraW8uaW5wdXQoInhtbC5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi94bWwiCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC1wdXQubHVhIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC94bWwtcHV0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWExMWM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC94bWwtcHV0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBVVCIKK2lvLmlucHV0KCJ4bWwuZGF0IikKK3dyay5ib2R5ID0gaW8ucmVhZCgiKmFsbCIpCit3cmsuaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24veG1sIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC94bWwuZGF0IGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC94bWwuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjI0YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC5kYXQKQEAgLTAsMCArMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxwZXJzb24+PG5hbWU+V29sZmdhbmc8L25hbWU+PGFnZT4yMTwvYWdlPjxhZGRyZXNzPlNhbHpidXJnPC9hZGRyZXNzPjwvcGVyc29uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2RhdGEvTUVBU1VSRU1FTlRfREFUQSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9kYXRhL01FQVNVUkVNRU5UX0RBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyODYzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9kYXRhL01FQVNVUkVNRU5UX0RBVEEKQEAgLTAsMCArMSw3OSBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCisjCisjIEZpbGUgZm9ybWF0OgorIyBhcHBsaWNhdGlvbiBkaXJlY3RvcnkgbmFtZXxjb21tYW5kIGxpbmUgdG8gZ2VuZXJhdGUgbG9hZCBvbiBjbGllbnQgbWFjaGluZXN8Sk1YIFVSSSBmb3IgdGhlIGFwcGxpY2F0aW9ufE1CZWFuIG5hbWV8b3V0cHV0IGZpbGVuYW1lCisjCisKK21idy10ZXh0LXBsYWlufHdyayAtYzY0IC10MTYgLWQ4MDBzICBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy50ZXh0LkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYnctdGV4dC1nZXQucHJvcGVydGllcworbWJ3LXRleHQtcGxhaW58d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgdGV4dC1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnRleHQuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy10ZXh0LXB1dC5wcm9wZXJ0aWVzCittYnctdGV4dC1wbGFpbnx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnRleHQuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy10ZXh0LXBvc3QucHJvcGVydGllcworCittYnctanNvbi1tb3h5fHdyayAtYzY0IC10MTYgLWQ4MDBzICBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYnctanNvbi1tb3h5LWdldC5wcm9wZXJ0aWVzCittYnctanNvbi1tb3h5fHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIGpzb24tcHV0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYnctanNvbi1tb3h5LXB1dC5wcm9wZXJ0aWVzCittYnctanNvbi1tb3h5fHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIGpzb24tcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbi5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWpzb24tbW94eS1wb3N0LnByb3BlcnRpZXMKKworbWJ3LWpzb24tamFja3Nvbnx3cmsgLWM2NCAtdDE2IC1kODAwcyAgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbi5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWpzb24tamFja3Nvbi1nZXQucHJvcGVydGllcworbWJ3LWpzb24tamFja3Nvbnx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyBqc29uLXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbi5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWpzb24tamFja3Nvbi1wdXQucHJvcGVydGllcworbWJ3LWpzb24tamFja3Nvbnx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyBqc29uLXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb24uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy1qc29uLWphY2tzb24tcG9zdC5wcm9wZXJ0aWVzCisKK21idy1rcnlvfHdyayAtYzY0IC10MTYgLWQ4MDBzICBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5rcnlvLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYncta3J5by1nZXQucHJvcGVydGllcworbWJ3LWtyeW98d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMga3J5by1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmtyeW8uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy1rcnlvLXB1dC5wcm9wZXJ0aWVzCittYncta3J5b3x3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyBrcnlvLXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmtyeW8uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy1rcnlvLXBvc3QucHJvcGVydGllcworCittYncteG1sLW1veHl8d3JrIC1jNjQgLXQxNiAtZDgwMHMgIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LXhtbC1tb3h5LWdldC5wcm9wZXJ0aWVzCittYncteG1sLW1veHl8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgeG1sLXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LXhtbC1tb3h5LXBvc3QucHJvcGVydGllcworbWJ3LXhtbC1tb3h5fHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHhtbC1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LXhtbC1tb3h5LXB1dC5wcm9wZXJ0aWVzCisKK21idy14bWwtamF4Ynx3cmsgLWM2NCAtdDE2IC1kODAwcyBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWwuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy14bWwtamF4Yi1nZXQucHJvcGVydGllcworbWJ3LXhtbC1qYXhifHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHhtbC1wb3N0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWwuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy14bWwtamF4Yi1wb3N0LnByb3BlcnRpZXMKK21idy14bWwtamF4Ynx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB4bWwtcHV0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWwuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy14bWwtamF4Yi1wdXQucHJvcGVydGllcworCittYnctY3VzdG9tLXByb3ZpZGVyfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHBlcnNvbi1wb3N0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5jdXN0b20uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy1jdXN0b20tcG9zdC5wcm9wZXJ0aWVzCittYnctY3VzdG9tLXByb3ZpZGVyfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHBlcnNvbi1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmN1c3RvbS5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWN1c3RvbS1wdXQucHJvcGVydGllcworbWJ3LWN1c3RvbS1wcm92aWRlcnx3cmsgLWM2NCAtdDE2IC1kODAwcyBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5jdXN0b20uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy1jdXN0b20tZ2V0LnByb3BlcnRpZXMKKworcGFyYW0tc3JsfHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC9zcmwvamVkbmFCZWRuYVw7bT1iZWRuYVw/cT1qZWRuYXxvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wYXJhbS5zcmwuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfHBhcmFtLXNybC1nZXQucHJvcGVydGllcworcGFyYW0tc3JsfHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC9zcm0vamVkbmFCZWRuYVw7bT1iZWRuYVw/cT1qZWRuYXxvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wYXJhbS5zcmwuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfHBhcmFtLXNybS1nZXQucHJvcGVydGllcworCitmaWx0ZXItZ2xvYmFsfHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmdsb2JhbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8ZmlsdGVyLWdsb2JhbC1nZXQucHJvcGVydGllcworZmlsdGVyLWdsb2JhbHx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZ2xvYmFsLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxmaWx0ZXItZ2xvYmFsLXB1dC5wcm9wZXJ0aWVzCitmaWx0ZXItZ2xvYmFsfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZ2xvYmFsLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxmaWx0ZXItZ2xvYmFsLXBvc3QucHJvcGVydGllcworCitmaWx0ZXItbmFtZXx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLm5hbWUuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGZpbHRlci1uYW1lLXBvc3QucHJvcGVydGllcworZmlsdGVyLW5hbWV8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgdGV4dC1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLm5hbWUuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGZpbHRlci1uYW1lLXB1dC5wcm9wZXJ0aWVzCitmaWx0ZXItbmFtZXx3cmsgLWM2NCAtdDE2IC1kODAwcyBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5uYW1lLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxmaWx0ZXItbmFtZS1nZXQucHJvcGVydGllcworCitmaWx0ZXItZHluYW1pY3x3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmR5bmFtaWMuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGZpbHRlci1keW5hbWljLXBvc3QucHJvcGVydGllcworZmlsdGVyLWR5bmFtaWN8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgdGV4dC1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmR5bmFtaWMuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGZpbHRlci1keW5hbWljLXB1dC5wcm9wZXJ0aWVzCitmaWx0ZXItZHluYW1pY3x3cmsgLWM2NCAtdDE2IC1kODAwcyBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5keW5hbWljLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxmaWx0ZXItZHluYW1pYy1nZXQucHJvcGVydGllcworCitpbnRlcmNlcHRvci1nbG9iYWx8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgdGV4dC1wb3N0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmdsb2JhbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8aW50ZXJjZXB0b3ItZ2xvYmFsLXBvc3QucHJvcGVydGllcworaW50ZXJjZXB0b3ItZ2xvYmFsfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcHV0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmdsb2JhbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8aW50ZXJjZXB0b3ItZ2xvYmFsLXB1dC5wcm9wZXJ0aWVzCitpbnRlcmNlcHRvci1nbG9iYWx8d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5nbG9iYWwuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGludGVyY2VwdG9yLWdsb2JhbC1nZXQucHJvcGVydGllcworCitpbnRlcmNlcHRvci1uYW1lfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5uYW1lLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxpbnRlcmNlcHRvci1uYW1lLXBvc3QucHJvcGVydGllcworaW50ZXJjZXB0b3ItbmFtZXx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5uYW1lLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxpbnRlcmNlcHRvci1uYW1lLXB1dC5wcm9wZXJ0aWVzCitpbnRlcmNlcHRvci1uYW1lfHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IubmFtZS5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8aW50ZXJjZXB0b3ItbmFtZS1nZXQucHJvcGVydGllcworCitpbnRlcmNlcHRvci1keW5hbWljfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxpbnRlcmNlcHRvci1keW5hbWljLXBvc3QucHJvcGVydGllcworaW50ZXJjZXB0b3ItZHluYW1pY3x3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxpbnRlcmNlcHRvci1keW5hbWljLXB1dC5wcm9wZXJ0aWVzCitpbnRlcmNlcHRvci1keW5hbWljfHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZHluYW1pYy5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8aW50ZXJjZXB0b3ItZHluYW1pYy1nZXQucHJvcGVydGllcworCitwcm94eS1pbmplY3Rpb258d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL21ldGhvZC1pbmplY3RlZC93aXRob3V0LXBhcmFtZXRlcnN8b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucHJveHkuaW5qZWN0aW9uLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxwcm94eS1pbmplY3Rpb24tcmF3LWdldHMucHJvcGVydGllcworcHJveHktaW5qZWN0aW9ufHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC9tZXRob2QtaW5qZWN0ZWQvYWxsLXBhcmFtZXRlcnN8b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucHJveHkuaW5qZWN0aW9uLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxwcm94eS1pbmplY3Rpb24tbWV0aG9kLXBhcmFtcy5wcm9wZXJ0aWVzCitwcm94eS1pbmplY3Rpb258d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL2ZpZWxkLWluamVjdGVkL3dpdGhvdXQtcGFyYW1ldGVyc3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wcm94eS5pbmplY3Rpb24uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfHByb3h5LWluamVjdGlvbi1maWVsZC1wYXJhbXMucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2h1ZHNvbi9qZXJzZXktcGVyZm9ybWFuY2UtdGVzdC1jb21tb24uc2ggYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvaHVkc29uL2plcnNleS1wZXJmb3JtYW5jZS10ZXN0LWNvbW1vbi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTRmOGMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2h1ZHNvbi9qZXJzZXktcGVyZm9ybWFuY2UtdGVzdC1jb21tb24uc2gKQEAgLTAsMCArMSwyNjQgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK0FQUF9MSVNUPShtYnctdGV4dC1wbGFpbiBcCisgICAgICAgICAgbWJ3LWpzb24tbW94eSBtYnctanNvbi1qYWNrc29uIFwKKyAgICAgICAgICBtYncteG1sLW1veHkgbWJ3LXhtbC1qYXhiIFwKKyAgICAgICAgICBtYnctY3VzdG9tLXByb3ZpZGVyIFwKKyAgICAgICAgICBtYncta3J5byBcCisgICAgICAgICAgcGFyYW0tc3JsIFwKKyAgICAgICAgICBmaWx0ZXItZ2xvYmFsIGZpbHRlci1uYW1lIGZpbHRlci1keW5hbWljIFwKKyAgICAgICAgICBpbnRlcmNlcHRvci1nbG9iYWwgaW50ZXJjZXB0b3ItbmFtZSBpbnRlcmNlcHRvci1keW5hbWljIFwKKyAgICAgICAgICBwcm94eS1pbmplY3Rpb24pCisKK1dBUk1fVVBfU0VDT05EUz0zMDAKK1dBSVRfRk9SX0FQUF9TVEFSVFVQX1NFQz01CitXQUlUX0ZPUl9BUFBfUlVOTklOR19TRUM9NjAKK0NIRUNLX1JVTk5FUl9JTlRFUlZBTD01CitDSEVDS19URVJNX0lOVEVSVkFMPTEwCisKK0pNWF9VUklfVEVNUExBVEU9InNlcnZpY2U6am14OnJtaTovLy9qbmRpL3JtaTovL1NFUlZFUl9NQUNISU5FOjExMTEyL2pteHJtaSIKK1NBTVBMRVM9MzAKKworI3VuY29tbWVudCBmb3IgZGVidWcgcHVycG9zZXM6CisjV0FSTV9VUF9TRUNPTkRTPTMKKyNXQUlUX0ZPUl9BUFBfU1RBUlRVUF9TRUM9MgorI1dBSVRfRk9SX0FQUF9SVU5OSU5HX1NFQz0xCisjQ0hFQ0tfUlVOTkVSX0lOVEVSVkFMPTEKKyNDSEVDS19URVJNX0lOVEVSVkFMPTIKKyNTQU1QTEVTPTMKKyMvZGVidWcKKworTU9EVUxFU19UT19CVUlMRD0iIgorZm9yIGFwcCBpbiAke0FQUF9MSVNUWypdfTsgZG8KKyAgTU9EVUxFU19UT19CVUlMRD0iJE1PRFVMRVNfVE9fQlVJTEQsdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy8kYXBwIgorZG9uZQorTU9EVUxFU19UT19CVUlMRD1gZWNobyAkTU9EVUxFU19UT19CVUlMRHxzZWQgLWUncy8sLy8nYAorCitTRVJWRVJfTElTVD0oKQorQ0xJRU5UX0xJU1RfQUxMPSgpCisKKworZnVuY3Rpb24gd2FpdEZvckdyb3VwU3RhdHVzKCkgeworICBlY2hvICIjIyMjIyMjIyMjIyBXYWl0aW5nIGZvciBncm91cCBzdGF0dXM6ICQqIgorICBSVU5ORVJfSUQ9JDEKKyAgc2hpZnQKKyAgR1JPVVBfSUQ9JDEKKyAgc2hpZnQKKyAgU1RBVFVTPSQxCisKKyAgZWNobyAiI2BkYXRlYCIgPiAkU1RBVFVTX0RJUi8ucnVubmVyLiRSVU5ORVJfSUQud2FpdGluZy4kR1JPVVBfSUQuJFNUQVRVUworICBGSUxFPSIkU1RBVFVTX0RJUi8uZ3JvdXAuJEdST1VQX0lELnJ1bm5pbmcuJFJVTk5FUl9JRC4kU1RBVFVTIgorCisgIHJtIC1mICRTVEFUVVNfRElSLy5ncm91cC4kR1JPVVBfSUQucnVubmluZy4kUlVOTkVSX0lELioKKworICBhdmFpbGFibGU9ZmFsc2UKKyAgd2hpbGUgWyAiJGF2YWlsYWJsZSIgIT0gdHJ1ZSBdOyBkbworICAgIGlmIFsgLWUgIiRGSUxFIiBdOyB0aGVuCisgICAgICBhdmFpbGFibGU9dHJ1ZQorICAgIGVsc2UKKyAgICAgIHNsZWVwIDEKKyAgICBmaQorICBkb25lCit9CisKK2Z1bmN0aW9uIHJlbGVhc2VSdW5uZXJBbmRHcm91cCgpIHsKKyAgZWNobyAiIyMjIyMjIyMjIyMgUmVsZWFzZSBSdW5uZXIgYW5kIEdyb3VwOiAkKiIKKyAgUlVOTkVSX0lEPSQxCisgIHNoaWZ0CisgIEdST1VQX0lEPSQxCisKKyAgZWNobyAiI2BkYXRlYCIgPiAkU1RBVFVTX0RJUi8ucnVubmVyLiRSVU5ORVJfSUQuYXZhaWxhYmxlCisgIHJtIC1mICRTVEFUVVNfRElSLy5ncm91cC4kR1JPVVBfSUQucnVubmluZy4kUlVOTkVSX0lELiogJFNUQVRVU19ESVIvLnJ1bm5lci4kUlVOTkVSX0lELnJ1bm5pbmcKK30KKworZnVuY3Rpb24gY2hlY2tXYWl0aW5nUnVubmVycygpIHsKKyAgZWNobyAiIyMjIyMjIyMjIyMgQ2hlY2sgV2FpdGluZyBSdW5uZXJzIgorICBmb3Igd2FpdGluZ19maWxlIGluIGBscyAkU1RBVFVTX0RJUi8ucnVubmVyLioud2FpdGluZy4qLmxvY2sgMj4gL2Rldi9udWxsYDsgZG8KKyAgICBmaWxlbmFtZV9hcnJheT0oYGJhc2VuYW1lICR3YWl0aW5nX2ZpbGUgfCB0ciAiLiIgIiAiYCkKKworICAgIHJ1bm5lcl9pZD0ke2ZpbGVuYW1lX2FycmF5WzFdfQorICAgIGdyb3VwX2lkPSR7ZmlsZW5hbWVfYXJyYXlbM119CisgICAgc3RhdHVzPSR7ZmlsZW5hbWVfYXJyYXlbNF19CisKKyAgICBfZmlsZXM9KCRTVEFUVVNfRElSLy5ncm91cC4kZ3JvdXBfaWQucnVubmluZy4qKQorICAgIGlmIFsgISAtZiAiJHtfZmlsZXN9IiBdOyB0aGVuCisgICAgICBlY2hvICIjYGRhdGVgIiA+ICIkU1RBVFVTX0RJUi8uZ3JvdXAuJGdyb3VwX2lkLnJ1bm5pbmcuJHJ1bm5lcl9pZC5sb2NrIgorICAgICAgcm0gJHdhaXRpbmdfZmlsZQorICAgIGZpCisgIGRvbmUKKworICBmb3Igd2FpdGluZ19maWxlIGluIGBscyAkU1RBVFVTX0RJUi8ucnVubmVyLioud2FpdGluZy4qLm9wZW4gMj4gL2Rldi9udWxsYDsgZG8KKyAgICBmaWxlbmFtZV9hcnJheT0oYGJhc2VuYW1lICR3YWl0aW5nX2ZpbGUgfCB0ciAiLiIgIiAiYCkKKworICAgIHJ1bm5lcl9pZD0ke2ZpbGVuYW1lX2FycmF5WzFdfQorICAgIGdyb3VwX2lkPSR7ZmlsZW5hbWVfYXJyYXlbM119CisgICAgc3RhdHVzPSR7ZmlsZW5hbWVfYXJyYXlbNF19CisKKyAgICBfZmlsZXM9KCRTVEFUVVNfRElSLy5ncm91cC4kZ3JvdXBfaWQucnVubmluZy4qLmxvY2spCisgICAgaWYgWyAhIC1mICIke19maWxlc30iIF07IHRoZW4KKyAgICAgIGVjaG8gIiNgZGF0ZWAiID4gIiRTVEFUVVNfRElSLy5ncm91cC4kZ3JvdXBfaWQucnVubmluZy4kcnVubmVyX2lkLm9wZW4iCisgICAgICBybSAkd2FpdGluZ19maWxlCisgICAgZmkKKyAgZG9uZQorfQorCitmdW5jdGlvbiBjcmVhdGVNYWNoaW5lRmlsZXMgeworICBlY2hvICIjIyMjIyMjIyMjIyBDcmVhdGluZyBtYWNoaW5lIGZpbGVzIGluICRTVEFUVVNfRElSIGZvcjogJCoiCisgIFJVTk5FUl9JRD0kMQorICBzaGlmdAorICBHUk9VUF9JRD0kMQorICBzaGlmdAorICBTRVJWRVJfTUFDSElORT0kMQorICBzaGlmdAorICBDTElFTlRfTElTVD0oJEApCisKKyAgZWNobyAke0dST1VQX0lEfSA+ICRTVEFUVVNfRElSLy5ydW5uZXIuJFJVTk5FUl9JRC5ncm91cAorICBlY2hvICIjYGRhdGVgIiA+ICRTVEFUVVNfRElSLy5ydW5uZXIuJFJVTk5FUl9JRC5hdmFpbGFibGUKKyAgZWNobyAke1NFUlZFUl9NQUNISU5FfSA+ICRTVEFUVVNfRElSLy5ydW5uZXIuJFJVTk5FUl9JRC5zZXJ2ZXIKKyAgZWNobyAke0NMSUVOVF9MSVNUW0BdfSA+ICRTVEFUVVNfRElSLy5ydW5uZXIuJFJVTk5FUl9JRC5jbGllbnRzCisKKyAgU0VSVkVSX0xJU1Q9KCIke1NFUlZFUl9MSVNUW0BdfSIgIiRTRVJWRVJfTUFDSElORSIpCisgIENMSUVOVF9MSVNUX0FMTD0oIiR7Q0xJRU5UX0xJU1RfQUxMW0BdfSIgIiR7Q0xJRU5UX0xJU1RbQF19IikKK30KKworZnVuY3Rpb24gd2FpdEZvclRlcm1pbmF0b3IgeworICBlY2hvICIjIyMjIyMjIyMjIyBXYWl0aW5nIGZvciBmaW5pc2giCisgICMgd2FpdCBmb3IgdGhlIGxhc3Qgcm91bmQgdG8gZmluaXNoCisgIHRlcm1pbmF0ZWQ9ZmFsc2UKKyAgd2hpbGUgWyAiJHRlcm1pbmF0ZWQiICE9IHRydWUgXTsgZG8KKyAgICBjaGVja1dhaXRpbmdSdW5uZXJzCisgICAgX2ZpbGVzPSgkU1RBVFVTX0RJUi8ucnVubmVyLioucnVubmluZykKKyAgICBpZiBbICEgLWYgIiR7X2ZpbGVzfSIgXTsgdGhlbgorICAgICAgdGVybWluYXRlZD10cnVlCisgICAgZmkKKyAgICBpZiBbICIkdGVybWluYXRlZCIgIT0gdHJ1ZSBdOyB0aGVuCisgICAgICBlY2hvICIjIyMjIyMjIyMjIyBUZXJtaW5hdGVkIHRlc3RzOiAkdGVybWluYXRlZCwgd2FpdGluZyAkQ0hFQ0tfVEVSTV9JTlRFUlZBTCBzZWMuLi4iCisgICAgICBzbGVlcCAkQ0hFQ0tfVEVSTV9JTlRFUlZBTAorICAgIGZpCisgIGRvbmUKKworICBlY2hvICJET05FISIKKworICB3YWl0CisgIHNsZWVwIDQKKyAgd2FpdAorfQorCitmdW5jdGlvbiB0ZXN0TG9vcCB7CisgICMgRm9sbG93aW5nIGlzIHRoZSBtYWluIG1lYXN1cmVtZW50IGxvb3AKKyAgIyBNRUFTVVJFTUVOVF9EQVRBIGlzIHRoZSBpbnB1dCBkYXRhIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAjIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBuYW1lfGNvbW1hbmQgbGluZSB0byBnZW5lcmF0ZSBsb2FkIG9uIGNsaWVudCBtYWNoaW5lc3xKTVggVVJJIGZvciB0aGUgYXBwbGljYXRpb258TUJlYW4gbmFtZXxvdXRwdXQgZmlsZW5hbWUKKworICBlY2hvICIjIyMjIyMjIyMjIyBMZXQncyB0ZXN0IGl0LCByZWFkaW5nIGZyb20gJE1FQVNVUkVNRU5UX0RBVEEgZmlsZSIKKworICBUT1RBTF9DT1VOVD1gY2F0ICRNRUFTVVJFTUVOVF9EQVRBIHwgZ3JlcCAtdiAiXiMiIHwgZ3JlcCAiXi4iIHwgd2MgLWwgfCBzZWQgLWUgJ3MvICovL2cnYAorICBJTkRFWD0wCisgIGNhdCAkTUVBU1VSRU1FTlRfREFUQSB8IGdyZXAgLXYgIl4jIiB8IGdyZXAgIl4uIiB8IHdoaWxlIElGUz0iXHwiIHJlYWQgYXBwIGFiX2NtZGxpbmUgYXBwX2NsYXNzIGFnZW50X3BhcmFtIG1iZWFuIGZpbGVuYW1lCisgIGRvCisgICAgSU5ERVg9YGV4cHIgJElOREVYICsgMWAKKyAgICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBEQVRBIFskSU5ERVgvJFRPVEFMX0NPVU5UXSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgIGVjaG8gImFwcCAgICAgICA9ICRhcHAiCisgICAgZWNobyAiYXBwX2NsYXNzID0gJGFwcF9jbGFzcyIKKyAgICBlY2hvICJhYl9jbWRsaW5lPSAkYWJfY21kbGluZSIKKworICAgIHNwYXduZWQ9ZmFsc2UKKyAgICB3aGlsZSBbICIkc3Bhd25lZCIgIT0gdHJ1ZSBdOyBkbworICAgICAgZm9yIHJ1bm5lcl9maWxlIGluIGBscyAkU1RBVFVTX0RJUi8ucnVubmVyLiouYXZhaWxhYmxlIDI+IC9kZXYvbnVsbGA7IGRvCisgICAgICAgIGlmIFsgIiRzcGF3bmVkIiAhPSB0cnVlIF07IHRoZW4KKyAgICAgICAgICBmaWxlbmFtZV9hcnJheT0oYGJhc2VuYW1lICRydW5uZXJfZmlsZSB8IHRyICIuIiAiICJgKQorICAgICAgICAgIGFjdHVhbF9ydW5uZXI9JHtmaWxlbmFtZV9hcnJheVsxXX0KKyAgICAgICAgICBlY2hvICIjYGRhdGVgIiA+ICRTVEFUVVNfRElSLy5ydW5uZXIuJGFjdHVhbF9ydW5uZXIucnVubmluZworICAgICAgICAgIHJtICRydW5uZXJfZmlsZQorCisgICAgICAgICAgU0VSVkVSX01BQ0hJTkU9YGNhdCAkU1RBVFVTX0RJUi8ucnVubmVyLiRhY3R1YWxfcnVubmVyLnNlcnZlcmAKKyAgICAgICAgICBBUFBfQ09OVEVYVD0kYXBwCisgICAgICAgICAgQ0xJRU5UX0xJU1Q9KGBjYXQgJFNUQVRVU19ESVIvLnJ1bm5lci4kYWN0dWFsX3J1bm5lci5jbGllbnRzYCkKKyAgICAgICAgICBhYl9jbWRsaW5lPWBlY2hvICRhYl9jbWRsaW5lIHwgc2VkIC1lInMvU0VSVkVSX01BQ0hJTkUvJFNFUlZFUl9NQUNISU5FLyIgfCBzZWQgLWUicy9TRVJWRVJfUE9SVC8kU0VSVkVSX1BPUlQvIiB8IHNlZCAtZSJzL0FQUF9DT05URVhULyRBUFBfQ09OVEVYVC8iYAorICAgICAgICAgIEpNWF9VUkk9YGVjaG8gJEpNWF9VUklfVEVNUExBVEUgfCBzZWQgLWUicy9TRVJWRVJfTUFDSElORS8kU0VSVkVSX01BQ0hJTkUvImAKKyAgICAgICAgICBncm91cF9pZD1gY2F0ICRTVEFUVVNfRElSLy5ydW5uZXIuJGFjdHVhbF9ydW5uZXIuZ3JvdXBgCisKKyAgICAgICAgICBlY2hvICIjWyRJTkRFWC8kVE9UQUxfQ09VTlRdIiA+PiAkU1RBVFVTX0RJUi8ucnVubmVyLiRhY3R1YWxfcnVubmVyLnJ1bm5pbmcKKyAgICAgICAgICBlY2hvICIkYXBwIiA+PiAkU1RBVFVTX0RJUi8ucnVubmVyLiRhY3R1YWxfcnVubmVyLnJ1bm5pbmcKKyAgICAgICAgICBlY2hvICIkYXBwX2NsYXNzIiA+PiAkU1RBVFVTX0RJUi8ucnVubmVyLiRhY3R1YWxfcnVubmVyLnJ1bm5pbmcKKyAgICAgICAgICBlY2hvICIkYWJfY21kbGluZSIgPj4gJFNUQVRVU19ESVIvLnJ1bm5lci4kYWN0dWFsX3J1bm5lci5ydW5uaW5nCisgICAgICAgICAgZWNobyAiJGZpbGVuYW1lIiA+PiAkU1RBVFVTX0RJUi8ucnVubmVyLiRhY3R1YWxfcnVubmVyLnJ1bm5pbmcKKyAgICAgICAgICBlY2hvICIkbWJlYW4iID4+ICRTVEFUVVNfRElSLy5ydW5uZXIuJGFjdHVhbF9ydW5uZXIucnVubmluZworICAgICAgICAgIGVjaG8gIiRhZ2VudF9wYXJhbSIgPj4gJFNUQVRVU19ESVIvLnJ1bm5lci4kYWN0dWFsX3J1bm5lci5ydW5uaW5nCisKKyAgICAgICAgICBzcGF3bmVkPXRydWUKKyAgICAgICAgICBzaW5nbGVUZXN0ICYKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGNoZWNrV2FpdGluZ1J1bm5lcnMKKyAgICAgIGlmIFsgIiRzcGF3bmVkIiAhPSB0cnVlIF07IHRoZW4KKyAgICAgICAgc2xlZXAgJENIRUNLX1JVTk5FUl9JTlRFUlZBTAorICAgICAgZmkKKyAgICBkb25lCisgIGRvbmUKK30KKworZnVuY3Rpb24gcmVtb3ZlT2xkQ2FwdHVyZWREYXRhIHsKKyAgcm0gLWYgJFdPUktTUEFDRS8qLnByb3BlcnRpZXMKK30KKworZnVuY3Rpb24gcmV0cmlldmVKbXhDbGllbnQgeworICBlY2hvICIjIyMjIyMjIyMjIyBSZXRyaWV2aW5nIEpNWCBjbGllbnQiCisgIHNjcCBqZXJzZXlyb2JvdEAke1NFUlZFUl9MSVNUWzBdfTpqbXhjbGllbnQuamFyIC4KK30KKworZnVuY3Rpb24gcHJlcGFyZUNsaWVudHMgeworICBlY2hvICIjIyMjIyMjIyMjIyBDb3B5IGNsaWVudCBmaWxlcyB0byBlYWNoIGNsaWVudCIKKyAgZm9yIENMSUVOVF9NQUNISU5FIGluICR7Q0xJRU5UX0xJU1RfQUxMW0BdfTsgZG8KKyAgICBlY2hvICIuLi4gY29weSBjbGllbnQgZmlsZXMgdG8gJHtDTElFTlRfTUFDSElORX0iCisgICAgc2NwICRXT1JLU1BBQ0UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvKiBqZXJzZXlyb2JvdEAke0NMSUVOVF9NQUNISU5FfTouICYKKyAgZG9uZQorCisgIHdhaXQKK30KKworZnVuY3Rpb24gYnVpbGRUZXN0QXBwT25TZXJ2ZXJzIHsKKyAgZWNobyAiIyMjIyMjIyMjIyMgQnVpbGRpbmcgdGVzdCBhcHBsaWNhdGlvbnMgb24gZWFjaCBzZXJ2ZXIiCisgICMgZ2l0IGZldGNoIGplcnNleSBvbiB0aGUgc2VydmVyIG1hY2hpbmUgYW5kIGJ1aWxkIGFsbCBhcHBzIHRoZXJlOgorICBmb3IgU0VSVkVSX01BQ0hJTkUgaW4gJHtTRVJWRVJfTElTVFtAXX07IGRvCisgICAgc3NoIC1uIGplcnNleXJvYm90QCR7U0VSVkVSX01BQ0hJTkV9ICcoY2QgJEhPTUUvd29ya3NwYWNlL2plcnNleSAmJiAnJEdJVF9GRVRDSF9DT01NQU5EJyAmJiBtdm4gLXBsICckTU9EVUxFU19UT19CVUlMRCcgLWFtIC1Ec2tpcC50ZXN0cz10cnVlIGNsZWFuIGluc3RhbGwpJyAmCisgIGRvbmUKKworICB3YWl0Cit9CisKK2Z1bmN0aW9uIGNsZWFudXBIdWRzb25TbGF2ZSB7CisgIHJtIC1mICRTVEFUVVNfRElSLy5ydW5uZXIuKiAkU1RBVFVTX0RJUi8uZ3JvdXAuKgorfQorCitmdW5jdGlvbiBjbGVhbnVwU2VydmVyIHsKKyAgZWNobyAiIyMjIyMjIyMjIyMgS2lsbCBqYXZhIHByb2Nlc3NlcyBvbiBzZXJ2ZXIgJDEiCisgIHNzaCAtbiBqZXJzZXlyb2JvdEAkMSAnaWYgISB0ZXN0IC1lIGBwcyBoIG8gcGlkIC1DamF2YWA7IHRoZW4ga2lsbCAtcyBURVJNIGBwcyBoIG8gcGlkIC1DamF2YWAgOyBmaScKK30KKworZnVuY3Rpb24gY2xlYW51cFNlcnZlcnMgeworICBlY2hvICIjIyMjIyMjIyMjIyBLaWxsIGFsbCBqYXZhIHByb2Nlc3NlcyBvbiBlYWNoIHNlcnZlciIKKyAgZm9yIFNFUlZFUl9NQUNISU5FIGluICR7U0VSVkVSX0xJU1RbQF19OyBkbworICAgIGNsZWFudXBTZXJ2ZXIgJHtTRVJWRVJfTUFDSElORX0KKyAgZG9uZQorfQorCisKK3RyYXAgImNsZWFudXBIdWRzb25TbGF2ZTsgY2xlYW51cFNlcnZlcnMiIEVYSVQgU0lHVEVSTSBTSUdJTlQKKworI3VuY29tbWVudCBmb3IgZGVidWcgcHVycG9zZXM6CisjdHJhcCAnZWNobyAiWyRCQVNIX1NPVVJDRTokTElORU5PXSAkQkFTSF9DT01NQU5EIiA+PiAuZGVidWc7IHRhaWwgLTEwIC5kZWJ1ZyA+IC5kZWJ1Zy5zd2FwOyBtdiAuZGVidWcuc3dhcCAuZGVidWcnIERFQlVHCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvaHVkc29uL2plcnNleS1wZXJmb3JtYW5jZS10ZXN0LWdyaXp6bHkuc2ggYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvaHVkc29uL2plcnNleS1wZXJmb3JtYW5jZS10ZXN0LWdyaXp6bHkuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMmEyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9odWRzb24vamVyc2V5LXBlcmZvcm1hbmNlLXRlc3QtZ3JpenpseS5zaApAQCAtMCwwICsxLDExOSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworIworIyBFbnZpcm9ubWVudCBzZXR1cDoKKyMKKyMgR0lUX0ZFVENIX0NPTU1BTkQgLSBzcGVjaWZ5IEdJVCBjb21tYW5kIHRvIGdldCBzb3VyY2VzIHRvIHRlc3QsIGUuZy4gZ2l0IGNoZWNrb3V0IG1hc3RlciAmJiBnaXQgcHVsbAorIworIyBTVEFUVVNfRElSPSRIT01FLy5odWRzb24tamVyc2V5My1wZXJmb3JtYW5jZS10ZXN0CisjIG1rZGlyIC1wICRTVEFUVVNfRElSCisjIHNvdXJjZSBqZXJzZXktcGVyZm9ybWFuY2UtdGVzdC1jb21tb24uc2gKKyMgdGVzdCBtYWNoaW5lIHNldHM6IGNmZyMsIGdyb3VwLCBzZXJ2ZXIsIGNsaWVudHMKKyMgY3JlYXRlTWFjaGluZUZpbGVzIDEgMSBzZXJ2ZXIxIGNsaWVudDFhIGNsaWVudDFiCisjIGNyZWF0ZU1hY2hpbmVGaWxlcyAxIDIgc2VydmVyMiBjbGllbnQyYSBjbGllbnQyYgorIyBNRUFTVVJFTUVOVF9EQVRBPX4vTUVBU1VSRU1FTlRfREFUQQorIworCitTRVJWRVJfUE9SVD04MDgwCisKK2Z1bmN0aW9uIHNpbmdsZVRlc3QoKSB7CisgIGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgZWNobyAiPT09PT0gU0lOR0xFIFRFU1QgUlVOLCBTRVJWRVI9JFNFUlZFUl9NQUNISU5FLCBsb2FkZXI9JGFiX2NtZGxpbmUsIGFwcD0kYXBwLCBKTVhfVVJJPSRKTVhfVVJJLCBncm91cF9pZD0kZ3JvdXBfaWQgPT09PT0iCisgIGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKworICBlY2hvICIjIyMjIyMjIyMjIyBnb2luZyB0byBzdGFydCB0aGUgdGVzdCBhcHAgJGFwcCIKKyAgc3NoIC1uIGplcnNleXJvYm90QCR7U0VSVkVSX01BQ0hJTkV9ICcoY2Qgd29ya3NwYWNlL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lcjsgcm0gLXJmIGFwcDsgbWtkaXIgLXAgYXBwOyBjcCAkSE9NRS93b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvJyRhcHAnL3RhcmdldC9ydW5uZXIvbGliLyogYXBwLzsgSkFWQV9PUFRJT05TPSItamF2YWFnZW50OiRIT01FL2plcnNleS1wZXJmdGVzdC1hZ2VudC5qYXIiIC4vc3RhcnQuc2ggJyRhcHBfY2xhc3MnIGh0dHA6Ly8wLjAuMC4wOjgwODAvJyRhcHAnLyA0IDgpJyAmCisKKyAgd2FpdEZvckdyb3VwU3RhdHVzICRhY3R1YWxfcnVubmVyICRncm91cF9pZCAib3BlbiIKKworICBmb3IgY2xpZW50X21hY2hpbmUgaW4gJHtDTElFTlRfTElTVFsqXX07IGRvCisgICAgZWNobyAiIyMjIyMjIyMjIyMgZ29pbmcgdG8gc3RhcnQgbG9hZCBnZW5lcmF0b3IgYXQgJGNsaWVudF9tYWNoaW5lIgorICAgIChzbGVlcCAkV0FJVF9GT1JfQVBQX1NUQVJUVVBfU0VDOyBzc2ggLW4gamVyc2V5cm9ib3RAJGNsaWVudF9tYWNoaW5lICJub2h1cCAkYWJfY21kbGluZSIgJiApICYKKyAgZG9uZQorCisgIGVjaG8gIiMjIyMjIyMjIyMjIHdhaXRpbmcgJFdBUk1fVVBfU0VDT05EUyBzZWMgdG8gd2FybSB1cCBzZXJ2ZXIiCisgIHNsZWVwICRXQVJNX1VQX1NFQ09ORFMKKworICBlY2hvICIjIyMjIyMjIyMjIyB3YXJtIHVwIGZpbmlzaGVkLCB0ZXJtaW5hdGluZyBhYiBjbGllbnRzLi4uIgorICBmb3IgY2xpZW50X21hY2hpbmUgaW4gJHtDTElFTlRfTElTVFsqXX07IGRvCisgICAgZWNobyAtbiAiIyMjIyMjIyMjIyMgd2FybSB1cCBmaW5pc2hlZCwgZ29pbmcgdG8gc3RvcCBsb2FkIGdlbmVyYXRvciBhdCAkY2xpZW50X21hY2hpbmUuLi4iCisgICAgc3NoIC1uIGplcnNleXJvYm90QCRjbGllbnRfbWFjaGluZSAnaWYgISB0ZXN0IC1lIGBwcyBoIG8gcGlkIC1Dd3JrYDsgdGhlbiBraWxsIC1zIElOVCBgcHMgaCBvIHBpZCAtQ3dya2AgOyBmaScKKyAgICBlY2hvICIgZG9uZS4iCisgIGRvbmUKKworICB3YWl0Rm9yR3JvdXBTdGF0dXMgJGFjdHVhbF9ydW5uZXIgJGdyb3VwX2lkICJsb2NrIgorCisgIGZvciBjbGllbnRfbWFjaGluZSBpbiAke0NMSUVOVF9MSVNUWypdfTsgZG8KKyAgICBlY2hvICIjIyMjIyMjIyMjIyBnb2luZyB0byBzdGFydCBsb2FkIGdlbmVyYXRvciBhdCAkY2xpZW50X21hY2hpbmUgYWdhaW4iCisgICAgKHNzaCAtbiBqZXJzZXlyb2JvdEAkY2xpZW50X21hY2hpbmUgIm5vaHVwICRhYl9jbWRsaW5lIiAmICkgJgorICBkb25lCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgd2FpdGluZyBiZWZvcmUgc3RhcnQgY2FwdHVyaW5nIGpteCBkYXRhIgorICBzbGVlcCAkV0FJVF9GT1JfQVBQX1JVTk5JTkdfU0VDCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgc3RhcnRpbmcgam14IGNsaWVudCB0byBjYXB0dXJlIGRhdGEiCisgIGlmICEgamF2YSAtY3Agam14Y2xpZW50LmphciBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5qbXhjbGllbnQuTWFpbiAkSk1YX1VSSSAiJG1iZWFuIiBPbmVNaW51dGVSYXRlICRTQU1QTEVTICRmaWxlbmFtZTsgdGhlbgorICAgIGVjaG8gIiMjIyMjIyMjIyMjIEVSUk9SIFdIRU4gUFJPQ0VTU0lORyBMSU5FIyR7TElORV9OVU1CRVJ9LCB0ZXN0LWNhc2U6ICR7YXBwfSwgbWJlYW46ICR7bWJlYW59LCBmaWxlbmFtZTogJHtmaWxlbmFtZX0hIgorICBmaQorCisgIGVjaG8gIiMjIyMjIyMjIyMjIGpteCBjbGllbnQgZmluaXNoZWQsIHRlcm1pbmF0aW5nIGFiIGNsaWVudHMuLi4iCisgIGZvciBjbGllbnRfbWFjaGluZSBpbiAke0NMSUVOVF9MSVNUWypdfTsgZG8KKyAgICBlY2hvIC1uICIjIyMjIyMjIyMjIyBnb2luZyB0byBzdG9wIGxvYWQgZ2VuZXJhdG9yIGF0ICRjbGllbnRfbWFjaGluZS4uLiIKKyAgICBzc2ggLW4gamVyc2V5cm9ib3RAJGNsaWVudF9tYWNoaW5lICdpZiAhIHRlc3QgLWUgYHBzIGggbyBwaWQgLUN3cmtgOyB0aGVuIGtpbGwgLXMgSU5UIGBwcyBoIG8gcGlkIC1Dd3JrYCA7IGZpJworICAgIGVjaG8gIiBkb25lLiIKKyAgZG9uZQorCisgIGVjaG8gIiMjIyMjIyMjIyMjIHRlcm1pbmF0aW5nIHRlc3QgYXBwLi4uIgorICBzc2ggamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX0gJyhjZCB3b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyICYmIC4vc3RvcC5zaCknCisKKyAgY2xlYW51cFNlcnZlciAkU0VSVkVSX01BQ0hJTkUKKworICByZWxlYXNlUnVubmVyQW5kR3JvdXAgJGFjdHVhbF9ydW5uZXIgJGdyb3VwX2lkCit9CisKKyMKKyMgdGVzdCBwcm9jZXNzIHN0YXJ0CisjCisKK3JlbW92ZU9sZENhcHR1cmVkRGF0YQorCityZXRyaWV2ZUpteENsaWVudAorCitwcmVwYXJlQ2xpZW50cworCitidWlsZFRlc3RBcHBPblNlcnZlcnMKKworZWNobyAiIyMjIyMjIyMjIyMgUGFja2FnZSAobGliIGRpcikgYWxsIHRlc3QgY2FzZSBhcHBsaWNhdGlvbnMiCitmb3IgU0VSVkVSX01BQ0hJTkUgaW4gJHtTRVJWRVJfTElTVFtAXX07IGRvCisgIGZvciBhcHAgaW4gJHtBUFBfTElTVFsqXX07IGRvCisgICAgc3NoIGplcnNleXJvYm90QCR7U0VSVkVSX01BQ0hJTkV9ICcoY2Qgd29ya3NwYWNlL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzLyckYXBwJzsgbWtkaXIgLXAgdGFyZ2V0L3J1bm5lci9saWI7IGNkIHRhcmdldC9ydW5uZXIvbGliOyB1bnppcCAuLi8uLi8qLnppcCknCisgIGRvbmUKK2RvbmUKKworZWNobyAiIyMjIyMjIyMjIyMgQnVpbGQgYW5kIHBhY2thZ2UgKGxpYiBkaXIpIHRlc3QgcnVubmVyIgorZm9yIFNFUlZFUl9NQUNISU5FIGluICR7U0VSVkVSX0xJU1RbQF19OyBkbworICBzc2ggLW4gamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX0gJyhjZCB3b3Jrc3BhY2UvamVyc2V5OyBtdm4gLXBsIHRlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyIGNsZWFuIGluc3RhbGw7IGNkIHRlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyOyBta2RpciAtcCBsaWI7IHJtIC1mIGxpYi8qLmphcjsgY2QgbGliOyB1bnppcCAuLi90YXJnZXQvKi56aXApJyAmCitkb25lCisKK3dhaXQKKworY2xlYW51cFNlcnZlcnMKKwordGVzdExvb3AKKword2FpdEZvclRlcm1pbmF0b3IKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9odWRzb24vamVyc2V5LXBlcmZvcm1hbmNlLXRlc3Qtd2xzLnNoIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2h1ZHNvbi9qZXJzZXktcGVyZm9ybWFuY2UtdGVzdC13bHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3NjIyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9odWRzb24vamVyc2V5LXBlcmZvcm1hbmNlLXRlc3Qtd2xzLnNoCkBAIC0wLDAgKzEsMTM5IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCisjCisjIEVudmlyb25tZW50IHNldHVwOgorIworIyBHSVRfRkVUQ0hfQ09NTUFORCAtIHNwZWNpZnkgR0lUIGNvbW1hbmQgdG8gZ2V0IHNvdXJjZXMgdG8gdGVzdCwgZS5nLiBnaXQgY2hlY2tvdXQgbWFzdGVyICYmIGdpdCBwdWxsCisjIFdFQkxPR0lDX09VSV9VUkwgLSBVUkwgdG8gZG93bmxvYWQgV0xTIGluc3RhbGxhdGlvbiBqYXIgZnJvbQorIworIyBTVEFUVVNfRElSPSRIT01FLy5odWRzb24tamVyc2V5My1wZXJmb3JtYW5jZS10ZXN0CisjIG1rZGlyIC1wICRTVEFUVVNfRElSCisjIHNvdXJjZSBqZXJzZXktcGVyZm9ybWFuY2UtdGVzdC1jb21tb24uc2gKKyMgdGVzdCBtYWNoaW5lIHNldHM6IGNmZyMsIGdyb3VwLCBzZXJ2ZXIsIGNsaWVudHMKKyMgY3JlYXRlTWFjaGluZUZpbGVzIDEgMSBzZXJ2ZXIxIGNsaWVudDFhIGNsaWVudDFiCisjIGNyZWF0ZU1hY2hpbmVGaWxlcyAxIDIgc2VydmVyMiBjbGllbnQyYSBjbGllbnQyYgorIyBNRUFTVVJFTUVOVF9EQVRBPX4vTUVBU1VSRU1FTlRfREFUQQorIworCitMT0dTX0RJUj0kV09SS1NQQUNFL2xvZ3MKKworU0VSVkVSX1BPUlQ9NzAwMQorCitmdW5jdGlvbiBzaW5nbGVUZXN0KCkgeworICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgIGVjaG8gIj09PT09IFNJTkdMRSBURVNUIFJVTiwgU0VSVkVSPSRTRVJWRVJfTUFDSElORSwgbG9hZGVyPSRhYl9jbWRsaW5lLCBhcHA9JGFwcCwgSk1YX1VSST0kSk1YX1VSSSwgZ3JvdXBfaWQ9JGdyb3VwX2lkID09PT09IgorICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgU3RhcnQgV0xTIHNlcnZlciIKKyAgc3NoIC1uIGplcnNleXJvYm90QCR7U0VSVkVSX01BQ0hJTkV9ICcoY2Qgd29ya3NwYWNlL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyOyAuL3N0YXJ0LnNoKScgJgorCisgIGVjaG8gIiMjIyMjIyMjIyMjIHdhaXRpbmcgZm9yIFdMUyBzZXJ2ZXIgc3RhcnQiCisgIHdoaWxlIFsgISBgd2dldCAtcSAtLXNlcnZlci1yZXNwb25zZSAtLW5vLXByb3h5IGh0dHA6Ly8ke1NFUlZFUl9NQUNISU5FfTo3MDAxIDI+JjEgfCBhd2sgJy9eICBIVFRQL3twcmludCAkMn0nYCBdOyBkbworICAgIHNsZWVwIDUKKyAgICBlY2hvICIjICR7U0VSVkVSX01BQ0hJTkV9IgorICBkb25lCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgZ29pbmcgdG8gZGVwbG95L3N0YXJ0IHRoZSB0ZXN0IGFwcCAkYXBwIgorICBzc2ggLW4gamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX0gJyhjZCB3b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXI7IC4vZGVwbG95LnNoICRQV0QvLi4vLi4vdGVzdC1jYXNlcy8nJGFwcCcvdGFyZ2V0L3J1bm5lci8nJGFwcCcud2FyKScKKworICB3YWl0Rm9yR3JvdXBTdGF0dXMgJGFjdHVhbF9ydW5uZXIgJGdyb3VwX2lkICJvcGVuIgorCisgIGZvciBjbGllbnRfbWFjaGluZSBpbiAke0NMSUVOVF9MSVNUWypdfTsgZG8KKyAgICBlY2hvICIjIyMjIyMjIyMjIyBnb2luZyB0byBzdGFydCBsb2FkIGdlbmVyYXRvciBhdCAkY2xpZW50X21hY2hpbmUiCisgICAgKHNsZWVwICRXQUlUX0ZPUl9BUFBfU1RBUlRVUF9TRUM7IHNzaCAtbiBqZXJzZXlyb2JvdEAkY2xpZW50X21hY2hpbmUgIm5vaHVwICRhYl9jbWRsaW5lIiAmICkgJgorICBkb25lCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgd2FpdGluZyAkV0FSTV9VUF9TRUNPTkRTIHNlYyB0byB3YXJtIHVwIHNlcnZlciIKKyAgc2xlZXAgJFdBUk1fVVBfU0VDT05EUworCisgIGVjaG8gIiMjIyMjIyMjIyMjIHdhcm0gdXAgZmluaXNoZWQsIHRlcm1pbmF0aW5nIGFiIGNsaWVudHMuLi4iCisgIGZvciBjbGllbnRfbWFjaGluZSBpbiAke0NMSUVOVF9MSVNUWypdfTsgZG8KKyAgICBlY2hvIC1uICIjIyMjIyMjIyMjIyB3YXJtIHVwIGZpbmlzaGVkLCBnb2luZyB0byBzdG9wIGxvYWQgZ2VuZXJhdG9yIGF0ICRjbGllbnRfbWFjaGluZS4uLiIKKyAgICBzc2ggLW4gamVyc2V5cm9ib3RAJGNsaWVudF9tYWNoaW5lICdpZiAhIHRlc3QgLWUgYHBzIGggbyBwaWQgLUN3cmtgOyB0aGVuIGtpbGwgLXMgSU5UIGBwcyBoIG8gcGlkIC1Dd3JrYCA7IGZpJworICAgIGVjaG8gIiBkb25lLiIKKyAgZG9uZQorCisgIHdhaXRGb3JHcm91cFN0YXR1cyAkYWN0dWFsX3J1bm5lciAkZ3JvdXBfaWQgImxvY2siCisKKyAgZm9yIGNsaWVudF9tYWNoaW5lIGluICR7Q0xJRU5UX0xJU1RbKl19OyBkbworICAgIGVjaG8gIiMjIyMjIyMjIyMjIGdvaW5nIHRvIHN0YXJ0IGxvYWQgZ2VuZXJhdG9yIGF0ICRjbGllbnRfbWFjaGluZSBhZ2FpbiIKKyAgICAoc3NoIC1uIGplcnNleXJvYm90QCRjbGllbnRfbWFjaGluZSAibm9odXAgJGFiX2NtZGxpbmUiICYgKSAmCisgIGRvbmUKKworICBlY2hvICIjIyMjIyMjIyMjIyB3YWl0aW5nIGJlZm9yZSBzdGFydCBjYXB0dXJpbmcgam14IGRhdGEiCisgIHNsZWVwICRXQUlUX0ZPUl9BUFBfUlVOTklOR19TRUMKKworICBlY2hvICIjIyMjIyMjIyMjIyBzdGFydGluZyBqbXggY2xpZW50IHRvIGNhcHR1cmUgZGF0YSIKKyAgaWYgISBqYXZhIC1jcCBqbXhjbGllbnQuamFyIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmpteGNsaWVudC5NYWluICRKTVhfVVJJICIkbWJlYW4iIE9uZU1pbnV0ZVJhdGUgJFNBTVBMRVMgJGZpbGVuYW1lOyB0aGVuCisgICAgZWNobyAiIyMjIyMjIyMjIyMgRVJST1IgV0hFTiBQUk9DRVNTSU5HIExJTkUjJHtMSU5FX05VTUJFUn0sIHRlc3QtY2FzZTogJHthcHB9LCBtYmVhbjogJHttYmVhbn0sIGZpbGVuYW1lOiAke2ZpbGVuYW1lfSEiCisgIGZpCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgam14IGNsaWVudCBmaW5pc2hlZCwgdGVybWluYXRpbmcgYWIgY2xpZW50cy4uLiIKKyAgZm9yIGNsaWVudF9tYWNoaW5lIGluICR7Q0xJRU5UX0xJU1RbKl19OyBkbworICAgIGVjaG8gLW4gIiMjIyMjIyMjIyMjIGdvaW5nIHRvIHN0b3AgbG9hZCBnZW5lcmF0b3IgYXQgJGNsaWVudF9tYWNoaW5lLi4uIgorICAgIHNzaCAtbiBqZXJzZXlyb2JvdEAkY2xpZW50X21hY2hpbmUgJ2lmICEgdGVzdCAtZSBgcHMgaCBvIHBpZCAtQ3dya2A7IHRoZW4ga2lsbCAtcyBJTlQgYHBzIGggbyBwaWQgLUN3cmtgIDsgZmknCisgICAgZWNobyAiIGRvbmUuIgorICBkb25lCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgdGVybWluYXRpbmcgdGVzdCBhcHAuLi4iCisgIHNzaCBqZXJzZXlyb2JvdEAke1NFUlZFUl9NQUNISU5FfSAnKGNkIHdvcmtzcGFjZS9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lciAmJiAuL3N0b3Auc2gpJworCisgIGVjaG8gIiMjIyMjIyMjIyMjIGNvcHkgc2VydmVyIGFuZCBkb21haW4gbG9ncyB0byBodWRzb24gc2xhdmUuLi4iCisgIGp1c3RfZmlsZW5hbWU9YGVjaG8gJHtmaWxlbmFtZX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLydgCisgIHNjcCBqZXJzZXlyb2JvdEAke1NFUlZFUl9NQUNISU5FfTp3b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvdGFyZ2V0L3NlcnZlci5sb2cgJExPR1NfRElSLyR7anVzdF9maWxlbmFtZX0tc2VydmVyLmxvZworICBzY3AgamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX06d29ya3NwYWNlL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyL3RhcmdldC9kb21haW4ubG9nICRMT0dTX0RJUi8ke2p1c3RfZmlsZW5hbWV9LWRvbWFpbi5sb2cKKworICBjbGVhbnVwU2VydmVyICRTRVJWRVJfTUFDSElORQorCisgIHJlbGVhc2VSdW5uZXJBbmRHcm91cCAkYWN0dWFsX3J1bm5lciAkZ3JvdXBfaWQKK30KKworIworIyB0ZXN0IHByb2Nlc3Mgc3RhcnQKKyMKKworbWtkaXIgLXAgJExPR1NfRElSCitybSAtZiAkTE9HU19ESVIvKgorCityZW1vdmVPbGRDYXB0dXJlZERhdGEKKworcmV0cmlldmVKbXhDbGllbnQKKworcHJlcGFyZUNsaWVudHMKKworYnVpbGRUZXN0QXBwT25TZXJ2ZXJzCisKK2VjaG8gIiMjIyMjIyMjIyMjIFByZXBhcmUgd2FyIGZpbGVzIG9mIGFsbCB0ZXN0IGNhc2UgYXBwbGljYXRpb25zIgorZm9yIFNFUlZFUl9NQUNISU5FIGluICR7U0VSVkVSX0xJU1RbQF19OyBkbworICBmb3IgYXBwIGluICR7QVBQX0xJU1RbKl19OyBkbworICAgIHNzaCBqZXJzZXlyb2JvdEAke1NFUlZFUl9NQUNISU5FfSAnKGNkIHdvcmtzcGFjZS9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy8nJGFwcCc7IG1rZGlyIC1wIHRhcmdldC9ydW5uZXI7IGNwIHRhcmdldC8qLndhciB0YXJnZXQvcnVubmVyLyckYXBwJy53YXIpJworICBkb25lCitkb25lCisKK2VjaG8gIiMjIyMjIyMjIyMjIEluc3RhbGwgV0xTIHNlcnZlciIKK2ZvciBTRVJWRVJfTUFDSElORSBpbiAke1NFUlZFUl9MSVNUW0BdfTsgZG8KKyAgc3NoIC1uIGplcnNleXJvYm90QCR7U0VSVkVSX01BQ0hJTkV9ICcoY2Qgd29ya3NwYWNlL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyOyAuL2luc3RhbGwuc2ggJyRXRUJMT0dJQ19PVUlfVVJMJyknICYKK2RvbmUKKword2FpdAorCitjbGVhbnVwU2VydmVycworCit0ZXN0TG9vcAorCit3YWl0Rm9yVGVybWluYXRvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2Uvam14LWNsaWVudC9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2Uvam14LWNsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTc4NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9qbXgtY2xpZW50L3BvbS54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QucGVyZm9ybWFuY2U8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmpteGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgIDxuYW1lPkpteENsaWVudDwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgPC9wcm9wZXJ0aWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9qbXgtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2Uvam14Y2xpZW50L01haW4uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2pteC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9qbXhjbGllbnQvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZmFmYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9qbXgtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2Uvam14Y2xpZW50L01haW4uamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmpteGNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXJDb25uZWN0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3I7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhTZXJ2aWNlVVJMOworCisvKioKKyAqIEpNWCBDbGllbnQgZW50cnkgcG9pbnQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1haW4geworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKy8vICAgICAgZS5nLiAic2VydmljZTpqbXg6cm1pOi8vL2puZGkvcm1pOi8vc3lzaWZvcy5jei5vcmFjbGUuY29tOjExMTEyL2pteHJtaSIKKyAgICAgICAgZmluYWwgU3RyaW5nIGpteFVybCA9IGFyZ3NbMF07CisvLyAgICAgIGUuZy4gIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZHluYW1pYzp0eXBlPUR5bmFtaWNhbGx5Qm91bmRJbnRlcmNlcHRvclJlc291cmNlLG5hbWU9Z2V0cyIKKyAgICAgICAgZmluYWwgU3RyaW5nIG1CZWFuTmFtZSA9IGFyZ3NbMV07CisvLyAgICAgIGUuZy4gIk9uZU1pbnV0ZVJhdGUiCisgICAgICAgIGZpbmFsIFN0cmluZyBtQmVhbkF0dHJOYW1lID0gYXJnc1syXTsKKy8vICAgICAgZS5nLiA1MAorICAgICAgICBmaW5hbCBpbnQgc2FtcGxlQ291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbM10pOworLy8gICAgICBlLmcuICJwaGlzaGluZy5wcm9wZXJ0aWVzIgorICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydGllc0ZpbGUgPSBhcmdzWzRdOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJKTVggVVJMID0gJXNcbk1CZWFuID0gJXNcbmF0dHJpYnV0ZSA9ICVzXG5zYW1wbGVzID0gJWRcbmZpbGVuYW1lID0gJXNcbiIKKyAgICAgICAgICAgICAgICArICJHb2luZyB0byBjb25uZWN0Li4uXG4iLAorICAgICAgICAgICAgICAgIGpteFVybCwgbUJlYW5OYW1lLCBtQmVhbkF0dHJOYW1lLCBzYW1wbGVDb3VudCwgcHJvcGVydGllc0ZpbGUpOworCisgICAgICAgIGZpbmFsIEpNWFNlcnZpY2VVUkwgdXJsID0gbmV3IEpNWFNlcnZpY2VVUkwoam14VXJsKTsKKyAgICAgICAgZmluYWwgSk1YQ29ubmVjdG9yIGpteGMgPSBKTVhDb25uZWN0b3JGYWN0b3J5LmNvbm5lY3QodXJsLCBudWxsKTsKKyAgICAgICAgZmluYWwgTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIG1CZWFuU2VydmVyID0gam14Yy5nZXRNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKKyAgICAgICAgZmluYWwgT2JqZWN0TmFtZSBtQmVhbk9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZShtQmVhbk5hbWUpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ29ubmVjdGVkLi4uIik7CisKKyAgICAgICAgZG91YmxlIHRvdGFsU3VtID0gMDsKKyAgICAgICAgaW50IHNhbXBsZXNUYWtlbiA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYW1wbGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisKKyAgICAgICAgICAgIERvdWJsZSBzYW1wbGUgPSAoRG91YmxlKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUobUJlYW5PYmplY3ROYW1lLCBtQmVhbkF0dHJOYW1lKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIk9NUlslZF09JWZcbiIsIGksIHNhbXBsZSk7CisKKyAgICAgICAgICAgIHRvdGFsU3VtICs9IHNhbXBsZTsKKyAgICAgICAgICAgIHNhbXBsZXNUYWtlbisrOworICAgICAgICB9CisKKyAgICAgICAgam14Yy5jbG9zZSgpOworCisgICAgICAgIGZpbmFsIGRvdWJsZSByZXN1bHQgPSB0b3RhbFN1bSAvIHNhbXBsZXNUYWtlbjsKKyAgICAgICAgd3JpdGVSZXN1bHQocmVzdWx0LCBwcm9wZXJ0aWVzRmlsZSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlxuQXZlcmFnZT0lZlxuIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUmVzdWx0KGRvdWJsZSByZXN1bHRWYWx1ZSwgU3RyaW5nIHByb3BlcnRpZXNGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQcm9wZXJ0aWVzIHJlc3VsdFByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcmVzdWx0UHJvcHMucHV0KCJZVkFMVUUiLCBEb3VibGUudG9TdHJpbmcocmVzdWx0VmFsdWUpKTsKKyAgICAgICAgcmVzdWx0UHJvcHMuc3RvcmUobmV3IEZpbGVPdXRwdXRTdHJlYW0ocHJvcGVydGllc0ZpbGUpLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDM0Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvcG9tLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2U8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgUGVyZm9ybWFuY2UgdGVzdHMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmJlbmNobWFya3M8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5ydW5uZXJzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+dGVzdC1jYXNlczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnRvb2xzPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzE4ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvcG9tLnhtbApAQCAtMCwwICsxLDk0IEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucnVubmVyczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktcnVubmVyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktZ3JpenpseS1ydW5uZXI8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkQ2xhc3NwYXRoPnRydWU8L2FkZENsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnJ1bm5lcnMuSmVyc2V5R3JpenpseVJ1bm5lcjwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5ydW5uZXJzLkplcnNleUdyaXp6bHlSdW5uZXI8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvemlwLXdpdGgtamFycy54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2UtYXNzZW1ibHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGlzIGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlIG1lcmdlcyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYXBwZW5kIHRvIHRoZSBwYWNrYWdpbmcgcGhhc2UuIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ29hbHMgPT0gbW9qb3MgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3NyYy9tYWluL2Fzc2VtYmx5L3ppcC13aXRoLWphcnMueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvc3JjL21haW4vYXNzZW1ibHkvemlwLXdpdGgtamFycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhMmE3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3NyYy9tYWluL2Fzc2VtYmx5L3ppcC13aXRoLWphcnMueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgorICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KKyAgICA8aWQ+emlwLXdpdGgtamFyczwvaWQ+CisgICAgPGZvcm1hdHM+CisgICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgICAgPC9mb3JtYXRzPgorICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisgICAgPGRlcGVuZGVuY3lTZXRzPgorICAgICAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+CisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgICA8L2RlcGVuZGVuY3lTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9KZXJzZXlHcml6emx5UnVubmVyLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvSmVyc2V5R3JpenpseVJ1bm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjUxY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvSmVyc2V5R3JpenpseVJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucnVubmVyczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkubmlvLnRyYW5zcG9ydC5UQ1BOSU9UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5LnRocmVhZHBvb2wuVGhyZWFkUG9vbENvbmZpZzsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBjbGFzcyB0byBzdGFydCBwZXJmb3JtYW5jZSB0ZXN0IHdlYiBzZXJ2aWNlIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8gaWYgdGhlIGJhc2UgVVJJCisgKiBpcyBub3QgcGFzc2VkIHZpYSB0aGUgc2Vjb25kIGNvbW1hbmQgbGluZSBhcmd1bWVudC4KKyAqLworcHVibGljIGNsYXNzIEplcnNleUdyaXp6bHlSdW5uZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0VMRUNUT1JTID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XT1JLRVJTID0gODsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkplcnNleSBwZXJmb3JtYW5jZSB0ZXN0IHdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9uIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGpheFJzQXBwID0gYXJncy5sZW5ndGggPiAwID8gYXJnc1swXSA6IG51bGw7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IFJlc291cmNlQ29uZmlnCisgICAgICAgICAgICAgICAgLmZvckFwcGxpY2F0aW9uQ2xhc3MoKENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4pIENsYXNzLmZvck5hbWUoamF4UnNBcHApKTsKKyAgICAgICAgVVJJIGJhc2VVcmkgPSBhcmdzLmxlbmd0aCA+IDEgPyBVUkkuY3JlYXRlKGFyZ3NbMV0pIDogQkFTRV9VUkk7CisgICAgICAgIGludCBzZWxlY3RvcnMgPSBhcmdzLmxlbmd0aCA+IDIgPyBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMl0pIDogREVGQVVMVF9TRUxFQ1RPUlM7CisgICAgICAgIGludCB3b3JrZXJzID0gYXJncy5sZW5ndGggPiAzID8gSW50ZWdlci5wYXJzZUludChhcmdzWzNdKSA6IERFRkFVTFRfV09SS0VSUzsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZywgZmFsc2UpOworICAgICAgICBmaW5hbCBUQ1BOSU9UcmFuc3BvcnQgdHJhbnNwb3J0ID0gc2VydmVyLmdldExpc3RlbmVyKCJncml6emx5IikuZ2V0VHJhbnNwb3J0KCk7CisgICAgICAgIHRyYW5zcG9ydC5zZXRTZWxlY3RvclJ1bm5lcnNDb3VudChzZWxlY3RvcnMpOworICAgICAgICB0cmFuc3BvcnQuc2V0V29ya2VyVGhyZWFkUG9vbENvbmZpZyhUaHJlYWRQb29sQ29uZmlnLmRlZmF1bHRDb25maWcoKS5zZXRDb3JlUG9vbFNpemUod29ya2Vycykuc2V0TWF4UG9vbFNpemUod29ya2VycykpOworCisgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLlxuVHJ5IG91dCAlc1xuSGl0IEN0cmwtQyB0byBzdG9wIGl0Li4uIiwKKyAgICAgICAgICAgICAgICBiYXNlVXJpKSk7CisKKyAgICAgICAgd2hpbGUgKHNlcnZlci5pc1N0YXJ0ZWQoKSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDYwMDAwMCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9zdGFydC5zaCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3N0YXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZDQ1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9zdGFydC5zaApAQCAtMCwwICsxLDM2IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitMSUJTPSQoZm9yIGwgaW4gYGxzIGxpYmA7IGRvIGVjaG8gLW4gbGliLyRsIjoiO2RvbmUpCitMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lcycvOiQvLydgCisKK0FQUD0kKGZvciBsIGluIGBscyBhcHBgOyBkbyBlY2hvIC1uIGFwcC8kbCI6Ijtkb25lKQorQVBQPWBlY2hvICRBUFAgfCBzZWQgLWVzJy86JC8vJ2AKKworbm9odXAgamF2YSAtc2VydmVyIC1YbXM1MTJtIC1YbXgxMDI0bSAtWFg6UGVybVNpemU9MjU2bSAtWFg6TWF4UGVybVNpemU9NTEybSBcCisgICAgICAtWFg6K1VzZVBhcmFsbGVsR0MgLVhYOitBZ2dyZXNzaXZlT3B0cyAtWFg6K1VzZUZhc3RBY2Nlc3Nvck1ldGhvZHMgXAorICAgICAgLWNwICRBUFA6JExJQlMgXAorICAgICAgLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQ9MTExMTIgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZT1mYWxzZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPWZhbHNlIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5sb2NhbC5vbmx5PWZhbHNlIFwKKyAgICAgICRKQVZBX09QVElPTlMgXAorICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucnVubmVycy5KZXJzZXlHcml6emx5UnVubmVyICQqICYKK2VjaG8gJCEgPiBncml6emx5LnBpZAord2FpdApkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvc3RvcC5zaCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3N0b3Auc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlYTQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3N0b3Auc2gKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworaWYgdGVzdCAtZiBncml6emx5LnBpZDsgdGhlbgorICBraWxsIC05IGBjYXQgZ3JpenpseS5waWRgCisgIHJtIGdyaXp6bHkucGlkCitmaQorCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyL2RlcGxveS5zaCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvZGVwbG95LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MTAzMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyL2RlcGxveS5zaApAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitGSUxFPSQxCisKK1RBUkdFVD0kUFdEL3RhcmdldAorVEVTVF9ET01BSU49YGNhdCAkVEFSR0VUL3Rlc3RfZG9tYWluLnR4dGAKKworLiAkVEVTVF9ET01BSU4vYmluL3NldERvbWFpbkVudi5zaAorCitqYXZhIHdlYmxvZ2ljLkRlcGxveWVyIC11c2VybmFtZSB3ZWJsb2dpYyAtcGFzc3dvcmQgd2VibG9naWMxIC1kZXBsb3kgJEZJTEUKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvaW5zdGFsbC5zaCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvaW5zdGFsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjllZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9pbnN0YWxsLnNoCkBAIC0wLDAgKzEsNDMgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK1dFQkxPR0lDX1VSTD0kMQorCitUQVJHRVQ9JFBXRC90YXJnZXQKK09QVD0kVEFSR0VUL29wdAorCitybSAtcmYgJFRBUkdFVAorbWtkaXIgLXAgJE9QVAorCitjZCAkVEFSR0VUCitybSAtZiB3bHMuamFyCit3Z2V0IC0tbm8tcHJveHkgJFdFQkxPR0lDX1VSTCAtTyB3bHMuamFyCisKK2NkICRPUFQKK2phdmEgLWphciAkVEFSR0VUL3dscy5qYXIKK2NkIHdscyoKKworTVdfSE9NRT1gcHdkYAorZWNobyAkTVdfSE9NRSA+ICRUQVJHRVQvbXdfaG9tZS50eHQKKworLiAkTVdfSE9NRS93bHNlcnZlci9zZXJ2ZXIvYmluL3NldFdMU0Vudi5zaAorCitURVNUX0RPTUFJTj0kTVdfSE9NRS9odWRzb25fdGVzdF9kb21haW4KKworbWtkaXIgLXAgJFRFU1RfRE9NQUlOCitjZCAkVEVTVF9ET01BSU4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9zdGFydC5zaCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvc3RhcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4ZjdlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvc3RhcnQuc2gKQEAgLTAsMCArMSw3MSBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworVEFSR0VUPSRQV0QvdGFyZ2V0CitNV19IT01FPWBjYXQgJFRBUkdFVC9td19ob21lLnR4dGAKK1RFU1RfRE9NQUlOPSRNV19IT01FL2h1ZHNvbl90ZXN0X2RvbWFpbgorRE9NQUlOX05BTUU9SHVkc29uVGVzdERvbWFpbgorU0VSVkVSX05BTUU9SHVkc29uVGVzdFNlcnZlcgorUElEX0ZJTEU9JFRBUkdFVC93bHMucGlkCisKK2VjaG8gJFRFU1RfRE9NQUlOID4gJFRBUkdFVC90ZXN0X2RvbWFpbi50eHQKKworY2QgJE1XX0hPTUUKKy4gJE1XX0hPTUUvd2xzZXJ2ZXIvc2VydmVyL2Jpbi9zZXRXTFNFbnYuc2gKKworcm0gLXJmICRURVNUX0RPTUFJTgorbWtkaXIgLXAgJFRFU1RfRE9NQUlOCitjZCAkVEVTVF9ET01BSU4KKworcm0gLWYgJFRBUkdFVC9hdXRvZGVwbG95CitsbiAtcyAkVEVTVF9ET01BSU4vYXV0b2RlcGxveSAkVEFSR0VUL2F1dG9kZXBsb3kKKworcm0gLWYgJFRBUkdFVC9zZXJ2ZXIubG9nCitybSAtZiAkVEFSR0VUL2RvbWFpbi5sb2cKK2xuIC1zICRURVNUX0RPTUFJTi9zZXJ2ZXJzLyRTRVJWRVJfTkFNRS9sb2dzLyRTRVJWRVJfTkFNRS5sb2cgJFRBUkdFVC9zZXJ2ZXIubG9nCitsbiAtcyAkVEVTVF9ET01BSU4vc2VydmVycy8kU0VSVkVSX05BTUUvbG9ncy8kRE9NQUlOX05BTUUubG9nICRUQVJHRVQvZG9tYWluLmxvZworCitKQVZBX09QVElPTlM9Ii1qYXZhYWdlbnQ6JEhPTUUvamVyc2V5LXBlcmZ0ZXN0LWFnZW50LmphciIKKworeWVzIHwgbm9odXAgamF2YSAtc2VydmVyIFwKKyAgICAgIC1YbXMxMDI0bSBcCisgICAgICAtWG14MTAyNG0gXAorICAgICAgLVhYOk1heFBlcm1TaXplPTI1Nm0gXAorICAgICAgLUR3ZWJsb2dpYy5Eb21haW49JERPTUFJTl9OQU1FIFwKKyAgICAgIC1Ed2VibG9naWMuTmFtZT0kU0VSVkVSX05BTUUgXAorICAgICAgLUR3ZWJsb2dpYy5tYW5hZ2VtZW50LnVzZXJuYW1lPXdlYmxvZ2ljIFwKKyAgICAgIC1Ed2VibG9naWMubWFuYWdlbWVudC5wYXNzd29yZD13ZWJsb2dpYzEgXAorICAgICAgLUR3ZWJsb2dpYy5MaXN0ZW5Qb3J0PTcwMDEgXAorICAgICAgLURqYXZhLnNlY3VyaXR5LmVnZD1maWxlOi9kZXYvLi91cmFuZG9tIFwKKyAgICAgIC1EamF2YS5uZXQucHJlZmVySVB2NFN0YWNrPXRydWUgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5wb3J0PTExMTEyIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGU9ZmFsc2UgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbD1mYWxzZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUubG9jYWwub25seT1mYWxzZSBcCisgICAgICAkSkFWQV9PUFRJT05TIFwKKyAgICAgIHdlYmxvZ2ljLlNlcnZlciAmCisKK2VjaG8gJCEgPiAkUElEX0ZJTEUKKworIyB3YWl0IGZvciBzZXJ2ZXIgdG8gc3RhcnQKK2VjaG8gIioqKioqKioqIFdBSVRJTkcgRk9SIFNFUlZFUiBUTyBTVEFSVCIKK3doaWxlIFsgISBgd2dldCAtcSAtLXNlcnZlci1yZXNwb25zZSAtLW5vLXByb3h5IGh0dHA6Ly9sb2NhbGhvc3Q6NzAwMSAyPiYxIHwgYXdrICcvXiAgSFRUUC97cHJpbnQgJDJ9J2AgXTsgZG8KKyAgc2xlZXAgNQorICBlY2hvICIqIgorZG9uZQorZWNobyAiKioqKioqKiogU0VSVkVSIElTIFJFQURZIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9zdG9wLnNoIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9zdG9wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNzY5MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyL3N0b3Auc2gKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworVEFSR0VUPSRQV0QvdGFyZ2V0CitQSURfRklMRT0kVEFSR0VUL3dscy5waWQKKworaWYgdGVzdCAtZiAkUElEX0ZJTEU7IHRoZW4KKyAgICBraWxsIC05IGBjYXQgJFBJRF9GSUxFYAorICAgIHJtICRQSURfRklMRQorZmkKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRjNGQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9wb20ueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2U8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5ydW5uZXJzPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UtcnVubmVyczwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgUGVyZm9ybWFuY2UgdGVzdCBydW5uZXJzLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktZ3JpenpseS1ydW5uZXI8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2Fzc2VtYmxpZXMvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvYXNzZW1ibGllcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDJjNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2Fzc2VtYmxpZXMvcG9tLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmFzc2VtYmxpZXM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1hc3NlbWJsaWVzPC9uYW1lPgorICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgcGVyZm9ybWFuY2UgdGVzdC1jYXNlcyBzaGFyZWQgYXNzZW1ibHkgdHlwZXMuPC9kZXNjcmlwdGlvbj4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3dhci54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvd2FyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2NjNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3dhci54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXNzZW1ibHkgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgorICAgIDxpZD53YXI8L2lkPgorICAgIDxmb3JtYXRzPgorICAgICAgICA8Zm9ybWF0PndhcjwvZm9ybWF0PgorICAgIDwvZm9ybWF0cz4KKyAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICAgIDxkZXBlbmRlbmN5U2V0cz4KKyAgICAgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9XRUItSU5GL2xpYjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+CisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgICA8L2RlcGVuZGVuY3lTZXRzPgorICAgIDxmaWxlU2V0cz4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3dlYmFwcDwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICA8L2ZpbGVTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvYXNzZW1ibGllcy9zcmMvbWFpbi9yZXNvdXJjZXMvYXNzZW1ibGllcy96aXAtd2l0aC1qYXJzLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvYXNzZW1ibGllcy9zcmMvbWFpbi9yZXNvdXJjZXMvYXNzZW1ibGllcy96aXAtd2l0aC1qYXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjVmOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3ppcC13aXRoLWphcnMueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGFzc2VtYmx5IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KKyAgICA8aWQ+emlwLXdpdGgtamFyczwvaWQ+CisgICAgPGZvcm1hdHM+CisgICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgICAgPC9mb3JtYXRzPgorICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisgICAgPGRlcGVuZGVuY3lTZXRzPgorICAgICAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+CisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgICA8L2RlcGVuZGVuY3lTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzIwOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9wb20ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZmlsdGVyLWR5bmFtaWM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1maWx0ZXItZHluYW1pYy10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0R5bmFtaWNGaWx0ZXJGZWF0dXJlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY0ZpbHRlckZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTM5MTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0R5bmFtaWNGaWx0ZXJGZWF0dXJlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZHluYW1pYzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisKKy8qKgorICogRHluYW1pYyBmZWF0dXJlIHRvIHJlZ2lzdGVyIGN1c3RvbSBmaWx0ZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRHluYW1pY0ZpbHRlckZlYXR1cmUgaW1wbGVtZW50cyBEeW5hbWljRmVhdHVyZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbywgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoRHluYW1pY2FsbHlCb3VuZEZpbHRlclJlc291cmNlLmNsYXNzID09IHJlc291cmNlSW5mby5nZXRSZXNvdXJjZUNsYXNzKCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRHluYW1pY2FsbHlCb3VuZEZpbHRlci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEZpbHRlci5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0R5bmFtaWNhbGx5Qm91bmRGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2RhNTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0R5bmFtaWNhbGx5Qm91bmRGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5keW5hbWljOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQ3VzdG9tIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBEeW5hbWljYWxseUJvdW5kRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIkRZTl9NQVRDSF9JTiIuZ2V0Qnl0ZXMoKSksCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEVudGl0eVN0cmVhbSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXNwb25zZUNvbnRleHQuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoIiIgKyByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkgKyAiRFlOX01BVENIX09VVCIsIG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0R5bmFtaWNhbGx5Qm91bmRGaWx0ZXJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0R5bmFtaWNhbGx5Qm91bmRGaWx0ZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNjQ3YzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEZpbHRlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZHluYW1pYzsKKworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CisKKy8qKgorICogRmlsdGVyZWQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorcHVibGljIGNsYXNzIER5bmFtaWNhbGx5Qm91bmRGaWx0ZXJSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInRleHQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZHluYW1pYy9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjhjMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmR5bmFtaWM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUZXN0IGNhc2UgSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0FwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gQVBQX0NMQVNTRVMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKXsKKyAgICAgICAgeworICAgICAgICAgYWRkKER5bmFtaWNhbGx5Qm91bmRGaWx0ZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICBhZGQoRHluYW1pY0ZpbHRlckZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjNTNmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSBodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18xLnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZHluYW1pYy5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMxMDkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5keW5hbWljOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgaW50ZXJjZXB0ZWQgdGV4dCBwbGFpbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dERZTl9NQVRDSF9PVVQiLCBnZXRSZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gdGVzdERhdGEgPSBuZXcgU3RyaW5nW10geyJvbmUiLCAidHdvIiwgInRocmVlIiB9OworICAgICAgICBmb3IgKFN0cmluZyBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQob3JpZ2luYWwpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEWU5fTUFUQ0hfSU4iICsgb3JpZ2luYWwgKyAiRFlOX01BVENIX09VVCIsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgidGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFjMDBlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9wb20ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZmlsdGVyLWdsb2JhbDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLWZpbHRlci1nbG9iYWwtdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9nbG9iYWwvR2xvYmFsRmlsdGVyLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL0dsb2JhbEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDQ0ODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL0dsb2JhbEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmdsb2JhbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEdsb2JhbCBjdXN0b20gZmlsdGVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEdsb2JhbEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0Lmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRFbnRpdHlTdHJlYW0obmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJQUkVfTUFUQ0hfSU4iLmdldEJ5dGVzKCkpLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRFbnRpdHlTdHJlYW0oKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5KCIiICsgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpICsgIlBSRV9NQVRDSF9PVVQiLCBudWxsLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9nbG9iYWwvSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2dsb2JhbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlYjA3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9nbG9iYWwvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmdsb2JhbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICBhZGQoVGV4dEVudGl0eVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgIGFkZChHbG9iYWxGaWx0ZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL1RleHRFbnRpdHlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2dsb2JhbC9UZXh0RW50aXR5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTFjZTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2dsb2JhbC9UZXh0RW50aXR5UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5nbG9iYWw7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorcHVibGljIGNsYXNzIFRleHRFbnRpdHlSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInRleHQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyMzczYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5nbG9iYWwuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2dsb2JhbC9GaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZlNWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2dsb2JhbC9GaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZ2xvYmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgaW50ZXJjZXB0ZWQgdGV4dCBwbGFpbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dFBSRV9NQVRDSF9PVVQiLCBnZXRSZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gdGVzdERhdGEgPSBuZXcgU3RyaW5nW10geyJvbmUiLCAidHdvIiwgInRocmVlIiB9OworICAgICAgICBmb3IgKFN0cmluZyBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQob3JpZ2luYWwpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQUkVfTUFUQ0hfSU4iICsgb3JpZ2luYWwgKyAiUFJFX01BVENIX09VVCIsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgidGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjc3MzlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9wb20ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZmlsdGVyLW5hbWU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1maWx0ZXItbmFtZS10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL0ZpbHRlcmVkLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvRmlsdGVyZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI4YjYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL0ZpbHRlcmVkLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIubmFtZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworCisvKioKKyAqIEN1c3RvbSBiaW5kaW5nIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQE5hbWVCaW5kaW5nCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorcHVibGljIEBpbnRlcmZhY2UgRmlsdGVyZWQge30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMWVjYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLm5hbWU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUZXN0IGNhc2UgSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0FwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gQVBQX0NMQVNTRVMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKXsKKyAgICAgICAgeworICAgICAgICAgYWRkKE5hbWVCb3VuZEZpbHRlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgIGFkZChOYW1lQm91bmRGaWx0ZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvTmFtZUJvdW5kRmlsdGVyLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvTmFtZUJvdW5kRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwNGM2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9OYW1lQm91bmRGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5uYW1lOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQ3VzdG9tIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BGaWx0ZXJlZAorcHVibGljIGNsYXNzIE5hbWVCb3VuZEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0Lmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRFbnRpdHlTdHJlYW0obmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJOQU1fTUFUQ0hfSU4iLmdldEJ5dGVzKCkpLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRFbnRpdHlTdHJlYW0oKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5KCIiICsgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpICsgIk5BTV9NQVRDSF9PVVQiLCBudWxsLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9OYW1lQm91bmRGaWx0ZXJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL05hbWVCb3VuZEZpbHRlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjNDlhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9OYW1lQm91bmRGaWx0ZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLm5hbWU7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIEZpbHRlcmVkIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK0BGaWx0ZXJlZAorcHVibGljIGNsYXNzIE5hbWVCb3VuZEZpbHRlclJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBlY2hvKGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAidGV4dCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTQxMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLm5hbWUuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL0ZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9GaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2ZDBhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9GaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIubmFtZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgZm9yIGludGVyY2VwdGVkIHRleHQgcGxhaW4gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEZpbHRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdldFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHROQU1fTUFUQ0hfT1VUIiwgZ2V0UmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRlc3REYXRhID0gbmV3IFN0cmluZ1tdIHsib25lIiwgInR3byIsICJ0aHJlZSIgfTsKKyAgICAgICAgZm9yIChTdHJpbmcgb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KG9yaWdpbmFsKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTkFNX01BVENIX0lOIiArIG9yaWdpbmFsICsgIk5BTV9NQVRDSF9PVVQiLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoInRleHQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHB1dFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NjJlMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvcG9tLnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmludGVyY2VwdG9yLWR5bmFtaWM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1pbnRlcmNlcHRvci1keW5hbWljLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9keW5hbWljL0R5bmFtaWNJbnRlcmNlcHRvckZlYXR1cmUuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvRHluYW1pY0ludGVyY2VwdG9yRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDNiMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9keW5hbWljL0R5bmFtaWNJbnRlcmNlcHRvckZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmR5bmFtaWM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBDdXN0b20gZmVhdHVyZSB0byByZWdpc3RlciBpbnRlcmNlcHRvci4KKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIER5bmFtaWNJbnRlcmNlcHRvckZlYXR1cmUgaW1wbGVtZW50cyBEeW5hbWljRmVhdHVyZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbywgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoRHluYW1pY2FsbHlCb3VuZEludGVyY2VwdG9yUmVzb3VyY2UuY2xhc3MgPT0gcmVzb3VyY2VJbmZvLmdldFJlc291cmNlQ2xhc3MoKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihEeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9EeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlMTEzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBDdXN0b20gaW50ZXJjZXB0b3IuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRHluYW1pY2FsbHlCb3VuZEludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IsIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiUkVBRCAiLmdldEJ5dGVzKCkpLCBjb250ZXh0LmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgIGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoIldSSVRFICIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEludGVyY2VwdG9yUmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEludGVyY2VwdG9yUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTlkNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9EeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3JSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZHluYW1pYzsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIEludGVyY2VwdGVkIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK3B1YmxpYyBjbGFzcyBEeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3JSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInRleHQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxZDJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZHluYW1pYzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICBhZGQoRHluYW1pY2FsbHlCb3VuZEludGVyY2VwdG9yUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgYWRkKER5bmFtaWNJbnRlcmNlcHRvckZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2VkOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSBodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18xLnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljLkpheFJzQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvSW50ZXJjZXB0b3JUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9keW5hbWljL0ludGVyY2VwdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzE3NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9keW5hbWljL0ludGVyY2VwdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZHluYW1pYzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgZm9yIGludGVyY2VwdGVkIHRleHQgcGxhaW4gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEludGVyY2VwdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiV1JJVEUgdGV4dCIsIGdldFJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSB0ZXN0RGF0YSA9IG5ldyBTdHJpbmdbXSB7Im9uZSIsICJ0d28iLCAidGhyZWUiIH07CisgICAgICAgIGZvciAoU3RyaW5nIG9yaWdpbmFsIDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwb3N0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChvcmlnaW5hbCksIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldSSVRFIFJFQUQgIiArIG9yaWdpbmFsLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoInRleHQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHB1dFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjRkZDAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvcG9tLnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmludGVyY2VwdG9yLWdsb2JhbDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLWludGVyY2VwdG9yLWdsb2JhbC10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvQ3VzdG9tSW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZ2xvYmFsL0N1c3RvbUludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkMWJiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZ2xvYmFsL0N1c3RvbUludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5nbG9iYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEN1c3RvbSBpbnRlcmNlcHRvci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBDdXN0b21JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yLCBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRJbnB1dFN0cmVhbShuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIlJFQUQgIi5nZXRCeXRlcygpKSwgY29udGV4dC5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICBjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpLndyaXRlKCJXUklURSAiLmdldEJ5dGVzKCkpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2dsb2JhbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2dsb2JhbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNzMwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZ2xvYmFsL0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmdsb2JhbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICBhZGQoVGV4dEVudGl0eVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgIGFkZChDdXN0b21JbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZ2xvYmFsL1RleHRFbnRpdHlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvVGV4dEVudGl0eVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiNTcxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZ2xvYmFsL1RleHRFbnRpdHlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZ2xvYmFsOworCisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK3B1YmxpYyBjbGFzcyBUZXh0RW50aXR5UmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgQFBVVAorICAgIHB1YmxpYyB2b2lkIHB1dChmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJ0ZXh0IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY0Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSBodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18xLnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5nbG9iYWwuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvSW50ZXJjZXB0b3JUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2dsb2JhbC9JbnRlcmNlcHRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjAwNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvSW50ZXJjZXB0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5nbG9iYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBpbnRlcmNlcHRlZCB0ZXh0IHBsYWluIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcmNlcHRvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdldFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldSSVRFIHRleHQiLCBnZXRSZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gdGVzdERhdGEgPSBuZXcgU3RyaW5nW10geyJvbmUiLCAidHdvIiwgInRocmVlIiB9OworICAgICAgICBmb3IgKFN0cmluZyBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQob3JpZ2luYWwpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXUklURSBSRUFEICIgKyBvcmlnaW5hbCwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCJ0ZXh0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDhmZWNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5pbnRlcmNlcHRvci1uYW1lPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UtaW50ZXJjZXB0b3ItbmFtZS10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9JbnRlcmNlcHRlZC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9JbnRlcmNlcHRlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODVhMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL0ludGVyY2VwdGVkLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5uYW1lOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CisKKworLyoqCisgKiBDdXN0b20gYW5ub3RhdGlvbiB0byBiaW5kIGludGVyY2VwdG9yLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BOYW1lQmluZGluZworQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKK3B1YmxpYyBAaW50ZXJmYWNlIEludGVyY2VwdGVkIHt9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL0ludGVyY2VwdGVkQnlOYW1lUmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvSW50ZXJjZXB0ZWRCeU5hbWVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmMzNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL0ludGVyY2VwdGVkQnlOYW1lUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLm5hbWU7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQEludGVyY2VwdGVkCitwdWJsaWMgY2xhc3MgSW50ZXJjZXB0ZWRCeU5hbWVSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInRleHQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxMzM0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IubmFtZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICBhZGQoSW50ZXJjZXB0ZWRCeU5hbWVSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICBhZGQoTmFtZUJvdW5kSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL05hbWVCb3VuZEludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL05hbWVCb3VuZEludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxNzgxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvTmFtZUJvdW5kSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLm5hbWU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEN1c3RvbSBpbnRlcmNlcHRvci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BJbnRlcmNlcHRlZAorcHVibGljIGNsYXNzIE5hbWVCb3VuZEludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IsIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiUkVBRCAiLmdldEJ5dGVzKCkpLCBjb250ZXh0LmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgIGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoIldSSVRFICIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmYTQzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLm5hbWUuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9JbnRlcmNlcHRvclRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvSW50ZXJjZXB0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjNTIxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvSW50ZXJjZXB0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5uYW1lOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgaW50ZXJjZXB0ZWQgdGV4dCBwbGFpbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSW50ZXJjZXB0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBnZXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXUklURSB0ZXh0IiwgZ2V0UmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRlc3REYXRhID0gbmV3IFN0cmluZ1tdIHsib25lIiwgInR3byIsICJ0aHJlZSIgfTsKKyAgICAgICAgZm9yIChTdHJpbmcgb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KG9yaWdpbmFsKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV1JJVEUgUkVBRCAiICsgb3JpZ2luYWwsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgidGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3N2U0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9wb20ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jdXN0b20tcHJvdmlkZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1jdXN0b20tcHJvdmlkZXItdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2NTI5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmN1c3RvbTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICBhZGQoUGVyc29uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgYWRkKFBlcnNvblByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQVBQX0NMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vUGVyc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1ZGJiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vUGVyc29uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuY3VzdG9tOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogVGVzdCBkYXRhIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBlcnNvbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgcHVibGljIGludCBhZ2U7CisgICAgcHVibGljIFN0cmluZyBhZGRyZXNzOworCisgICAgcHVibGljIFBlcnNvbihTdHJpbmcgbmFtZSwgaW50IGFnZSwgU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5hZ2UgPSBhZ2U7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIFBlcnNvbigpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyBPYmplY3RzLmhhc2hDb2RlKHRoaXMubmFtZSk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyB0aGlzLmFnZTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIE9iamVjdHMuaGFzaENvZGUodGhpcy5hZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBQZXJzb24gb3RoZXIgPSAoUGVyc29uKSBvYmo7CisgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHModGhpcy5uYW1lLCBvdGhlci5uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmFnZSAhPSBvdGhlci5hZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKE9iamVjdHMuZXF1YWxzKHRoaXMuYWRkcmVzcywgb3RoZXIuYWRkcmVzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vUGVyc29uUHJvdmlkZXIuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vUGVyc29uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTI5Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmN1c3RvbTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCisvKioKKyAqIEN1c3RvbSBtZXNzYWdlIGJvZHkgd29ya2VyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm9kdWNlcygiYXBwbGljYXRpb24vcGVyc29uIikKK0BDb25zdW1lcygiYXBwbGljYXRpb24vcGVyc29uIikKK3B1YmxpYyBjbGFzcyBQZXJzb25Qcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFBlcnNvbj4sIE1lc3NhZ2VCb2R5UmVhZGVyPFBlcnNvbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSB0eXBlMSwgQW5ub3RhdGlvbltdIGFudG5zLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gUGVyc29uLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoUGVyc29uIHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgdHlwZTEsIEFubm90YXRpb25bXSBhbnRucywgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIHJldHVybiBnZXRCeXRlUmVwcmVzZW50YXRpb24odCkubGVuZ3RoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oUGVyc29uIHQsCisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbnRucywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBtbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBvdXQud3JpdGUoZ2V0Qnl0ZVJlcHJlc2VudGF0aW9uKHQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgdHlwZTEsIEFubm90YXRpb25bXSBhbnRucywgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIHJldHVybiB0eXBlID09IFBlcnNvbi5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGVyc29uIHJlYWRGcm9tKENsYXNzPFBlcnNvbj4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW50bnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFBlcnNvbiByZXN1bHQgPSBuZXcgUGVyc29uKCk7CisKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZUxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKyAgICAgICAgcmVzdWx0Lm5hbWUgPSBuYW1lTGluZS5zdWJzdHJpbmcobmFtZUxpbmUuaW5kZXhPZigiOiAiKSArIDIpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWdlTGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICByZXN1bHQuYWdlID0gSW50ZWdlci5wYXJzZUludChhZ2VMaW5lLnN1YnN0cmluZyhhZ2VMaW5lLmluZGV4T2YoIjogIikgKyAyKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhZGRyZXNzTGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICByZXN1bHQuYWRkcmVzcyA9IGFkZHJlc3NMaW5lLnN1YnN0cmluZyhhZGRyZXNzTGluZS5pbmRleE9mKCI6ICIpICsgMik7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJ5dGVbXSBnZXRCeXRlUmVwcmVzZW50YXRpb24oUGVyc29uIHQpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIm5hbWU6ICVzXG5hZ2U6ICVkXG5hZGRyZXNzOiAlcyIsIHQubmFtZSwgdC5hZ2UsIHQuYWRkcmVzcykuZ2V0Qnl0ZXMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvY3VzdG9tL1BlcnNvblJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvY3VzdG9tL1BlcnNvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxOTZjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vUGVyc29uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5jdXN0b207CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKKworLyoqCisgKiBQZXJzb24gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9wZXJzb24iKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9wZXJzb24iKQorcHVibGljIGNsYXNzIFBlcnNvblJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFBlcnNvbiBlY2hvKGZpbmFsIFBlcnNvbiBwZXJzb24pIHsKKyAgICAgICAgcmV0dXJuIHBlcnNvbjsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFBlcnNvbiB0ZXh0KSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBQZXJzb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IFBlcnNvbigiTW96YXJ0IiwgMjEsICJTYWx6YnVyZyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyYzg0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5jdXN0b20uSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb25FbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvY3VzdG9tL1BlcnNvbkVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWFhZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb25FbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuY3VzdG9tOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGZvciBqc29uIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzb25FbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoUGVyc29uUHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uIGdldFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChQZXJzb24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1vemFydCIsIGdldFJlc3BvbnNlLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjEsIGdldFJlc3BvbnNlLmFnZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2FsemJ1cmciLCBnZXRSZXNwb25zZS5hZGRyZXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBQZXJzb25bXSB0ZXN0RGF0YSA9IG5ldyBQZXJzb25bXSB7bmV3IFBlcnNvbigiSm9zZXBoIiwgMjMsICJOYXphcmV0aCIpLCBuZXcgUGVyc29uKCJNYXJ5IiwgMTgsICJOYXphcmV0aCIpfTsKKyAgICAgICAgZm9yIChQZXJzb24gb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgUGVyc29uIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkob3JpZ2luYWwsICJhcHBsaWNhdGlvbi9wZXJzb24iKSwgUGVyc29uLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbCwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucHV0KEVudGl0eS5lbnRpdHkobmV3IFBlcnNvbigiSnVsZXMiLCAxMiwgIlBhcmlzIiksICJhcHBsaWNhdGlvbi9wZXJzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHB1dFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjFiMjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+anNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UtanNvbi1qYWNrc29uLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1NzA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICBhZGQoSnNvbkVudGl0eVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgIGFkZChKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pzb25FbnRpdHlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NTI5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pzb25FbnRpdHlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorcHVibGljIGNsYXNzIEpzb25FbnRpdHlSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBQZXJzb24gZWNobyhmaW5hbCBQZXJzb24gcGVyc29uKSB7CisgICAgICAgIHJldHVybiBwZXJzb247CisgICAgfQorCisgICAgQFBVVAorICAgIHB1YmxpYyB2b2lkIHB1dChmaW5hbCBQZXJzb24gcGVyc29uKSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBQZXJzb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IFBlcnNvbigiV29sZmdhbmciLCAyMSwgIlNhbHpidXJnIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vUGVyc29uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9QZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2FmMmIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vUGVyc29uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIFRlc3QgZGF0YSBiZWFuLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzb24geworCisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBpbnQgYWdlOworICAgIHB1YmxpYyBTdHJpbmcgYWRkcmVzczsKKworICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIGludCBhZ2UsIFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuYWdlID0gYWdlOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzb24oKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLm5hbWUpOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgdGhpcy5hZ2U7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyBPYmplY3RzLmhhc2hDb2RlKHRoaXMuYWRkcmVzcyk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUGVyc29uIG90aGVyID0gKFBlcnNvbikgb2JqOworICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKHRoaXMubmFtZSwgb3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5hZ2UgIT0gb3RoZXIuYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChPYmplY3RzLmVxdWFscyh0aGlzLmFkZHJlc3MsIG90aGVyLmFkZHJlc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZWVhNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSBodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18xLnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbi5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9Kc29uRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTI1ZGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgZm9yIGpzb24gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpzb25FbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uIGdldFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChQZXJzb24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldvbGZnYW5nIiwgZ2V0UmVzcG9uc2UubmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMSwgZ2V0UmVzcG9uc2UuYWdlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTYWx6YnVyZyIsIGdldFJlc3BvbnNlLmFkZHJlc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFBlcnNvbltdIHRlc3REYXRhID0gbmV3IFBlcnNvbltdIHtuZXcgUGVyc29uKCJKb3NlcGgiLCAyMywgIk5hemFyZXRoIiksIG5ldyBQZXJzb24oIk1hcnkiLCAxOCwgIk5hemFyZXRoIikgfTsKKyAgICAgICAgZm9yIChQZXJzb24gb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgUGVyc29uIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5qc29uKG9yaWdpbmFsKSwgUGVyc29uLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbCwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5qc29uKG5ldyBQZXJzb24oIkp1bGVzIiwgMTIsICJQYXJpcyIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHB1dFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDgyNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvcG9tLnhtbApAQCAtMCwwICsxLDYxIEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+anNvbi1tb3h5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UtanNvbi1tb3h5LXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmOTZkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworCisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCl7CisgICAgICAgIHsKKyAgICAgICAgIGFkZChKc29uRW50aXR5UmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgYWRkKE1veHlKc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pzb25FbnRpdHlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhZmMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pzb25FbnRpdHlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKK3B1YmxpYyBjbGFzcyBKc29uRW50aXR5UmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgUGVyc29uIGVjaG8oZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgICAgICByZXR1cm4gcGVyc29uOworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgUGVyc29uIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQZXJzb24oIldvbGZnYW5nIiwgMjEsICJTYWx6YnVyZyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL1BlcnNvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vUGVyc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhZjJiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL1BlcnNvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworLyoqCisgKiBUZXN0IGRhdGEgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGVyc29uIHsKKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgaW50IGFnZTsKKyAgICBwdWJsaWMgU3RyaW5nIGFkZHJlc3M7CisKKyAgICBwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBpbnQgYWdlLCBTdHJpbmcgYWRkcmVzcykgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmFnZSA9IGFnZTsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc29uKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIE9iamVjdHMuaGFzaENvZGUodGhpcy5uYW1lKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIHRoaXMuYWdlOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLmFkZHJlc3MpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBlcnNvbiBvdGhlciA9IChQZXJzb24pIG9iajsKKyAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyh0aGlzLm5hbWUsIG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYWdlICE9IG90aGVyLmFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoT2JqZWN0cy5lcXVhbHModGhpcy5hZGRyZXNzLCBvdGhlci5hZGRyZXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGVlYTZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb24uSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pzb25FbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmMmM0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pzb25FbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBqc29uIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uRW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE1veHlKc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBQZXJzb24gZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFBlcnNvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiV29sZmdhbmciLCBnZXRSZXNwb25zZS5uYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIxLCBnZXRSZXNwb25zZS5hZ2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNhbHpidXJnIiwgZ2V0UmVzcG9uc2UuYWRkcmVzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uW10gdGVzdERhdGEgPSBuZXcgUGVyc29uW10ge25ldyBQZXJzb24oIkpvc2VwaCIsIDIzLCAiTmF6YXJldGgiKSwgbmV3IFBlcnNvbigiTWFyeSIsIDE4LCAiTmF6YXJldGgiKSB9OworICAgICAgICBmb3IgKFBlcnNvbiBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBQZXJzb24gcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5Lmpzb24ob3JpZ2luYWwpLCBQZXJzb24uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5Lmpzb24obmV3IFBlcnNvbigiSnVsZXMiLCAxMiwgIlBhcmlzIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Q4OWMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9wb20ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5tYncta3J5bzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLW1idy1rcnlvLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEta3J5bzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2tyeW8vSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmVlZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5rcnlvOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgYWRkKFBlcnNvblJlc291cmNlLmNsYXNzKTsKKyAgICB9fTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncva3J5by9QZXJzb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncva3J5by9QZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGM4ZDllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL1BlcnNvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmtyeW87CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworLyoqCisgKiBUZXN0IGRhdGEgYmVhbi4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGVyc29uIHsKKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgaW50IGFnZTsKKyAgICBwdWJsaWMgU3RyaW5nIGFkZHJlc3M7CisKKyAgICBwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBpbnQgYWdlLCBTdHJpbmcgYWRkcmVzcykgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmFnZSA9IGFnZTsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc29uKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIE9iamVjdHMuaGFzaENvZGUodGhpcy5uYW1lKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIHRoaXMuYWdlOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLmFkZHJlc3MpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBlcnNvbiBvdGhlciA9IChQZXJzb24pIG9iajsKKyAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyh0aGlzLm5hbWUsIG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYWdlICE9IG90aGVyLmFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoT2JqZWN0cy5lcXVhbHModGhpcy5hZGRyZXNzLCBvdGhlci5hZGRyZXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL1BlcnNvblJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2tyeW8vUGVyc29uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDY1MzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL1BlcnNvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncua3J5bzsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LWtyeW8iKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94LWtyeW8iKQorcHVibGljIGNsYXNzIFBlcnNvblJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFBlcnNvbiBlY2hvKGZpbmFsIFBlcnNvbiBwZXJzb24pIHsKKyAgICAgICAgcmV0dXJuIHBlcnNvbjsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFBlcnNvbiBwZXJzb24pIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFBlcnNvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVyc29uKCJXb2xmZ2FuZyIsIDIxLCAiU2FsemJ1cmciKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODc1YjcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5rcnlvLkpheFJzQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncva3J5by9QZXJzb25SZXNvdXJjZVRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncva3J5by9QZXJzb25SZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjAzZThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL1BlcnNvblJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmtyeW87CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgZm9yIGtyeW8gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBlcnNvblJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFBlcnNvbiBnZXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoUGVyc29uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXb2xmZ2FuZyIsIGdldFJlc3BvbnNlLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjEsIGdldFJlc3BvbnNlLmFnZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2FsemJ1cmciLCBnZXRSZXNwb25zZS5hZGRyZXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBQZXJzb25bXSB0ZXN0RGF0YSA9IG5ldyBQZXJzb25bXSB7bmV3IFBlcnNvbigiSm9zZXBoIiwgMjMsICJOYXphcmV0aCIpLCBuZXcgUGVyc29uKCJNYXJ5IiwgMTgsICJOYXphcmV0aCIpfTsKKyAgICAgICAgZm9yIChQZXJzb24gb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgUGVyc29uIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG9yaWdpbmFsLCAiYXBwbGljYXRpb24veC1rcnlvIiksIFBlcnNvbi5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KG5ldyBQZXJzb24oIkp1bGVzIiwgMTIsICJQYXJpcyIpLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LWtyeW8iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHB1dFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTdkNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9wb20ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD50ZXh0LXBsYWluPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UtdGV4dC1wbGFpbi10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvdGV4dC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2NTFlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvdGV4dC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncudGV4dDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgIGFkZChUZXh0RW50aXR5UmVzb3VyY2UuY2xhc3MpOworICAgIH19OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvdGV4dC9UZXh0RW50aXR5UmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvdGV4dC9UZXh0RW50aXR5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWFmNzJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L1RleHRFbnRpdHlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnRleHQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorcHVibGljIGNsYXNzIFRleHRFbnRpdHlSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInRleHQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDc2OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy50ZXh0LkpheFJzQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvdGV4dC9UZXh0RW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L1RleHRFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2ZWNiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXRleHQtcGxhaW4vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvdGV4dC9UZXh0RW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnRleHQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGZvciB0ZXh0IHBsYWluIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXh0RW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIGdldFJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSB0ZXN0RGF0YSA9IG5ldyBTdHJpbmdbXSB7Im9uZSIsICJ0d28iLCAidGhyZWUiIH07CisgICAgICAgIGZvciAoU3RyaW5nIG9yaWdpbmFsIDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwb3N0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChvcmlnaW5hbCksIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgidGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDQ0NzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9wb20ueG1sCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD54bWwtamF4YjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLXhtbC1qYXhiLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNDdlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgYWRkKFhtbEVudGl0eVJlc291cmNlLmNsYXNzKTsKKyAgICB9fTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvUGVyc29uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvUGVyc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5ZjZmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9QZXJzb24uamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogVGVzdCBkYXRhIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgUGVyc29uIHsKKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgaW50IGFnZTsKKyAgICBwdWJsaWMgU3RyaW5nIGFkZHJlc3M7CisKKyAgICBwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBpbnQgYWdlLCBTdHJpbmcgYWRkcmVzcykgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmFnZSA9IGFnZTsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc29uKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIE9iamVjdHMuaGFzaENvZGUodGhpcy5uYW1lKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIHRoaXMuYWdlOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLmFkZHJlc3MpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBlcnNvbiBvdGhlciA9IChQZXJzb24pIG9iajsKKyAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyh0aGlzLm5hbWUsIG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYWdlICE9IG90aGVyLmFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoT2JqZWN0cy5lcXVhbHModGhpcy5hZGRyZXNzLCBvdGhlci5hZGRyZXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1htbEVudGl0eVJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY2MjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1htbEVudGl0eVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sOworCisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCitwdWJsaWMgY2xhc3MgWG1sRW50aXR5UmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgUGVyc29uIGVjaG8oZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgICAgICByZXR1cm4gcGVyc29uOworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgUGVyc29uIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQZXJzb24oIldvbGZnYW5nIiwgMjEsICJTYWx6YnVyZyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODAwMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWwuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1htbEVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9YbWxFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4MjkwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9YbWxFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgWE1MIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxFbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFBlcnNvbiBnZXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoUGVyc29uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXb2xmZ2FuZyIsIGdldFJlc3BvbnNlLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjEsIGdldFJlc3BvbnNlLmFnZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2FsemJ1cmciLCBnZXRSZXNwb25zZS5hZGRyZXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBQZXJzb25bXSB0ZXN0RGF0YSA9IG5ldyBQZXJzb25bXSB7bmV3IFBlcnNvbigiSm9zZXBoIiwgMjMsICJOYXphcmV0aCIpLCBuZXcgUGVyc29uKCJNYXJ5IiwgMTgsICJOYXphcmV0aCIpIH07CisgICAgICAgIGZvciAoUGVyc29uIG9yaWdpbmFsIDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFBlcnNvbiBwb3N0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkueG1sKG9yaWdpbmFsKSwgUGVyc29uLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbCwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS54bWwobmV3IFBlcnNvbigiSnVsZXMiLCAxMiwgIlBhcmlzIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNDBiODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9wb20ueG1sCkBAIC0wLDAgKzEsNjAgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD54bWwtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLXhtbC1tb3h5LXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlNTFiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5LnhtbC5Nb3h5WG1sRmVhdHVyZTsKKworLyoqCisgKiBUZXN0IGNhc2UgSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0FwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gQVBQX0NMQVNTRVMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKXsKKyAgICAgICAgeworICAgICAgICAgICAgYWRkKFhtbEVudGl0eVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChNb3h5WG1sRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9QZXJzb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9QZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTA5YWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1BlcnNvbi5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbDsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogVGVzdCBkYXRhIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgUGVyc29uIHsKKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgaW50IGFnZTsKKyAgICBwdWJsaWMgU3RyaW5nIGFkZHJlc3M7CisKKyAgICBwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBpbnQgYWdlLCBTdHJpbmcgYWRkcmVzcykgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmFnZSA9IGFnZTsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc29uKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIE9iamVjdHMuaGFzaENvZGUodGhpcy5uYW1lKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIHRoaXMuYWdlOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLmFkZHJlc3MpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBlcnNvbiBvdGhlciA9IChQZXJzb24pIG9iajsKKyAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyh0aGlzLm5hbWUsIG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYWdlICE9IG90aGVyLmFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoT2JqZWN0cy5lcXVhbHModGhpcy5hZGRyZXNzLCBvdGhlci5hZGRyZXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1htbEVudGl0eVJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhhYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1htbEVudGl0eVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sOworCisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCitwdWJsaWMgY2xhc3MgWG1sRW50aXR5UmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgUGVyc29uIGVjaG8oZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgICAgICByZXR1cm4gcGVyc29uOworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgUGVyc29uIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc29uKCJXb2xmZ2FuZyIsIDIxLCAiU2FsemJ1cmciKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTgwMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSBodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18xLnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sLkpheFJzQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9YbWxFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYWJjODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5LnhtbC5Nb3h5WG1sRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgWE1MIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxFbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTW94eVhtbEZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uIGdldFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChQZXJzb24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldvbGZnYW5nIiwgZ2V0UmVzcG9uc2UubmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMSwgZ2V0UmVzcG9uc2UuYWdlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTYWx6YnVyZyIsIGdldFJlc3BvbnNlLmFkZHJlc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFBlcnNvbltdIHRlc3REYXRhID0gbmV3IFBlcnNvbltdIHtuZXcgUGVyc29uKCJKb3NlcGgiLCAyMywgIk5hemFyZXRoIiksIG5ldyBQZXJzb24oIk1hcnkiLCAxOCwgIk5hemFyZXRoIikgfTsKKyAgICAgICAgZm9yIChQZXJzb24gb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgUGVyc29uIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS54bWwob3JpZ2luYWwpLCBQZXJzb24uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnhtbChuZXcgUGVyc29uKCJKdWxlcyIsIDEyLCAiUGFyaXMiKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3JpbmcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjE0MDRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3BvbS54bWwKQEAgLTAsMCArMSwxMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QucGVyZm9ybWFuY2UubW9uaXRvcmluZzwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5tb25pdG9yaW5nPC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+bW9uaXRvcmluZy10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20ueWFtbWVyLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjEuMjwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxhbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvZGVjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS41PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xNC4wLjE8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWpkazE0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS42LjE8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvemlwLXdpdGgtamFycy54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2UtYXNzZW1ibHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGlzIGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlIG1lcmdlcyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYXBwZW5kIHRvIHRoZSBwYWNrYWdpbmcgcGhhc2UuIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ29hbHMgPT0gbW9qb3MgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS43PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS43PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDxzaG93V2FybmluZ3M+ZmFsc2U8L3Nob3dXYXJuaW5ncz4KKyAgICAgICAgICAgICAgICAgICAgPGZvcms+ZmFsc2U8L2Zvcms+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbW9uaXRvcmluZy9KZXJzZXlBcHAuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21vbml0b3JpbmcvSmVyc2V5QXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlOTdiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21vbml0b3JpbmcvSmVyc2V5QXBwLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLio7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGNsYXNzIHRvIHN0YXJ0IHBlcmZvcm1hbmNlIHRlc3Qgd2ViIHNlcnZpY2UgYXQgaHR0cDovL2xvY2FsaG9zdDo4MDgwLyBpZiB0aGUgYmFzZSBVUkkKKyAqIGlzIG5vdCBwYXNzZWQgdmlhIHRoZSBmaXJzdCBjb21tYW5kIGxpbmUgYXJndW1lbnQuCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSCA9ICJ0ZXh0IjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKZXJzZXkgcGVyZm9ybWFuY2UgdGVzdCB3ZWIgc2VydmljZSBhcHBsaWNhdGlvbiIpOworCisgICAgICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IGFyZ3MubGVuZ3RoID4gMCA/IFVSSS5jcmVhdGUoYXJnc1swXSkgOiBCQVNFX1VSSTsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgY3JlYXRlUmVzb3VyY2VDb25maWcoKSk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLlxuVHJ5IG91dCAlcyVzXG5IaXQgQ3RybC1DIHRvIHN0b3AgaXQuLi4iLAorICAgICAgICAgICAgICAgICAgICBiYXNlVXJpLCBST09UX1BBVEgpKTsKKworICAgICAgICAgICAgd2hpbGUgKHNlcnZlci5pc1N0YXJ0ZWQoKSkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg2MDAwMDApOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZVJlc291cmNlQ29uZmlnKCkgeworICAgICAgICBmaW5hbCBTZXQ8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICByZXNvdXJjZXMuYWRkKFJlc291cmNlLmJ1aWxkZXIob3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubW9uaXRvcmluZy5SZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnBhdGgoIiIgKyBpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIHRydWUpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbW9uaXRvcmluZy9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbW9uaXRvcmluZy9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTZlYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3Jpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tb25pdG9yaW5nL1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiLyIpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJnZXQiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgic3ViIikKKyAgICBwdWJsaWMgU3RyaW5nIHN1YmdldCgpIHsKKyAgICAgICAgcmV0dXJuICJzdWItZ2V0IjsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBTdHJpbmcgcG9zdCkgeworICAgICAgICByZXR1cm4gcG9zdDsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJzdWIiKQorICAgIHB1YmxpYyBTdHJpbmcgc3VicG9zdChmaW5hbCBTdHJpbmcgcG9zdCkgeworICAgICAgICByZXR1cm4gcG9zdDsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIFN0cmluZyBwdXQoZmluYWwgU3RyaW5nIHB1dCkgeworICAgICAgICByZXR1cm4gcHV0OworICAgIH0KKworICAgIEBQVVQKKyAgICBAUGF0aCgic3ViIikKKyAgICBwdWJsaWMgU3RyaW5nIHN1YnB1dChmaW5hbCBTdHJpbmcgcHV0KSB7CisgICAgICAgIHJldHVybiBwdXQ7CisgICAgfQorCisgICAgQERFTEVURQorICAgIEBQYXRoKCJ7aWR9IikKKyAgICBwdWJsaWMgU3RyaW5nIGRlbGV0ZShmaW5hbCBTdHJpbmcgZGVsZXRlKSB7CisgICAgICAgIHJldHVybiBkZWxldGU7CisgICAgfQorCisgICAgQERFTEVURQorICAgIEBQYXRoKCJzdWIve2lkfSIpCisgICAgcHVibGljIFN0cmluZyBzdWJkZWxldGUoZmluYWwgU3RyaW5nIGRlbGV0ZSkgeworICAgICAgICByZXR1cm4gZGVsZXRlOworICAgIH0KKworICAgIEBQYXRoKCJsb2NhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3M8U3ViUmVzb3VyY2VMb2NhdG9yPiBsb2NhdG9yKCkgeworICAgICAgICByZXR1cm4gU3ViUmVzb3VyY2VMb2NhdG9yLmNsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21vbml0b3JpbmcvU3ViUmVzb3VyY2VMb2NhdG9yLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3Jpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tb25pdG9yaW5nL1N1YlJlc291cmNlTG9jYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzI5MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3Jpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tb25pdG9yaW5nL1N1YlJlc291cmNlTG9jYXRvci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFN1YlJlc291cmNlTG9jYXRvciB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBTdHJpbmcgcG9zdCkgeworICAgICAgICByZXR1cm4gcG9zdDsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIFN0cmluZyBwdXQoZmluYWwgU3RyaW5nIHB1dCkgeworICAgICAgICByZXR1cm4gcHV0OworICAgIH0KKworICAgIEBERUxFVEUKKyAgICBAUGF0aCgie2lkfSIpCisgICAgcHVibGljIFN0cmluZyBkZWxldGUoZmluYWwgU3RyaW5nIGRlbGV0ZSkgeworICAgICAgICByZXR1cm4gZGVsZXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9zdGFydC5zaCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9zdGFydC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTU0NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3N0YXJ0LnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK0xJQlM9JChmb3IgbCBpbiBgbHMgbGliYDsgZG8gZWNobyAtbiBsaWIvJGwiOiI7ZG9uZSkKK0xJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWVzJy86JC8vJ2AKKworamF2YSAtc2VydmVyIC1YbXM1MTJtIC1YbXgxMDI0bSAtWFg6UGVybVNpemU9MjU2bSAtWFg6TWF4UGVybVNpemU9NTEybSBcCisgICAgICAtWFg6K1VzZVBhcmFsbGVsR0MgLVhYOitBZ2dyZXNzaXZlT3B0cyAtWFg6K1VzZUZhc3RBY2Nlc3Nvck1ldGhvZHMgXAorICAgICAgLWNwICRMSUJTIFwKKyAgICAgIC1EamF2YS5uZXQucHJlZmVySVB2NFN0YWNrPXRydWUgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5wb3J0PTExMTEyIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGU9ZmFsc2UgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbD1mYWxzZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUubG9jYWwub25seT1mYWxzZSBcCisgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tb25pdG9yaW5nLkplcnNleUFwcCAkMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhZGRmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5wYXJhbS1zcmw8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1wYXJhbS1zcmw8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3BhcmFtLXNybC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3BhcmFtL3NybC9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3BhcmFtLXNybC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3BhcmFtL3NybC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkYzc4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcGFyYW0vc3JsL0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnBhcmFtLnNybDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgIGFkZChTcmxSZXNvdXJjZS5jbGFzcyk7CisgICAgfX07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQVBQX0NMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJhbS9zcmwvU3JsUmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcGFyYW0vc3JsL1NybFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwNmU2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcGFyYW0vc3JsL1NybFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wYXJhbS5zcmw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBTcmxSZXNvdXJjZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBTdHJpbmcgcDsKKworICAgICAgICBTdWJSZXNvdXJjZShTdHJpbmcgcCkgeworICAgICAgICAgICAgdGhpcy5wID0gcDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChATWF0cml4UGFyYW0oIm0iKSBmaW5hbCBTdHJpbmcgbSwgQFF1ZXJ5UGFyYW0oInEiKSBmaW5hbCBTdHJpbmcgcSkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInA9JXMsIG09JXMsIHE9JXMiLCBwLCBtLCBxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJzcmwve3B9IikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2UgbG9jYXRvcihAUGF0aFBhcmFtKCJwIikgU3RyaW5nIHApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZShwKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInNybS97cH0iKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldChAUGF0aFBhcmFtKCJwIikgZmluYWwgU3RyaW5nIHAsIEBNYXRyaXhQYXJhbSgibSIpIGZpbmFsIFN0cmluZyBtLCBAUXVlcnlQYXJhbSgicSIpIGZpbmFsIFN0cmluZyBxKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJwPSVzLCBtPSVzLCBxPSVzIiwgcCwgbSwgcSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyN2IzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucGFyYW0uc3JsLkpheFJzQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcGFyYW0vc3JsL1NybFNybVRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcGFyYW0vc3JsL1NybFNybVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGFkOTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJhbS9zcmwvU3JsU3JtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucGFyYW0uc3JsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGZvciBTUkwvU1JNIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTcmxTcm1UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcm1TcmwoKSB7CisgICAgICAgIFN0cmluZ1tdW10gdGVzdERhdGEgPSBuZXcgU3RyaW5nW11bXSB7CisgICAgICAgICAgICAgICAgeyJvbmUiLCAidHdvIiwgInRocmVlIn0sCisgICAgICAgICAgICAgICAgeyJmb3VyIiwgImdyZWVuIiwgInRvcCJ9LAorICAgICAgICAgICAgICAgIHsiYm90dG9tIiwgImJlYXV0eSIsICJtYXNoIn0sCisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChTdHJpbmdbXSBpbnB1dCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3JsUmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzcmwiKS5wYXRoKGlucHV0WzBdKS5tYXRyaXhQYXJhbSgibSIsIGlucHV0WzFdKS5xdWVyeVBhcmFtKCJxIiwgaW5wdXRbMl0pCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3JtUmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzcm0iKS5wYXRoKGlucHV0WzBdKS5tYXRyaXhQYXJhbSgibSIsIGlucHV0WzFdKS5xdWVyeVBhcmFtKCJxIiwgaW5wdXRbMl0pCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3JsUmVzcG9uc2UsIHNybVJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTI5MDI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wb20ueG1sCkBAIC0wLDAgKzEsOTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2U8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS10ZXN0Y2FzZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgUGVyZm9ybWFuY2UgdGVzdCBjYXNlcy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+YXNzZW1ibGllczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmZpbHRlci1keW5hbWljPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZmlsdGVyLWdsb2JhbDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmZpbHRlci1uYW1lPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aW50ZXJjZXB0b3ItZHluYW1pYzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmludGVyY2VwdG9yLWdsb2JhbDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmludGVyY2VwdG9yLW5hbWU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tYnctY3VzdG9tLXByb3ZpZGVyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWJ3LWpzb24tamFja3NvbjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1idy1qc29uLW1veHk8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tYncta3J5bzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1idy10ZXh0LXBsYWluPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWJ3LXhtbC1qYXhiPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWJ3LXhtbC1tb3h5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cGFyYW0tc3JsPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHJveHktaW5qZWN0aW9uPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb250YWlucyBzaGFyZWQgcGVyZm9ybWFuY2UgdGVzdC1jYXNlcyBhc3NlbWJseSBkZXNjcmlwdG9ycyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hc3NlbWJsaWVzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZS1hc3NlbWJseTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGlzIGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlIG1lcmdlcyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhcHBlbmQgdG8gdGhlIHBhY2thZ2luZyBwaGFzZS4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnb2FscyA9PSBtb2pvcyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhIGRlc2NyaXB0b3IgaW4gb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzOmFzc2VtYmxpZXMgbW9kdWxlIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+emlwLXdpdGgtamFyczwvZGVzY3JpcHRvclJlZj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPndhcjwvZGVzY3JpcHRvclJlZj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2NDA1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5wcm94eS1pbmplY3Rpb248L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1wcm94eS1pbmplY3Rpb24tdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcHJveHkvaW5qZWN0aW9uL0ZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwMjRmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcHJveHkvaW5qZWN0aW9uL0ZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucHJveHkuaW5qZWN0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIHRvIHRlc3QgZmllbGQgaW5qZWN0ZWQgcHJveHktYWJsZSBwYXJhbWV0ZXJzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJmaWVsZC1pbmplY3RlZCIpCitAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitwdWJsaWMgY2xhc3MgRmllbGRJbmplY3RlZFJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dDsKKyAgICBAQ29udGV4dAorICAgIFVyaUluZm8gdXJpSW5mbzsKKyAgICBAQ29udGV4dAorICAgIEh0dHBIZWFkZXJzIGh0dHBIZWFkZXJzOworICAgIEBDb250ZXh0CisgICAgUmVxdWVzdCByZXF1ZXN0OworCisgICAgQEdFVAorICAgIEBQYXRoKCJ3aXRob3V0LXBhcmFtZXRlcnMiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJzYzogJXNcbnVpOiAlc1xuaGg6ICVzXG5yZXE6ICVzIiwKKyAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHQuZ2V0Q2xhc3MoKSwgdXJpSW5mby5nZXRDbGFzcygpLCBodHRwSGVhZGVycy5nZXRDbGFzcygpLCByZXF1ZXN0LmdldENsYXNzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcHJveHkvaW5qZWN0aW9uL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcHJveHkvaW5qZWN0aW9uL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzk2YTFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucHJveHkuaW5qZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICAgICBhZGQoRmllbGRJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChNZXRob2RJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQVBQX0NMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vTWV0aG9kSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vTWV0aG9kSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmU4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Byb3h5L2luamVjdGlvbi9NZXRob2RJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wcm94eS5pbmplY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UgdG8gY29tcGFyZSByZXNvdXJjZSBtZXRob2Qgd2l0aCBhbmQgd2l0aG91dCBpbmplY3RlZCBtZXRob2QgcHJveGlhYmxlIHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm1ldGhvZC1pbmplY3RlZCIpCitAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitwdWJsaWMgY2xhc3MgTWV0aG9kSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFBhdGgoIndpdGhvdXQtcGFyYW1ldGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXROb1Byb3h5KCkgeworICAgICAgICByZXR1cm4gInRleHQiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYWxsLXBhcmFtZXRlcnMiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJveHkoQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJzYzogJXNcbnVpOiAlc1xuaGg6ICVzXG5yZXE6ICVzIiwKKyAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHQuZ2V0Q2xhc3MoKSwgdXJpSW5mby5nZXRDbGFzcygpLCBodHRwSGVhZGVycy5nZXRDbGFzcygpLCByZXF1ZXN0LmdldENsYXNzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzMzMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnByb3h5LmluamVjdGlvbi5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Byb3h5L2luamVjdGlvbi9JbmplY3RlZFJlc291cmNlc1Rlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcHJveHkvaW5qZWN0aW9uL0luamVjdGVkUmVzb3VyY2VzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOWFlYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Byb3h5L2luamVjdGlvbi9JbmplY3RlZFJlc291cmNlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnByb3h5LmluamVjdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBmb3IgZmllbGQvbWV0aG9kIGluamVjdGVkIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbmplY3RlZFJlc291cmNlc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNhbWVUeXBlc0luamVjdGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kSW5qZWN0ZWRSZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIm1ldGhvZC1pbmplY3RlZCIpLnBhdGgoImFsbC1wYXJhbWV0ZXJzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRJbmplY3RlZFJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiZmllbGQtaW5qZWN0ZWQiKS5wYXRoKCJ3aXRob3V0LXBhcmFtZXRlcnMiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXRob2RJbmplY3RlZFJlc3BvbnNlLCBmaWVsZEluamVjdGVkUmVzcG9uc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1JFQURNRS5odG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvUkVBRE1FLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0NDg0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1JFQURNRS5odG1sCkBAIC0wLDAgKzEsNzEgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhZG9jdHlwZSBodG1sPgorPGh0bWwgbGFuZz0iZW4iPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSI+CisKKyAgICA8dGl0bGU+VGVzdCBkYXRhIGdlbmVyYXRpb24gdG9vbCBmb3IgSmVyc2V5IHBlcmZvcm1hbmNlIHRlc3RzPC90aXRsZT4KKworICAgIDwhLS0gQm9vdHN0cmFwIC0tPgorICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9uZXRkbmEuYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4wLjAvY3NzL2Jvb3RzdHJhcC5taW4uY3NzIiByZWw9InN0eWxlc2hlZXQiPgorPC9oZWFkPgorPGJvZHk+CisKKzxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CisgICAgPGRpdiBjbGFzcz0icm93Ij4KKyAgICAgICAgPGRpdiBjbGFzcz0iY29sLWxnLW9mZnNldC0xIGNvbC1sZy0xMCI+CisgICAgICAgICAgICA8aGVhZGVyIGNsYXNzPSJwYWdlLWhlYWRlciI+CisgICAgICAgICAgICAgICAgPGgxPlRlc3QgZGF0YSBnZW5lcmF0aW9uIHRvb2wgZm9yIEplcnNleSBwZXJmb3JtYW5jZSB0ZXN0czwvc21hbGw+PC9oMT4KKyAgICAgICAgICAgIDwvaGVhZGVyPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICBUaGlzIG1vZHVsZSBjb250YWlucyBhIHNpbXBsZSB0b29sIHRvIGdlbmVyYXRlIGRhdGEgc2V0cyBmb3IgcGVyZm9ybWFuY2UgdGVzdGluZy4gSXQgZ2VuZXJhdGVzIHRocmVlCisgICAgICAgICAgICAgICAgZGlzdGluY3QgbWVkaWEgdHlwZXM6IHhtbCwganNvbiBhbmQgcGxhaW4gdGV4dCwgZWFjaCBpbiBhIHZhcmlldHkgb2YgcHJlZGVmaW5lZCBkYXRhIHNldCBzaXplcyAoMWtCLAorICAgICAgICAgICAgICAgIDVrQiwgMTBrQiwgMU1CIGFuZCBvcHRpb25hbGx5IDFHQikuCisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBsYXJnZXN0IGZpbGVzICgxR0IpIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgdG8gc2F2ZSBkaXNrIHNwYWNlIGFuZCBzaG9ydGVuIHRoZQorICAgICAgICAgICAgICAgIGdlbmVyYXRpb24gdGltZS4gVG8gZW5hYmxlIGl0LCBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSA8cHJlPkdFTkVSQVRFX0FMU09fR0lHQUJZVEVfREFUQVNFVFM8L3ByZT4KKyAgICAgICAgICAgIGNvbnN0YW50IGluIHRoZSA8cHJlPlRlc3REYXRhR2VuZXJhdG9yQXBwPC9wcmU+IGNsYXNzIHRvIHRydWUuCisgICAgICAgICAgICA8L3A+CisKKyAgICAgICAgICAgIDxoMj5SdW5uaW5nIHRoZSBFeGFtcGxlPC9oMj4KKworICAgICAgICAgICAgPHA+UnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6PC9wPgorICAgICAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgPHByZT5tdm4gY2xlYW4gY29tcGlsZSBleGVjOmphdmE8L3ByZT4KKyAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgWW91IGNhbiB0d2VhayB0aGUgdmFsdWVzIG9mIHNldmVyYWwgY29uc3RhbnRzIGluIHRoZSA8cHJlPlRlc3REYXRhR2VuZXJhdG9yQXBwPC9wcmU+IGNsYXNzIGJlZm9yZQorICAgICAgICAgICAgbGF1bmNoaW5nIHRoZSBnZW5lcmF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgamF2YWRvY3MuCisgICAgICAgICAgICBUaGUgYWJvdmUgY29tbWFuZCBsYXVuY2hlcyBhIEdyaXp6bHkgc2VydmVyIHdpdGggdGhlIGdlbmVyYXRpb24gc2VydmVyLXNpZGUgYXBwIGFuZCBydW5zIGEgY2xpZW50IHdpdGgKKyAgICAgICAgICAgIHByZWRlZmluZWQgcGFyYW1ldGVycyBhZ2FpbnN0IGl0LgorICAgICAgICAgICAgPC9wPgorICAgICAgICA8L2Rpdj4KKyAgICA8L2Rpdj4KKzwvZGl2PgorCis8c2NyaXB0IHNyYz0iaHR0cDovL25ldGRuYS5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjAuMC9qcy9ib290c3RyYXAubWluLmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTNhM2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9wb20ueG1sCkBAIC0wLDAgKzEsNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnBlcmZvcm1hbmNlLXRlc3QtdG9vbHM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPnBlcmZvcm1hbmNlLXRlc3QtdG9vbHM8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW1veHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzLlRlc3REYXRhR2VuZXJhdG9yQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKworICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL0NvbnN0YW50VGVzdFZhbHVlR2VuZXJhdG9yLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL0NvbnN0YW50VGVzdFZhbHVlR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhNGUxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvQ29uc3RhbnRUZXN0VmFsdWVHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMuVGVzdFZhbHVlR2VuZXJhdG9yfSBwcm9kdWNpbmcgY29uc3RhbnQgcmVzdWx0cy4KKyAqCisgKiBEdWUgdG8gaXRzIGNvbnN0YW50IG5hdHVyZSwgdGhpcyBzdHJhdGVneSBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHtAbGluayBqYXZhLnV0aWwuU2V0fS4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdGFudFRlc3RWYWx1ZUdlbmVyYXRvciBleHRlbmRzIFRlc3RWYWx1ZUdlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGludENvbnN0YW50ID0gMTIzNDU2Nzg5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBjaGFyQ29uc3RhbnQgPSAneCc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHN0cmluZ0NvbnN0YW50ID0gIkhlbGxvLCB3b3JsZCEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgbG9uZ0NvbnN0YW50ID0gOTg3NjU0MzIxTDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBmbG9hdENvbnN0YW50ID0gMy4xNDE1ZjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgZG91YmxlQ29uc3RhbnQgPSAzLjE0MTU5MjY1MzU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBieXRlQ29uc3RhbnQgPSAoYnl0ZSkgMTI3OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHNob3J0IHNob3J0Q29uc3RhbnQgPSAoc2hvcnQpIDEwMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBib29sZWFuQ29uc3RhbnQgPSB0cnVlOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SW50KCkgeworICAgICAgICByZXR1cm4gaW50Q29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBjaGFyIGdldENoYXIoKSB7CisgICAgICAgIHJldHVybiBjaGFyQ29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gc3RyaW5nQ29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldExvbmcoKSB7CisgICAgICAgIHJldHVybiBsb25nQ29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdCgpIHsKKyAgICAgICAgcmV0dXJuIGZsb2F0Q29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKCkgeworICAgICAgICByZXR1cm4gZG91YmxlQ29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoKSB7CisgICAgICAgIHJldHVybiBieXRlQ29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIHNob3J0Q29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oKSB7CisgICAgICAgIHJldHVybiBib29sZWFuQ29uc3RhbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBnZXRFbnVtKENsYXNzPFQ+IGVudW1UeXBlKSB7CisgICAgICAgIFRbXSB2YWx1ZXMgPSBlbnVtVHlwZS5nZXRFbnVtQ29uc3RhbnRzKCk7CisgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1swXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL0dlbmVyYXRlRm9yVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9HZW5lcmF0ZUZvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjZmYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9HZW5lcmF0ZUZvclRlc3QuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBBbm5vdGF0aW9uIHRvIG1hcmsgZmllbGRzIG9mIGEgYmVhbiB0byBiZSBwb3B1bGF0ZWQgYnkKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29scy5UZXN0VmFsdWVHZW5lcmF0b3J9IGR1cmluZyB0aGUgdGVzdCBkYXRhIGdlbmVyYXRpb24gcHJvY2Vzcy4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBHZW5lcmF0ZUZvclRlc3QgeworICAgIC8qKiBzcGVjaWZpZXMgaG93IG1hbnkgZWxlbWVudHMgc2hvdWxkIGJlIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIGFuIGFycmF5L2NvbGxlY3Rpb24gKi8KKyAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAxOworCisgICAgLyoqIGR1ZSB0byBqYXZhIHR5cGUgZXJhc3VyZSwgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gaGFzIHRvIGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkICovCisgICAgQ2xhc3M8Pz4gY29sbGVjdGlvbk1lbWJlclR5cGUoKSBkZWZhdWx0IE9iamVjdC5jbGFzczsKKworICAgIC8qKiBpZiB0aGUgYmVhbiBjb250YWlucyBhIGNvbGxlY3Rpb24gZGVjbGFyZWQgdmlhIGl0cyBpbnRlcmZhY2UsIHRoZSBkZXNpcmVkIGltcGxlbWVudGluZyBjbGFzcyBoYXMgdG8gYmUgc3BlY2lmaWVkICovCisgICAgQ2xhc3M8Pz4gaW1wbGVtZW50aW5nQ2xhc3MoKSBkZWZhdWx0IE9iamVjdC5jbGFzczsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvUGVyc29uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYWZhMmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1BlcnNvbi5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHM7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIFBlcnNvbiBkYXRhIGJlYW4sIGNvcGllZCBmcm9tIG1idyB0ZXN0cyBhbmQgYW5ub3RhdGVkIGZvciB0aGUgdGVzdCBkYXRhIGdlbmVyYXRpb24gdG9vbC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBQZXJzb24geworCisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIGludCBhZ2U7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBTdHJpbmcgYWRkcmVzczsKKworICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIGludCBhZ2UsIFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuYWdlID0gYWdlOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzb24oKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJQZXJzb25AIiArIEludGVnZXIudG9IZXhTdHJpbmcoaGFzaENvZGUoKSkgKyAiXG5uYW1lPSIgKyBuYW1lICsgIlxuYWdlPSIgKyBhZ2UgKyAiXG5hZHJlc3M9IiArIGFkZHJlc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFBlcnNvbiBwZXJzb24gPSAoUGVyc29uKSBvOworCisgICAgICAgIGlmIChhZ2UgIT0gcGVyc29uLmFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChhZGRyZXNzICE9IG51bGwgPyAhYWRkcmVzcy5lcXVhbHMocGVyc29uLmFkZHJlc3MpIDogcGVyc29uLmFkZHJlc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lICE9IG51bGwgPyAhbmFtZS5lcXVhbHMocGVyc29uLm5hbWUpIDogcGVyc29uLm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IG5hbWUgIT0gbnVsbCA/IG5hbWUuaGFzaENvZGUoKSA6IDA7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgYWdlOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChhZGRyZXNzICE9IG51bGwgPyBhZGRyZXNzLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1JhbmRvbVRlc3RWYWx1ZUdlbmVyYXRvci5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9SYW5kb21UZXN0VmFsdWVHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjBmOTYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9SYW5kb21UZXN0VmFsdWVHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzLlRlc3RWYWx1ZUdlbmVyYXRvcn0gcHJvZHVjaW5nIHJhbmRvbSByZXN1bHRzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJhbmRvbVRlc3RWYWx1ZUdlbmVyYXRvciBleHRlbmRzIFRlc3RWYWx1ZUdlbmVyYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TVFJJTkdfTEVOR1RIID0gNTA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjaGFyYWN0ZXJzID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwIF8iOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBnZXRFbnVtKENsYXNzPFQ+IGVudW1UeXBlKSB7CisgICAgICAgIFRbXSBlbnVtVmFsdWVzID0gZW51bVR5cGUuZ2V0RW51bUNvbnN0YW50cygpOworICAgICAgICByZXR1cm4gZW51bVZhbHVlc1tyYW5kb20ubmV4dEludChlbnVtVmFsdWVzLmxlbmd0aCldOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEludCgpIHsKKyAgICAgICAgcmV0dXJuIHJhbmRvbS5uZXh0SW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBjaGFyIGdldENoYXIoKSB7CisgICAgICAgIHJldHVybiAoY2hhcikgcmFuZG9tLm5leHRJbnQoQ2hhcmFjdGVyLk1BWF9WQUxVRSArIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHJhbmRvbVN0cmluZyhyYW5kb20ubmV4dEludChNQVhfU1RSSU5HX0xFTkdUSCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKCkgeworICAgICAgICByZXR1cm4gcmFuZG9tLm5leHRMb25nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdCgpIHsKKyAgICAgICAgcmV0dXJuIHJhbmRvbS5uZXh0RmxvYXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoKSB7CisgICAgICAgIHJldHVybiByYW5kb20ubmV4dERvdWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKCkgeworICAgICAgICByZXR1cm4gKGJ5dGUpIHJhbmRvbS5uZXh0SW50KEJ5dGUuTUFYX1ZBTFVFICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIChzaG9ydCkgcmFuZG9tLm5leHRJbnQoU2hvcnQuTUFYX1ZBTFVFICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oKSB7CisgICAgICAgIHJldHVybiByYW5kb20ubmV4dEJvb2xlYW4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyByYW5kb21TdHJpbmcoaW50IGxlbmd0aCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKGNoYXJhY3RlcnMuY2hhckF0KHJhbmRvbS5uZXh0SW50KGNoYXJhY3RlcnMubGVuZ3RoKCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RCZWFuLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmMDMxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW4uamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEV4YW1wbGUgb2YgYSBjb21wbGV4IHRlc3RpbmcgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFRlc3RCZWFuIHsKKworICAgIC8qIHByaW1pdGl2ZXMgKi8KKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIGJ5dGUgYnQ7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBzaG9ydCBzaDsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIGludCBpOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgbG9uZyBsOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgZmxvYXQgZjsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIGRvdWJsZSBkOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgYm9vbGVhbiBibDsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIGNoYXIgYzsKKworICAgIC8qIHByaW1pdGl2ZSB3cmFwcGVycyAqLworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgQnl0ZSB3cmFwQnQ7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBTaG9ydCB3cmFwU2g7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBJbnRlZ2VyIHdyYXBJOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgTG9uZyB3cmFwTDsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIEZsb2F0IHdyYXBGOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgRG91YmxlIHdyYXBEOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgQm9vbGVhbiB3cmFwQmw7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBDaGFyYWN0ZXIgd3JhcEM7CisKKyAgICAvKiBhcnJheXMgKi8KKyAgICBAR2VuZXJhdGVGb3JUZXN0KGxlbmd0aCA9IDcpCisgICAgcHVibGljIEludGVnZXJbXSBhcnJheTsKKworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgRGF0ZSBkYXRlOworCisgICAgLyogMUQgLSBjb2xsZWN0aW9ucyAqLworICAgIEBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gIlN0cmluZ0VsZW1lbnRzIikKKyAgICBAWG1sRWxlbWVudChuYW1lID0gIlN0cmluZ0VsZW1lbnQiKQorICAgIEBHZW5lcmF0ZUZvclRlc3QoY29sbGVjdGlvbk1lbWJlclR5cGUgPSBTdHJpbmcuY2xhc3MsIGltcGxlbWVudGluZ0NsYXNzID0gQXJyYXlMaXN0LmNsYXNzLCBsZW5ndGggPSAxMCkKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHN0cmluZ0xpc3Q7CisKKyAgICBAWG1sRWxlbWVudFdyYXBwZXIobmFtZSA9ICJJbnRlZ2VyRWxlbWVudHMiKQorICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiSW50ZWdlckVsZW1lbnQiKQorICAgIEBHZW5lcmF0ZUZvclRlc3QoY29sbGVjdGlvbk1lbWJlclR5cGUgPSBJbnRlZ2VyLmNsYXNzLCBsZW5ndGggPSA1KQorICAgIHB1YmxpYyBIYXNoU2V0PEludGVnZXI+IGludGVnZXJTZXQ7CisKKyAgICAvKiBlbnVtcyAqLworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgVGVzdEJlYW5FbnVtIGVuOworCisgICAgLyogY3VzdG9tIHR5cGVzICovCisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBUZXN0QmVhbkluZm8gaW5uZXI7CisKKyAgICAvKiByZWN1cnNpdmUgKi8KKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIFRlc3RCZWFuIG5leHRCZWFuOworCisgICAgLyogYW5kIHdoYXQgYWJvdXQgdGhvc2U/ICovCisgICAgLy8gQ2hhclNlcXVlbmNlIGNzOworICAgIC8vIE9iamVjdCBvOworICAgIC8vIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHByaW50Q29udGVudCgwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHByaW50Q29udGVudChpbnQgbGV2ZWwpIHsKKyAgICAgICAgU3RyaW5nIHBhZCA9IGxldmVsID09IDAgPyAiIiA6IFN0cmluZy5mb3JtYXQoIiUxJCIgKyBsZXZlbCArICJzIiwgIiIpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKHBhZCArICIjIFRlc3RCZWFuW2xldmVsPSIgKyBsZXZlbCArICJdQCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGhhc2hDb2RlKCkpKS5hcHBlbmQoIlxuIik7CisKKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiIyBQcmltaXRpdmVzIikuYXBwZW5kKCJcbiIpOworICAgICAgICBidWYuYXBwZW5kKHBhZCArICJbIiArIGJ0ICsgIiwgIiArIHNoICsgIiwgIiArIGkgKyAiLCAiICsgbCArICIsICIgKyBmICsgIiwgIiArIGQgKyAiLCAiICsgYmwgKyAiLCAiICsgYyArICJdIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOworCisgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgIiMgUHJpbWl0aXZlcyB3cmFwcGVycyIpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiWyIgKyB3cmFwQnQgKyAiLCAiICsgd3JhcFNoICsgIiwgIiArIHdyYXBJICsgIiwgIiArIHdyYXBMICsgIiwgIiArIHdyYXBGICsgIiwgIiArIHdyYXBEICsgIiwgIgorICAgICAgICAgICAgICAgICsgd3JhcEJsICsgIiwgIiArIHdyYXBDICsgIl0iKS5hcHBlbmQoIlxuIik7CisKKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiIyBBcnJheXMiKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGlmIChhcnJheSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHBhZCArICJhcnJheTogIik7CisgICAgICAgICAgICBmb3IgKEludGVnZXIgaSA6IGFycmF5KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpICsgIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiIyBDb2xsZWN0aW9ucyIpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgaWYgKHN0cmluZ0xpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAic3RyaW5nTGlzdDogIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogc3RyaW5nTGlzdCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQocyArICIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW50ZWdlclNldCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHBhZCArICJpbnRlZ2VyU2V0OiAiKTsKKyAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogaW50ZWdlclNldCkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaSArICIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgImRhdGU6ICIgKyBkYXRlKS5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBidWYuYXBwZW5kKHBhZCArICIjIEVudW1zIikuYXBwZW5kKCJcbiIpOworICAgICAgICBpZiAoZW4gIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiZW49IiArIGVuKS5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiIyBJbm5lciBiZWFuIikuYXBwZW5kKCJcbiIpOworICAgICAgICBpZiAoaW5uZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChpbm5lci5wcmludENvbnRlbnQobGV2ZWwgKyAxKSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiIyBSZWN1cnNpdmUgYmVhbiIpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgaWYgKG5leHRCZWFuICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmV4dEJlYW4ucHJpbnRDb250ZW50KGxldmVsICsgMSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW5Db29yZGluYXRlcy5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0QmVhbkNvb3JkaW5hdGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyNmI5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW5Db29yZGluYXRlcy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHM7CisKKy8qKgorICogUGFydCBvZiBhIGNvbXBsZXggdGVzdCBiZWFuIGV4YW1wbGUsIGNvbnRhaW5lZCBpbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMuVGVzdEJlYW5JbmZvfQorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RCZWFuQ29vcmRpbmF0ZXMgeworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgaW50IHg7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBpbnQgeTsKKworICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRDb250ZW50KGludCBsZXZlbCkgeworICAgICAgICBTdHJpbmcgcGFkID0gU3RyaW5nLmZvcm1hdCgiJTEkIiArIGxldmVsICsgInMiLCAiIik7CisgICAgICAgIHJldHVybiAocGFkICsgIiMgIiArIHRoaXMgKyAiXG4iICsgcGFkICsgIng6eT0iICsgeCArICI6IiArIHkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW5FbnVtLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RCZWFuRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTRkYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RCZWFuRW51bS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHM7CisKKy8qKgorICogTmVzdGVkIHR5cGUgb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzLlRlc3RCZWFufQorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGVudW0gVGVzdEJlYW5FbnVtIHsKKyAgICBWQUxVRV8xLCBWQUxVRV8yLCBWQUxVRV8zOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0QmVhbkluZm8uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW5JbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkNmNjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW5JbmZvLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworLyoqCisgKiBOZXN0ZWQgdGVzdGluZyBiZWFuLCBjb250YWluZWQgaW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzLlRlc3RCZWFufQorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RCZWFuSW5mbyB7CisKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIEludGVnZXIgc29tZU51bWJlcjsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIGludCBpOyAvLyBzYW1lIG5hbWUgYXMgaW4gdGhlIG1haW4gYmVhbiwgb24gcHVycG9zZQorICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgVGVzdEJlYW5Db29yZGluYXRlcyBjb29yZHM7IC8vIGFub3RoZXIgbmVzdGVkIGxldmVsCisKKyAgICBwdWJsaWMgU3RyaW5nIHByaW50Q29udGVudChpbnQgbGV2ZWwpIHsKKyAgICAgICAgU3RyaW5nIHBhZCA9IFN0cmluZy5mb3JtYXQoIiUxJCIgKyBsZXZlbCArICJzIiwgIiIpOworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKHBhZCArICIjICIgKyB0aGlzKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgInNvbWVOdW1iZXI9IiArIHNvbWVOdW1iZXIpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiaT0iICsgaSkuYXBwZW5kKCJcbiIpOworICAgICAgICBpZiAoY29vcmRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29vcmRzLnByaW50Q29udGVudChsZXZlbCArIDEpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRpb25TdHJhdGVneS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRpb25TdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmRjNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3REYXRhR2VuZXJhdGlvblN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworLyoqCisgKiBFbnVtIGZvciB0ZXN0IGRhdGEgZ2VuZXJhdGlvbiBzdHJhdGVnaWVzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGVudW0gVGVzdERhdGFHZW5lcmF0aW9uU3RyYXRlZ3kgeworICAgIENPTlNUQU5ULAorICAgIFJBTkRPTSwKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdERhdGFHZW5lcmF0b3IuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdERhdGFHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzBlZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCisvKioKKyAqIEluc3RhbnRpYXRlcyBhbmQgcG9wdWxhdGVzIGEgYmVhbiB3aXRoIHRlc3RpbmcgZGF0YS4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0RGF0YUdlbmVyYXRvciB7CisKKyAgICAvKioKKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWFuIGJlYW4gdG8gYmUgcG9wdWxhdGVkCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSB0ZXN0aW5nIGJlYW4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgcG9wdWxhdGVCZWFuQnlBbm5vdGF0aW9ucyhUIGJlYW4pIHRocm93cyBSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBiZWFuLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgVGVzdFZhbHVlR2VuZXJhdG9yIGdlbmVyYXRvciA9IFRlc3RWYWx1ZUdlbmVyYXRvckZhY3RvcnkuZ2V0R2VuZXJhdG9yKFRlc3REYXRhR2VuZXJhdGlvblN0cmF0ZWd5LlJBTkRPTSk7CisgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIEdlbmVyYXRlRm9yVGVzdCBhbm5vdGF0aW9uID0gZmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZUZvclRlc3QuY2xhc3MpOworICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgZmllbGQuc2V0KGJlYW4sIGdlbmVyYXRvci5nZXRWYWx1ZUZvclR5cGUoZmllbGQuZ2V0VHlwZSgpLCBhbm5vdGF0aW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3REYXRhR2VuZXJhdG9yQXBwLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3REYXRhR2VuZXJhdG9yQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3YzQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdERhdGFHZW5lcmF0b3JBcHAuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBmb3IgZ2VuZXJhdGluZyBjdXN0b20gdGVzdGluZyBkYXRhIGZpbGVzIGZvciBKZXJzZXkgcGVyZm9ybWFuY2UgdGVzdHMuCisgKgorICogPHA+Q3JlYXRlcyBzZXQgb2YgZmlsZXMgY29udGFpbmluZyBwbGFpbiB0ZXh0LCBqc29uIGFuZCB4bWwgaW4gdmFyaW91cyBwcmVkZWZpbmVkIHNpemVzOgorICogMWtCLCA1a0IsIDEwa0IsIDFNQiBhbmQgb3B0aW9uYWxseSAxR0IuIFRoZSAxR0IgZmlsZSBoYXMgdG8gYmUgZW5hYmxlZCBieSBjaGFuZ2luZyB0aGUgY29uc3RhbnQKKyAqIHtAY29kZSBHRU5FUkFURV9BTFNPX0dJR0FCWVRFX0RBVEFTRVRTfSB0byB0cnVlLjwvcD4KKyAqCisgKiA8cD5UaGUgc2l6ZXMgYXJlIHRoZSBNSU5JTUFMIHNpemVzLCB0aGUgZ2VuZXJhdGlvbiBzdG9wcyBhZnRlciByZWFjaGluZyB0aGUgZ2l2ZW4gc2l6ZSwKKyAqIGJ1dCBkb2VzIG5vdCB0cnVuY2F0ZSB0aGUgbW9zdCByZWNlbnRseQorICogZ2VuZXJhdGVkIGVudGl0eS4gRm9yIHNpbXBsZSB0ZXN0aW5nIGJlYW5zIHRoZSBzaXplIGRpZmZlcmVuY2UgZnJvbSB0aGUgcHJlZGVmaW5lZCB0cmVzaG9sZCBpcyBtaW5pbWFsLAorICogd2hlcmVhcyBmb3IgdmVyeSBjb21wbGV4IHRlc3RpbmcgYmVhbnMgdGhlIGRpZmZlcmVuY2UgY2FuIGJlIHNpZ25pZmljYW50LjwvcD4KKyAqCisgKiA8cD5NT1h5IGlzIHVzZWQgZm9yIGNyZWF0aW5nIFhNTCBhbmQgSlNPTiBmcm9tIHRoZSB0ZXN0aW5nIGJlYW5zLjwvcD4KKyAqCisgKiA8cD5SdW4gdGhlIGdlbmVyYXRpb24gYnkgaW52b2tpbmcge0Bjb2RlIG12biBjbGVhbiBjb21waWxlfSBhbmQge0Bjb2RlIG12biBleGVjOmphdmF9IGNvbW1hbmRzIGluIHRoZSBtb2R1bGUgcm9vdCBmb2xkZXIuPC9wPgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3REYXRhR2VuZXJhdG9yQXBwIHsKKworICAgIC8qKiBjaGFuZ2UgdGhlIHZhbHVlIHRvIHRydWUgdG8gZ2VuZXJhdGUgYWxzbyAxR0IgZmlsZXM7IGNhbiBiZSB0aW1lIGNvbnN1bWluZyBhbmQgdGFrZXMgYWRkaXRpb25hbCAzR0Igb2YgZGlzaworICAgICAqIHNwYWNlICgxR0IganNvbiwgMUdCIHhtbCBhbmQgMUdCIHRleHQpICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9BTFNPX0dJR0FCWVRFX0RBVEFTRVRTID0gZmFsc2U7CisKKyAgICAvKiogcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHNob3VsZCBiZSBzdG9yZWQsIGluY2x1ZGluZyB0aGUgZmluYWwgc2xhc2ggKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QQVRIID0gIiI7CisKKyAgICAvKiogc3BlY2lmaWVzIGhvdyB0aGUgb3V0cHV0cyBnZW5lcmF0ZWQgZnJvbSBvbmUgYmVhbiBzaG91bGQgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciBpbiB0aGUgb3V0cHV0IGZpbGVzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1NFUEFSQVRPUiA9ICJcblxuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRlc3REYXRhR2VuZXJhdG9yQXBwLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpOworICAgIHByaXZhdGUgc3RhdGljIFVSSSBiYXNlVXJpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJhc2VVcmkgPSBhcmdzLmxlbmd0aCA+IDAgPyBVUkkuY3JlYXRlKGFyZ3NbMF0pIDogQkFTRV9VUkk7CisgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgY3JlYXRlQXBwKCkpOworCisgICAgICAgIExPRy5pbmZvKCJKZXJzZXkgcGVyZm9ybWFuY2UgdGVzdCBkYXRhIGdlbmVyYXRpb24gLSBhcHBsaWNhdGlvbiBzdGFydGVkLiIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0ZXh0IGZpbGVzIC0gMWtiLCA1a2IsIDEwa2IsIDFNQiBhbmQgb3B0aW9uYWxseSAxR0IKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL3RleHQiLCAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTFrYi50ZXh0Iik7CisgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInNpbXBsZS90ZXh0IiwgNSAqIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tNWtiLnRleHQiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL3RleHQiLCAxMCAqIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMTBrYi50ZXh0Iik7CisgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInNpbXBsZS90ZXh0IiwgMTAyNCAqIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMU1CLnRleHQiKTsKKyAgICAgICAgICAgIGlmIChHRU5FUkFURV9BTFNPX0dJR0FCWVRFX0RBVEFTRVRTKSB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJ0ZXh0IiwgMTAyNCAqIDEwMjQgKiAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTFHQi50ZXh0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIGpzb24gZmlsZXMgLSAxa2IsIDVrYiwgMTBrYiwgMU1CIGFuZCBvcHRpb25hbGx5IDFHQgorICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUvanNvbiIsIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMWtiLmpzb24iKTsKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL2pzb24iLCA1ICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS01a2IuanNvbiIpOworICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUvanNvbiIsIDEwICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS0xMGtiLmpzb24iKTsKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL2pzb24iLCAxMDI0ICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS0xTUIuanNvbiIpOworICAgICAgICAgICAgaWYgKEdFTkVSQVRFX0FMU09fR0lHQUJZVEVfREFUQVNFVFMpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInNpbXBsZS9qc29uIiwgMTAyNCAqIDEwMjQgKiAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTFHQi5qc29uIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIHhtbCBmaWxlcyAtIDFrYiwgNWtiLCAxMGtiLCAxTUIgYW5kIG9wdGlvbmFsbHkgMUdCCisgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInNpbXBsZS94bWwiLCAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTFrYi54bWwiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL3htbCIsIDUgKiAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTVrYi54bWwiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL3htbCIsIDEwICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS0xMGtiLnhtbCIpOworICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUveG1sIiwgMTAyNCAqIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMU1CLnhtbCIpOworICAgICAgICAgICAgaWYgKEdFTkVSQVRFX0FMU09fR0lHQUJZVEVfREFUQVNFVFMpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInNpbXBsZS94bWwiLCAxMDI0ICogMTAyNCAqIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMUdCLmpzb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGVzdCBkYXRhIGdlbmVyYXRpb24uICIsIGUpOworICAgICAgICB9CisgICAgICAgIHNlcnZlci5zaHV0ZG93bigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlQXBwKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoY3JlYXRlTW94eUpzb25SZXNvbHZlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbnRleHRSZXNvbHZlcjxNb3h5SnNvbkNvbmZpZz4gY3JlYXRlTW94eUpzb25SZXNvbHZlcigpIHsKKyAgICAgICAgZmluYWwgTW94eUpzb25Db25maWcgbW94eUpzb25Db25maWcgPSBuZXcgTW94eUpzb25Db25maWcoKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VQcmVmaXhNYXBwZXIgPSBuZXcgSGFzaE1hcDw+KDEpOworICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXBwZXIucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKKyAgICAgICAgbW94eUpzb25Db25maWcuc2V0TmFtZXNwYWNlUHJlZml4TWFwcGVyKG5hbWVzcGFjZVByZWZpeE1hcHBlcikuc2V0TmFtZXNwYWNlU2VwYXJhdG9yKCc6Jyk7CisgICAgICAgIHJldHVybiBtb3h5SnNvbkNvbmZpZy5yZXNvbHZlcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpbGUoZmluYWwgU3RyaW5nIHJlc291cmNlUmVsYXRpdmVVcmwsIGZpbmFsIGludCBtaW5pbWFsU2l6ZSwgZmluYWwgU3RyaW5nIGZpbGVOYW1lKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HLmluZm8oIkdlbmVyYXRpbmcgZmlsZSAiICsgZmlsZU5hbWUpOworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoYmFzZVVyaSkucGF0aCgiZ2VuZXJhdGUiKS5wYXRoKHJlc291cmNlUmVsYXRpdmVVcmwpOworCisgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgZmluYWwgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksIENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKSkpOworCisgICAgICAgIGludCBhY3R1YWxTaXplID0gMDsKKyAgICAgICAgd2hpbGUgKGFjdHVhbFNpemUgPCBtaW5pbWFsU2l6ZSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShyZXNwb25zZSArIEVOVElUWV9TRVBBUkFUT1IpOworICAgICAgICAgICAgYWN0dWFsU2l6ZSArPSByZXNwb25zZS5sZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdERhdGFHZW5lcmF0b3JSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRvclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkNzJiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdERhdGFHZW5lcmF0b3JSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIFJlc291cmNlIGZvciBnZW5lcmF0aW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlIHRlc3RzLgorICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB7QGxpbmsgVGVzdERhdGFHZW5lcmF0b3JBcHB9CisgKi8KK0BQYXRoKCJnZW5lcmF0ZSIpCitwdWJsaWMgY2xhc3MgVGVzdERhdGFHZW5lcmF0b3JSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihUZXN0RGF0YUdlbmVyYXRvclJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgcGxhaW4gdGV4dCBiYXNlZCBkYXRhIGZyb20gYSBjb21wbGV4IHRlc3RpbmcgYmVhbi4KKyAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiBhIGNhbGwgdG8gYSB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9IG1ldGhvZCBvZiB0aGUgcG9wdWxhdGVkIGJlYW4uCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJjb21wbGV4L3RleHQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDb21wbGV4VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbXBsZXhUZXN0QmVhbigpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGpzb24gYmFzZWQgZGF0YSBmcm9tIGEgY29tcGxleCB0ZXN0aW5nIGJlYW4uCisgICAgICogQHJldHVybiB0aGUgYmVhbiB0byBiZSBjb252ZXJ0ZWQgdG8ganNvbgorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgiY29tcGxleC9qc29uIikKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgcHVibGljIFRlc3RCZWFuIGdlbmVyYXRlQ29tcGxleEpzb24oKSB7CisgICAgICAgIHJldHVybiBnZXRDb21wbGV4VGVzdEJlYW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgeG1sIGJhc2VkIGRhdGEgZnJvbSBhIGNvbXBsZXggdGVzdGluZyBiZWFuLgorICAgICAqIEByZXR1cm4gdGhlIGJlYW4gdG8gYmUgY29udmVydGVkIHRvIHhtbAorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgiY29tcGxleC94bWwiKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKQorICAgIHB1YmxpYyBUZXN0QmVhbiBnZW5lcmF0ZUNvbXBsZXhYbWwoKSB7CisgICAgICAgIHJldHVybiBnZXRDb21wbGV4VGVzdEJlYW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgcGxhaW4gdGV4dCBiYXNlZCBkYXRhIGZyb20gYSBzaW1wbGUgdGVzdGluZyBiZWFuLgorICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIGEgY2FsbCB0byBhIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0gbWV0aG9kIG9mIHRoZSBwb3B1bGF0ZWQgYmVhbi4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoInNpbXBsZS90ZXh0IikKKyAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU2ltcGxlVGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFNpbXBsZVRlc3RCZWFuKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMganNvbiBiYXNlZCBkYXRhIGZyb20gYSBzaW1wbGUgdGVzdGluZyBiZWFuLgorICAgICAqIEByZXR1cm4gdGhlIGJlYW4gdG8gYmUgY29udmVydGVkIHRvIGpzb24KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoInNpbXBsZS9qc29uIikKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgcHVibGljIFBlcnNvbiBnZW5lcmF0ZVNpbXBsZUpzb24oKSB7CisgICAgICAgIHJldHVybiBnZXRTaW1wbGVUZXN0QmVhbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB4bWwgYmFzZWQgZGF0YSBmcm9tIGEgc2ltcGxlIHRlc3RpbmcgYmVhbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBiZWFuIHRvIGJlIGNvbnZlcnRlZCB0byB4bWwKKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoInNpbXBsZS94bWwiKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKQorICAgIHB1YmxpYyBQZXJzb24gZ2VuZXJhdGVTaW1wbGVYbWwoKSB7CisgICAgICAgIHJldHVybiBnZXRTaW1wbGVUZXN0QmVhbigpOworICAgIH0KKworICAgIHByaXZhdGUgVGVzdEJlYW4gZ2V0Q29tcGxleFRlc3RCZWFuKCkgeworICAgICAgICBUZXN0QmVhbiBiZWFuID0gbmV3IFRlc3RCZWFuKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUZXN0RGF0YUdlbmVyYXRvci5wb3B1bGF0ZUJlYW5CeUFubm90YXRpb25zKGJlYW4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJFcnJvciB3aGlsZSBwb3B1bGF0aW5nIHRoZSB0ZXN0aW5nIGJlYW4uIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgcHJpdmF0ZSBQZXJzb24gZ2V0U2ltcGxlVGVzdEJlYW4oKSB7CisgICAgICAgIFBlcnNvbiBiZWFuID0gbmV3IFBlcnNvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGVzdERhdGFHZW5lcmF0b3IucG9wdWxhdGVCZWFuQnlBbm5vdGF0aW9ucyhiZWFuKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiRXJyb3Igd2hpbGUgcG9wdWxhdGluZyB0aGUgdGVzdGluZyBiZWFuLiIsIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiZWFuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdFZhbHVlR2VuZXJhdG9yLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RWYWx1ZUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OWFjZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RWYWx1ZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciB0ZXN0IGRhdGEgZ2VuZXJhdGlvbi4KKyAqCisgKiA8cD5DcmVhdGVzIHRoZSBwYXR0ZXJuIGZvciBkaWZmZXJlbnQgZ2VuZXJhdGlvbiBzdHJhdGVnaWVzLgorICogQ29udGFpbnMgdGhlIChsaW1pdGVkKSBsb2dpYyBmb3IgY2xhc3MgZ3JhcGggd2Fsay10aHJvdWdoLjxwLz4KKyAqIDxwPkV2ZXJ5IGZpZWxkIHdoaWNoIHNob3VsZCBiZSBwb3B1bGF0ZWQgbXVzdCBiZSBhbm5vdGF0ZWQgYnkKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29scy5HZW5lcmF0ZUZvclRlc3R9PC9wPgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RWYWx1ZUdlbmVyYXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFQ1VSU0lPTl9MRVZFTCA9IDU7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihUZXN0VmFsdWVHZW5lcmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKiByZXR1cm5zIHRlc3RpbmcgZGF0YSBpbnQgdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEludCgpOworCisgICAgLyoqIHJldHVybnMgdGVzdGluZyBkYXRhIGNoYXIgdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2hhciBnZXRDaGFyKCk7CisKKyAgICAvKiogcmV0dXJucyB0ZXN0aW5nIGRhdGEgU3RyaW5nIHZhbHVlICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdHJpbmcoKTsKKworICAgIC8qKiByZXR1cm5zIHRlc3RpbmcgZGF0YSBsb25nIHZhbHVlICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0TG9uZygpOworCisgICAgLyoqIHJldHVybnMgdGVzdGluZyBkYXRhIGZsb2F0IHZhbHVlICovCisgICAgcHVibGljIGFic3RyYWN0IGZsb2F0IGdldEZsb2F0KCk7CisKKyAgICAvKiogcmV0dXJucyB0ZXN0aW5nIGRhdGEgZG91YmxlIHZhbHVlICovCisgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXREb3VibGUoKTsKKworICAgIC8qKiByZXR1cm5zIHRlc3RpbmcgZGF0YSBieXRlIHZhbHVlICovCisgICAgcHVibGljIGFic3RyYWN0IGJ5dGUgZ2V0Qnl0ZSgpOworCisgICAgLyoqIHJldHVybnMgdGVzdGluZyBkYXRhIHNob3J0IHZhbHVlICovCisgICAgcHVibGljIGFic3RyYWN0IHNob3J0IGdldFNob3J0KCk7CisKKyAgICAvKiogcmV0dXJucyB0ZXN0aW5nIGRhdGEgYm9vbGVhbiB2YWx1ZSAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGdldEJvb2xlYW4oKTsKKworICAgIC8qKiByZXR1cm5zIHRlc3RpbmcgZGF0YSBlbnVtIHZhbHVlICovCisgICAgcHVibGljIGFic3RyYWN0IDxUPiBUIGdldEVudW0oQ2xhc3M8VD4gZW51bVR5cGUpOworCisgICAgcHJvdGVjdGVkIE9iamVjdCBoYW5kbGVQcmltaXRpdmVzQW5kV3JhcHBlcnMoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKFN0cmluZy5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKEludGVnZXIuY2xhc3MpIHx8IHR5cGUuaXNBc3NpZ25hYmxlRnJvbShpbnQuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW50KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUuaXNBc3NpZ25hYmxlRnJvbShDaGFyYWN0ZXIuY2xhc3MpIHx8IHR5cGUuaXNBc3NpZ25hYmxlRnJvbShjaGFyLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldENoYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKEZsb2F0LmNsYXNzKSB8fCB0eXBlLmlzQXNzaWduYWJsZUZyb20oZmxvYXQuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RmxvYXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKExvbmcuY2xhc3MpIHx8IHR5cGUuaXNBc3NpZ25hYmxlRnJvbShsb25nLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldExvbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKERvdWJsZS5jbGFzcykgfHwgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGRvdWJsZS5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXREb3VibGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKEJ5dGUuY2xhc3MpIHx8IHR5cGUuaXNBc3NpZ25hYmxlRnJvbShieXRlLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldEJ5dGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKFNob3J0LmNsYXNzKSB8fCB0eXBlLmlzQXNzaWduYWJsZUZyb20oc2hvcnQuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2hvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKEJvb2xlYW4uY2xhc3MpIHx8IHR5cGUuaXNBc3NpZ25hYmxlRnJvbShib29sZWFuLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldEJvb2xlYW4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGhhbmRsZUNvbGxlY3Rpb25zKENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZUZvclRlc3QgYW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN1cnNpb25MZXZlbCkgdGhyb3dzIFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBpbnQgdGVzdERhdGFMZW5ndGggPSBhbm5vdGF0aW9uLmxlbmd0aCgpOworICAgICAgICBDbGFzczw/PiBjb2xsZWN0aW9uTWVtYmVyVHlwZSA9IGFubm90YXRpb24uY29sbGVjdGlvbk1lbWJlclR5cGUoKTsKKyAgICAgICAgQ2xhc3M8Pz4gY29sbGVjdGlvblR5cGUgPSB0eXBlOworICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgY29sbGVjdGlvblR5cGUgPSBhbm5vdGF0aW9uLmltcGxlbWVudGluZ0NsYXNzKCk7CisgICAgICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUuZXF1YWxzKE9iamVjdC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29sbGVjdGlvbiAtIGludGVyZmFjZSB3YXMgdXNlZCBmb3IgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImRlY2xhcmF0aW9uIGFuZCBwYXJhbWV0ZXIgJ2ltcGxlbWVudGluZ0NsYXNzJyBub3Qgc2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9iamVjdCBjb2xsZWN0aW9uID0gY29sbGVjdGlvblR5cGUubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0RGF0YUxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyByZWN1cnNpdmVseSByZXNvbHZlIHZhbHVlIGZvciBjb2xsZWN0aW9uIG1lbWJlcnMKKyAgICAgICAgICAgIE9iamVjdCBvID0gZ2V0VmFsdWVGb3JUeXBlKGNvbGxlY3Rpb25NZW1iZXJUeXBlLCBudWxsLCByZWN1cnNpb25MZXZlbCArIDEpOworICAgICAgICAgICAgLy8gYW5kIGFkZCBpdCB0byB0aGUgY29sbGVjdGlvbiBpbnN0YW5jZQorICAgICAgICAgICAgTWV0aG9kIGFkZE1ldGhvZCA9IHR5cGUuZ2V0RGVjbGFyZWRNZXRob2QoImFkZCIsIE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICBhZGRNZXRob2QuaW52b2tlKGNvbGxlY3Rpb24sIG8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgaGFuZGxlQXJyYXlzKENsYXNzPD8+IHR5cGUsIEdlbmVyYXRlRm9yVGVzdCBhbm5vdGF0aW9uLCBpbnQgcmVjdXJzaW9uTGV2ZWwpCisgICAgICAgICAgICB0aHJvd3MgUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IHRlc3REYXRhTGVuZ3RoID0gYW5ub3RhdGlvbi5sZW5ndGgoKTsKKyAgICAgICAgQ2xhc3M8Pz4gYXJyYXlNZW1iZXJUeXBlID0gdHlwZS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIE9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKGFycmF5TWVtYmVyVHlwZSwgdGVzdERhdGFMZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3REYXRhTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gZ2V0VmFsdWVGb3JUeXBlKGFycmF5TWVtYmVyVHlwZSwgbnVsbCwgcmVjdXJzaW9uTGV2ZWwgKyAxKTsKKyAgICAgICAgICAgIEFycmF5LnNldChhcnJheSwgaSwgbyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVGb3JUeXBlKENsYXNzPD8+IHR5cGUsIEdlbmVyYXRlRm9yVGVzdCBhbm5vdGF0aW9uKSB0aHJvd3MgUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZUZvclR5cGUodHlwZSwgYW5ub3RhdGlvbiwgMCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRWYWx1ZUZvclR5cGUoQ2xhc3M8Pz4gdHlwZSwgR2VuZXJhdGVGb3JUZXN0IGFubm90YXRpb24sIGludCByZWN1cnNpb25MZXZlbCkKKyAgICAgICAgICAgIHRocm93cyBSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBoYW5kbGUgcHJpbWl0aXZlcyBhbmQgd3JhcHBlciBjbGFzc2VzCisgICAgICAgIE9iamVjdCBwcmltaXRpdmVPcldyYXBwZXIgPSBoYW5kbGVQcmltaXRpdmVzQW5kV3JhcHBlcnModHlwZSk7CisgICAgICAgIGlmIChwcmltaXRpdmVPcldyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZU9yV3JhcHBlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEhhbmRsZSBjb2xsZWN0aW9ucworICAgICAgICBpZiAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNvbGxlY3Rpb25zKHR5cGUsIGFubm90YXRpb24sIHJlY3Vyc2lvbkxldmVsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgbWFwcyAodW5zdXBwb3J0ZWQpCisgICAgICAgIGlmIChNYXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWFwcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBlbnVtcworICAgICAgICBpZiAodHlwZS5pc0VudW0oKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldEVudW0odHlwZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgYXJyYXlzCisgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVBcnJheXModHlwZSwgYW5ub3RhdGlvbiwgcmVjdXJzaW9uTGV2ZWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFmdGVyIHNlbGVjdGluZy1vdXQgImFsbCIgdGhlIG90aGVyIHBvc3NpYmlsaXRpZXMsIHdlIGFyZSBwcm9iYWJseSBoYW5kbGluZyBhIGN1c3RvbSBpbm5lci1iZWFuCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgaW5uZXIgdHlwZQorICAgICAgICBpZiAocmVjdXJzaW9uTGV2ZWwgPT0gTUFYX1JFQ1VSU0lPTl9MRVZFTCkgeworICAgICAgICAgICAgbG9nLmZpbmUoIk1heGltdW0gcmVjdXJzaW9uIGxldmVsICgiICsgcmVjdXJzaW9uTGV2ZWwgKyAiKSByZWFjaGVkLiBJZ25vcmluZyB0aGUgZmllbGQuIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgaW5uZXJCZWFuID0gdHlwZS5uZXdJbnN0YW5jZSgpOworICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IHR5cGUuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworICAgICAgICAgICAgR2VuZXJhdGVGb3JUZXN0IHN1YkZpZWxkQW5ub3RhdGlvbiA9IGZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVGb3JUZXN0LmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChzdWJGaWVsZEFubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgZ2F0aGVyIHRoZSB2YWx1ZXMgZm9yIHRoZSBjb250YWluaW5nIGZpZWxkcyBhbmQgc2V0IGl0CisgICAgICAgICAgICAgICAgZmllbGQuc2V0KGlubmVyQmVhbiwgZ2V0VmFsdWVGb3JUeXBlKGZpZWxkLmdldFR5cGUoKSwgc3ViRmllbGRBbm5vdGF0aW9uLCByZWN1cnNpb25MZXZlbCArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5uZXJCZWFuOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0VmFsdWVHZW5lcmF0b3JGYWN0b3J5LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RWYWx1ZUdlbmVyYXRvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI2OGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0VmFsdWVHZW5lcmF0b3JGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworLyoqCisgKiBGYWN0b3J5IGZvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMuVGVzdFZhbHVlR2VuZXJhdG9yfSBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFZhbHVlR2VuZXJhdG9yRmFjdG9yeSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMuVGVzdFZhbHVlR2VuZXJhdG9yfQorICAgICAqIEBwYXJhbSBzdHJhdGVneSBkYXRhIGdlbmVyYXRpb24gc3RyYXRlZ3kKKyAgICAgKiBAcmV0dXJuIGdlbmVyYXRvciBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGVzdFZhbHVlR2VuZXJhdG9yIGdldEdlbmVyYXRvcihUZXN0RGF0YUdlbmVyYXRpb25TdHJhdGVneSBzdHJhdGVneSkgeworICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gVGVzdERhdGFHZW5lcmF0aW9uU3RyYXRlZ3kuQ09OU1RBTlQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RhbnRUZXN0VmFsdWVHZW5lcmF0b3IoKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PSBUZXN0RGF0YUdlbmVyYXRpb25TdHJhdGVneS5SQU5ET00pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZG9tVGVzdFZhbHVlR2VuZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVxdWVzdGVkIFRlc3REYXRhR2VuZXJhdGlvblN0cmF0ZWd5IGRvZXMgbm90IGV4aXN0LiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BvbS54bWwgYi90ZXN0cy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNmU5MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wb20ueG1sCkBAIC0wLDAgKzEsMTA5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0czwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGVzdCBtb2R1bGVzIGNvbnRhaW5pbmcgdGVzdCBzY2VuYXJpbyB0eXBlcyB0aGF0IGludm9sdmUgbXVsdGlwbGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgbW9kdWxlcyAoaW50ZWdyYXRpb24sIGZ1bmN0aW9uYWwsIGV0Yy4gdGVzdHMpLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5lMmU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lMmUtY2xpZW50PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZTJlLWNvcmUtY29tbW9uPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZTJlLWVudGl0eTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmUyZS1pbmplY3Q8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lMmUtc2VydmVyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZTJlLXRlc3RuZzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmludGVncmF0aW9uPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWVtLWxlYWtzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+b3NnaTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnN0cmVzczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnBlcmZvcm1hbmNlPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgorICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJvbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgICAgIDxzY29wZT5pbXBvcnQ8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8L2RlcGVuZGVuY3lNYW5hZ2VtZW50PgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD50cnVlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc29uYXR5cGUucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5leHVzLXN0YWdpbmctbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXBOZXh1c1N0YWdpbmdEZXBsb3lNb2pvPnRydWU8L3NraXBOZXh1c1N0YWdpbmdEZXBsb3lNb2pvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0cmVzcy9wb20ueG1sIGIvdGVzdHMvc3RyZXNzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljMzU5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0cmVzcy9wb20ueG1sCkBAIC0wLDAgKzEsMTA5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c3RyZXNzPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXN0cmVzczwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKworICAgICAgICBKZXJzZXkgc3RyZXNzIHRlc3RzCisKKyAgICAgICAgVGhpcyBtb2R1bGUgbWF5IGNvbnRhaW4gdGVzdHMgd2hpY2ggZXhlY3V0aW9uIGlzIGxpbWl0ZWQgYnkgdGltZSAob3IgYSBmYXVsdCkuIFRoaXMgbWF5IGxlYWQgdG8gYSBjb25zaWRlcmFibGUgbG9uZ2VyCisgICAgICAgIGJ1aWxkIG9mIEplcnNleS4KKworICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1YbXgyMDQ4bSAke3N1cmVmaXJlLmNvdmVyYWdlLmFyZ2xpbmV9PC9hcmdMaW5lPgorICAgICAgICAgICAgICAgICAgICA8Zm9ya01vZGU+YWx3YXlzPC9mb3JrTW9kZT4KKyAgICAgICAgICAgICAgICAgICAgPGVuYWJsZUFzc2VydGlvbnM+ZmFsc2U8L2VuYWJsZUFzc2VydGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2d1YXZhLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9zdHJlc3Mvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9NdWx0aVRocmVhZGluZ0FnZ3JlZ2F0ZWRSZXNlcnZvaXJUZXN0LmphdmEgYi90ZXN0cy9zdHJlc3Mvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9NdWx0aVRocmVhZGluZ0FnZ3JlZ2F0ZWRSZXNlcnZvaXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmZmY4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3N0cmVzcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL011bHRpVGhyZWFkaW5nQWdncmVnYXRlZFJlc2Vydm9pclRlc3QuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuVGltZVJlc2Vydm9pcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5jb3JlLlVuaWZvcm1UaW1lU25hcHNob3Q7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIE11bHRpIFRocmVhZGluZyBjb25jdXJyZW5jeSB0ZXN0IG9mIEplcnNleSBtb25pdG9yaW5nIGludGVybmFscy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aVRocmVhZGluZ0FnZ3JlZ2F0ZWRSZXNlcnZvaXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE11bHRpVGhyZWFkaW5nQWdncmVnYXRlZFJlc2Vydm9pclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9EVUNFUl9DT1VOVCA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlNVTUVSX0NPVU5UID0gNTsKKworICAgIC8qKgorICAgICAqIE5vdGUgdGhhdCBtb3JlIHRoYW4gNSBzZWNvbmRzIG1heSByZXF1aXJlIG1vcmUgdGhhbiAxRyBoZWFwIG1lbW9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9EVVJBVElPTl9NSUxMSVMgPSAxMF8wMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIVVRET1dOX1RJTUVPVVRfU0VDT05EUyA9IDEyMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgREVMVEEgPSAwLjAwMDE7CisKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgaW5jcmVtZW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHByb2R1Y2VyRXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzCisgICAgICAgICAgICAubmV3Rml4ZWRUaHJlYWRQb29sKFBST0RVQ0VSX0NPVU5ULCBuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKS5zZXREYWVtb24odHJ1ZSkuYnVpbGQoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBjb25zdW1lckV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycworICAgICAgICAgICAgLm5ld0ZpeGVkVGhyZWFkUG9vbChDT05TVU1FUl9DT1VOVCwgbmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkuc2V0RGFlbW9uKHRydWUpLmJ1aWxkKCkpOworCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgIHByaXZhdGUgZmluYWwgVGltZVVuaXQgc3RhcnRVbml0VGltZSA9IFRpbWVVbml0Lk5BTk9TRUNPTkRTOworCisgICAgcHJpdmF0ZSBmaW5hbCBBZ2dyZWdhdGluZ1RyaW1tZXIgdHJpbW1lciA9CisgICAgICAgICAgICBuZXcgQWdncmVnYXRpbmdUcmltbWVyKHN0YXJ0VGltZSgpLCBzdGFydFVuaXRUaW1lLCAxMCwgVGltZVVuaXQuTUlDUk9TRUNPTkRTKTsKKyAgICBwcml2YXRlIGZpbmFsIFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyIHRpbWUxMHVzUmVzZXJ2b2lyID0KKyAgICAgICAgICAgIG5ldyBTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcigxMCwgVGltZVVuaXQuTUlDUk9TRUNPTkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSgpLCBzdGFydFVuaXRUaW1lLCB0cmltbWVyKTsKKyAgICBwcml2YXRlIGZpbmFsIEFnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pciB0aW1lMURheUFnZ3JlZ2F0ZWRSZXNlcnZvaXIgPQorICAgICAgICAgICAgbmV3IEFnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcigxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5EQVlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUoKSwgc3RhcnRVbml0VGltZSwgdHJpbW1lcik7CisgICAgcHJpdmF0ZSBmaW5hbCBBZ2dyZWdhdGVkU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIgdGltZTEwRGF5c0FnZ3JlZ2F0ZWRSZXNlcnZvaXIgPQorICAgICAgICAgICAgbmV3IEFnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcigKKyAgICAgICAgICAgICAgICAgICAgMTAsIFRpbWVVbml0LkRBWVMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSgpLCBzdGFydFVuaXRUaW1lLCB0cmltbWVyKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8QWdncmVnYXRlZFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyPiBhZ2dyZWdhdGVkVGltZVJlc2Vydm9pcnMgPQorICAgICAgICAgICAgbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcigxLCBUaW1lVW5pdC5TRUNPTkRTLCBzdGFydFRpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VW5pdFRpbWUsIHRyaW1tZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUxRGF5QWdncmVnYXRlZFJlc2Vydm9pciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMTBEYXlzQWdncmVnYXRlZFJlc2Vydm9pcgorICAgICAgICAgICAgICAgICAgICApKTsKKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHRlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBzdGFydCB0aW1lIG9mIHRoZSB0ZXN0LiBNdXN0IGJlIGEgY29uc3RhbnQgdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgc3RhcnRUaW1lKCkgeworICAgICAgICByZXR1cm4gc3RhcnRUaW1lOworICAgIH0KKworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkb1NodXRkb3duID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHtAbGluayAjUFJPRFVDRVJfQ09VTlR9IHByb2R1Y2VycyB0aGF0IHVwZGF0ZSB7QGxpbmsgI3RpbWUxMHVzUmVzZXJ2b2lyfSAxMCBtaWNyb3NlY29uZHMgc2xpZGluZyB3aW5kb3cgcmVzZXJ2b2lyIHdpdGgKKyAgICAgKiBzZXF1ZW50aWFsbHkgaW5jcmVhc2luZyB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IHtAbGluayBAaW5jcmVtZW50ZXJ9LiBUaGlzIHNsaWRpbmcgd2luZG93IHVwZGF0ZXMgMSBkYXkgYWdncmVnYXRlZCBzbGlkaW5nCisgICAgICogd2luZG93IGFuZCBhbHNvIDEwIGRheXMgYWdncmVnYXRlZCBzbGlkaW5nIHdpbmRvdyAoe0BsaW5rICN0aW1lMURheUFnZ3JlZ2F0ZWRSZXNlcnZvaXJ9IGFuZCB7QGxpbmsKKyAgICAgKiAjdGltZTEwRGF5c0FnZ3JlZ2F0ZWRSZXNlcnZvaXJ9IHJlc3BlY3RpdmVseSkuIEluIHRoZSBtZWFudGltZSwge0BsaW5rICNDT05TVU1FUl9DT1VOVH0gY29uc3VtZXJzIHJldHJpZXZlIHNuYXBzaG90cyBmcm9tCisgICAgICogdGhlIGFnZ3JlZ2F0ZWQgd2luZG93IGluIG9yZGVyIHRvIGluY3JlYXNlIHRoZSBsZXZlbCBvZiBjb25jdXJyZW5jeS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gSWYgYW55IG9mIHRoZSB0aHJlYWQgd2FzIGludGVycnVwdGVkIGFuZCB0aGUgdGVzdCByZXN1bHQgd29uJ3QgYmUgcmVsaWFibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcmFsbGVsUHJvZHVjZXJzQW5kQ29uc3VtZXJzVGVzdGluZ0FnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZXhlY3V0ZUluUGFyYWxsZWwoY29uc3VtZXJFeGVjdXRvclNlcnZpY2UsIENPTlNVTUVSX0NPVU5ULCBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiQ29uc3VtZXIgc3RhcnRpbmcuIik7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghZG9TaHV0ZG93biAmJiAhVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlZFRpbWVSZXNlcnZvaXJzLmdldChUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludChhZ2dyZWdhdGVkVGltZVJlc2Vydm9pcnMuc2l6ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTbmFwc2hvdChTeXN0ZW0ubmFub1RpbWUoKSwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkNvbnN1bWVyIHRlcm1pbmF0aW5nLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZXhlY3V0ZUluUGFyYWxsZWwocHJvZHVjZXJFeGVjdXRvclNlcnZpY2UsIFBST0RVQ0VSX0NPVU5ULCBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiUHJvZHVjZXIgc3RhcnRpbmcuIik7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFkb1NodXRkb3duKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2YWx1ZSA9IGluY3JlbWVudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICB0aW1lMTB1c1Jlc2Vydm9pci51cGRhdGUoKGxvbmcpIHZhbHVlLCBTeXN0ZW0ubmFub1RpbWUoKSwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiUHJvZHVjZXIgdGVybWluYXRpbmcuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIFRocmVhZC5zbGVlcChURVNUX0RVUkFUSU9OX01JTExJUyk7CisgICAgICAgIExPR0dFUi5pbmZvKCJTaHV0dGluZyBkb3duLi4uIik7CisKKyAgICAgICAgZG9TaHV0ZG93biA9IHRydWU7CisgICAgICAgIHByb2R1Y2VyRXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisgICAgICAgIGNvbnN1bWVyRXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDb25zdW1lciB0YXNrcyBkaWRuJ3QgdGVybWluYXRlZCBwZWFjZWZ1bGx5LCBhYm9ydGluZyB0aGlzIHRlc3QuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJFeGVjdXRvclNlcnZpY2UuYXdhaXRUZXJtaW5hdGlvbihTSFVURE9XTl9USU1FT1VUX1NFQ09ORFMsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlByb2R1Y2VyIHRhc2tzIGRpZG4ndCB0ZXJtaW5hdGVkIHBlYWNlZnVsbHksIGFib3J0aW5nIHRoaXMgdGVzdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlckV4ZWN1dG9yU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKFNIVVRET1dOX1RJTUVPVVRfU0VDT05EUywgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgIGZpbmFsIGxvbmcgc25hcHNob3RUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIGZpbmFsIGxvbmcgc3VtID0gKGxvbmcpIGluY3JlbWVudGVyLmdldCgpICogKGluY3JlbWVudGVyLmdldCgpICsgMSkgLyAyOworCisgICAgICAgIExPR0dFUi5pbmZvKCJJbnRlZ2VyIHJlYWNoZWQ6ICIgKyBpbmNyZW1lbnRlci5nZXQoKSk7CisKKyAgICAgICAgY2hlY2tJbk5hbm9zKHRpbWUxRGF5QWdncmVnYXRlZFJlc2Vydm9pciwgc25hcHNob3RUaW1lLCBpbmNyZW1lbnRlci5nZXQoKSwgMSwgaW5jcmVtZW50ZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBzdW0gLyBpbmNyZW1lbnRlci5nZXQoKSwgc25hcHNob3RUaW1lIC0gc3RhcnRUaW1lKCkpOworICAgICAgICBjaGVja0luTmFub3ModGltZTEwRGF5c0FnZ3JlZ2F0ZWRSZXNlcnZvaXIsIHNuYXBzaG90VGltZSwgaW5jcmVtZW50ZXIuZ2V0KCksIDEsIGluY3JlbWVudGVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgc3VtIC8gaW5jcmVtZW50ZXIuZ2V0KCksIHNuYXBzaG90VGltZSAtIHN0YXJ0VGltZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUluUGFyYWxsZWwoZmluYWwgRXhlY3V0b3IgY29uc3VtZXJFeGVjdXRvclNlcnZpY2UsIGZpbmFsIGludCBjb3VudCwgZmluYWwgUnVubmFibGUgcnVubmFibGUpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb25zdW1lckV4ZWN1dG9yU2VydmljZS5leGVjdXRlKHJ1bm5hYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNodXRkb3duIHRoZSBwcm9kdWNlciBleGVjdXRvciBzZXJ2aWNlLgorICAgICAqLworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duUHJvZHVjZXJzKCkgeworICAgICAgICBwcm9kdWNlckV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNodXRkb3duIHRoZSBjb25zdW1lciBleGVjdXRvciBzZXJ2aWNlLgorICAgICAqLworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duQ29uc3VtZXJzKCkgeworICAgICAgICBjb25zdW1lckV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzbmFwc2hvdCBvZiBnaXZlbiByZXNlcnZvaXIgZXhoaWJpdHMgd2l0aCBleHBlY3RlZCBtZWFzdXJlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzZXJ2b2lyICAgICAgICBUaGUgcmVzZXJ2b2lyIHRvIGFzc2VydC4KKyAgICAgKiBAcGFyYW0gc25hcHNob3RUaW1lICAgICBUaGUgdGltZSBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBzbmFwc2hvdAorICAgICAqIEBwYXJhbSBleHBlY3RlZFNpemUgICAgIEV4cGVjdGVkIHNpemUgb2YgdGhlIHNuYXBzaG90CisgICAgICogQHBhcmFtIGV4cGVjdGVkTWluICAgICAgRXhwZWN0ZWQgbWluaW11bQorICAgICAqIEBwYXJhbSBleHBlY3RlZE1heCAgICAgIEV4cGVjdGVkIG1heGltdW0KKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRNZWFuICAgICBFeHBlY3RlZCBtZWFuCisgICAgICogQHBhcmFtIGV4cGVjdGVkSW50ZXJ2YWwgRXhwZWN0ZWQgaW50ZXJ2YWwKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrSW5OYW5vcyhmaW5hbCBUaW1lUmVzZXJ2b2lyIHJlc2Vydm9pciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHNuYXBzaG90VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGV4cGVjdGVkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGV4cGVjdGVkTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZXhwZWN0ZWRNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgZG91YmxlIGV4cGVjdGVkTWVhbiwgZmluYWwgbG9uZyBleHBlY3RlZEludGVydmFsKSB7CisgICAgICAgIGZpbmFsIFVuaWZvcm1UaW1lU25hcHNob3Qgc25hcHNob3QgPSByZXNlcnZvaXIuZ2V0U25hcHNob3Qoc25hcHNob3RUaW1lLCBUaW1lVW5pdC5OQU5PU0VDT05EUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUb3RhbCBjb3VudCBkb2VzIG5vdCBtYXRjaCEiLCBleHBlY3RlZFNpemUsIHNuYXBzaG90LnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWluIGV4ZWMgdGltZSBkb2VzIG5vdCBtYXRjaCEiLCBleHBlY3RlZE1pbiwgc25hcHNob3QuZ2V0TWluKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1heCBleGVjIHRpbWUgZG9lcyBub3QgbWF0Y2ghIiwgZXhwZWN0ZWRNYXgsIHNuYXBzaG90LmdldE1heCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBdmVyYWdlIGV4ZWMgdGltZSBkb2VzIG5vdCBtYXRjaCEiLCBleHBlY3RlZE1lYW4sIHNuYXBzaG90LmdldE1lYW4oKSwgREVMVEEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIGludGVydmFsIGRvZXMgbm90IG1hdGNoISIsIGV4cGVjdGVkSW50ZXJ2YWwsIHNuYXBzaG90LmdldFRpbWVJbnRlcnZhbChUaW1lVW5pdC5OQU5PU0VDT05EUykpOworICAgIH0KK30K